%PDF- %PDF-
Direktori : /usr/lib/calibre/calibre/gui2/convert/ |
Current File : //usr/lib/calibre/calibre/gui2/convert/look_and_feel.py |
#!/usr/bin/env python3 __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' import json from qt.core import Qt, QDialog from calibre.gui2.convert.look_and_feel_ui import Ui_Form from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS from polyglot.builtins import iteritems class LookAndFeelWidget(Widget, Ui_Form): TITLE = _('Look & feel') ICON = I('lookfeel.png') HELP = _('Control the look and feel of the output.') COMMIT_NAME = 'look_and_feel' FILTER_CSS = { 'fonts': {'font-family'}, 'margins': {'margin', 'margin-left', 'margin-right', 'margin-top', 'margin-bottom'}, 'padding': {'padding', 'padding-left', 'padding-right', 'padding-top', 'padding-bottom'}, 'floats': {'float'}, 'colors': {'color', 'background', 'background-color'}, } def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, OPTIONS['pipe']['look_and_feel']) for val, text in [ ('original', _('Original')), ('left', _('Left align')), ('justify', _('Justify text')) ]: self.opt_change_justification.addItem(text, (val)) self.db, self.book_id = db, book_id self.initialize_options(get_option, get_help, db, book_id) self.opt_disable_font_rescaling.toggle() self.opt_disable_font_rescaling.toggle() self.button_font_key.clicked.connect(self.font_key_wizard) self.opt_remove_paragraph_spacing.toggle() self.opt_remove_paragraph_spacing.toggle() connect_lambda(self.opt_smarten_punctuation.stateChanged, self, lambda self, state: state != Qt.CheckState.Unchecked and self.opt_unsmarten_punctuation.setCheckState(Qt.CheckState.Unchecked)) connect_lambda(self.opt_unsmarten_punctuation.stateChanged, self, lambda self, state: state != Qt.CheckState.Unchecked and self.opt_smarten_punctuation.setCheckState(Qt.CheckState.Unchecked)) def get_value_handler(self, g): if g is self.opt_change_justification: ans = str(g.itemData(g.currentIndex()) or '') return ans if g is self.opt_filter_css: ans = set() for key, item in iteritems(self.FILTER_CSS): w = getattr(self, 'filter_css_%s'%key) if w.isChecked(): ans = ans.union(item) ans = ans.union({x.strip().lower() for x in str(self.filter_css_others.text()).split(',')}) return ','.join(ans) if ans else None if g is self.opt_font_size_mapping: val = str(g.text()).strip() val = [x.strip() for x in val.split(',' if ',' in val else ' ') if x.strip()] return ', '.join(val) or None if g is self.opt_transform_css_rules or g is self.opt_transform_html_rules: return json.dumps(g.rules) return Widget.get_value_handler(self, g) def set_value_handler(self, g, val): if g is self.opt_change_justification: for i in range(g.count()): c = str(g.itemData(i) or '') if val == c: g.setCurrentIndex(i) break return True if g is self.opt_filter_css: if not val: val = '' items = frozenset(x.strip().lower() for x in val.split(',')) for key, vals in iteritems(self.FILTER_CSS): w = getattr(self, 'filter_css_%s'%key) if not vals - items: items = items - vals w.setChecked(True) else: w.setChecked(False) self.filter_css_others.setText(', '.join(items)) return True if g is self.opt_transform_css_rules or g is self.opt_transform_html_rules: g.rules = json.loads(val) if val else [] return True def connect_gui_obj_handler(self, gui_obj, slot): if gui_obj is self.opt_filter_css: for key in self.FILTER_CSS: w = getattr(self, 'filter_css_%s'%key) w.stateChanged.connect(slot) self.filter_css_others.textChanged.connect(slot) return if gui_obj is self.opt_transform_css_rules or gui_obj is self.opt_transform_html_rules: gui_obj.changed.connect(slot) return raise NotImplementedError() def font_key_wizard(self): from calibre.gui2.convert.font_key import FontKeyChooser d = FontKeyChooser(self, self.opt_base_font_size.value(), str(self.opt_font_size_mapping.text()).strip()) if d.exec() == QDialog.DialogCode.Accepted: self.opt_font_size_mapping.setText(', '.join(['%.1f'%x for x in d.fsizes])) self.opt_base_font_size.setValue(d.dbase)