%PDF- %PDF-
Direktori : /lib/calibre/calibre/gui2/preferences/ |
Current File : //lib/calibre/calibre/gui2/preferences/conversion.py |
#!/usr/bin/env python3 __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' import importlib from qt.core import ( QIcon, Qt, QStringListModel, QListView, QSizePolicy, QHBoxLayout, QSize, QStackedWidget, pyqtSignal, QScrollArea) from calibre.gui2.preferences import ConfigWidgetBase, test_widget, AbortCommit from calibre.ebooks.conversion.plumber import Plumber from calibre.utils.logging import Log from calibre.gui2.convert.look_and_feel import LookAndFeelWidget from calibre.gui2.convert.heuristics import HeuristicsWidget from calibre.gui2.convert.search_and_replace import SearchAndReplaceWidget from calibre.gui2.convert.page_setup import PageSetupWidget from calibre.gui2.convert.structure_detection import StructureDetectionWidget from calibre.gui2.convert.toc import TOCWidget from calibre.customize.ui import input_format_plugins, output_format_plugins from calibre.gui2.convert import config_widget_for_input_plugin class Model(QStringListModel): def __init__(self, widgets): QStringListModel.__init__(self) self.widgets = widgets self.setStringList([w.TITLE for w in widgets]) def data(self, index, role): if role == Qt.ItemDataRole.DecorationRole: w = self.widgets[index.row()] if w.ICON: return (QIcon(w.ICON)) return QStringListModel.data(self, index, role) class ListView(QListView): current_changed = pyqtSignal(object, object) def __init__(self, parent=None): QListView.__init__(self, parent) self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding) f = self.font() f.setBold(True) self.setFont(f) self.setIconSize(QSize(48, 48)) self.setFlow(QListView.Flow.TopToBottom) self.setSpacing(10) def currentChanged(self, cur, prev): QListView.currentChanged(self, cur, prev) self.current_changed.emit(cur, prev) class Base(ConfigWidgetBase): restore_defaults_desc = _('Restore settings to default values. ' 'Only settings for the currently selected section ' 'are restored.') def setupUi(self, x): self.resize(720, 603) self.l = l = QHBoxLayout(self) self.list = lv = ListView(self) l.addWidget(lv) self.stack = s = QStackedWidget(self) l.addWidget(s, stretch=10) def genesis(self, gui): log = Log() log.outputs = [] self.plumber = Plumber('dummy.epub', 'dummy.epub', log, dummy=True, merge_plugin_recs=False) def widget_factory(cls): plugin = getattr(cls, 'conv_plugin', None) if plugin is None: hfunc = self.plumber.get_option_help else: options = plugin.options.union(plugin.common_options) def hfunc(name): for rec in options: if rec.option == name: ans = getattr(rec, 'help', None) if ans is not None: return ans.replace('%default', str(rec.recommended_value)) return cls(self, self.plumber.get_option_by_name, hfunc, None, None) self.load_conversion_widgets() widgets = list(map(widget_factory, self.conversion_widgets)) self.model = Model(widgets) self.list.setModel(self.model) for w in widgets: w.changed_signal.connect(self.changed_signal) w.layout().setContentsMargins(6, 6, 6, 6) sa = QScrollArea(self) sa.setWidget(w) sa.setWidgetResizable(True) self.stack.addWidget(sa) if isinstance(w, TOCWidget): w.manually_fine_tune_toc.hide() self.list.current_changed.connect(self.category_current_changed) self.list.setCurrentIndex(self.model.index(0)) def initialize(self): ConfigWidgetBase.initialize(self) def restore_defaults(self): ConfigWidgetBase.restore_defaults(self) self.stack.currentWidget().widget().restore_defaults(self.plumber.get_option_by_name) self.changed_signal.emit() def commit(self): for widget in self.model.widgets: if not widget.pre_commit_check(): raise AbortCommit('abort') widget.commit(save_defaults=True) return ConfigWidgetBase.commit(self) def category_current_changed(self, n, p): self.stack.setCurrentIndex(n.row()) class CommonOptions(Base): def load_conversion_widgets(self): self.conversion_widgets = [LookAndFeelWidget, HeuristicsWidget, PageSetupWidget, StructureDetectionWidget, TOCWidget, SearchAndReplaceWidget,] class InputOptions(Base): def load_conversion_widgets(self): self.conversion_widgets = [] for plugin in input_format_plugins(): pw = config_widget_for_input_plugin(plugin) if pw is not None: pw.conv_plugin = plugin self.conversion_widgets.append(pw) class OutputOptions(Base): def load_conversion_widgets(self): self.conversion_widgets = [] for plugin in output_format_plugins(): name = plugin.name.lower().replace(' ', '_') try: output_widget = importlib.import_module( 'calibre.gui2.convert.'+name) pw = output_widget.PluginWidget pw.conv_plugin = plugin self.conversion_widgets.append(pw) except ImportError: continue if __name__ == '__main__': from calibre.gui2 import Application app = Application([]) # test_widget('Conversion', 'Input Options') test_widget('Conversion', 'Common Options') # test_widget('Conversion', 'Output Options')