def __init__(self, val, label=None, tooltip=None): super().__init__() self.l = l = QGridLayout(self) self.setLayout(l) col = 0 if label is not None: l.addWidget(QLabel(label), 0, col, 1, 1) col += 1 self.t = t = TemplateLineEditor(self) t.setText(val or '') t.setCursorPosition(0) self.setMinimumWidth(300) l.addWidget(t, 0, col, 1, 1) col += 1 b = self.b = QPushButton(_('&Template editor')) l.addWidget(b, 0, col, 1, 1) b.clicked.connect(self.edit_template) self.setToolTip(wrap_msg(tooltip))
def setup_ui(self): # {{{ self.setWindowModality(Qt.WindowModality.ApplicationModal) self.setWindowIcon(QIcon(I('column.png'))) self.vl = l = QVBoxLayout(self) self.heading_label = la = QLabel('') l.addWidget(la) self.shortcuts = s = QLabel('') s.setWordWrap(True) s.linkActivated.connect(self.shortcut_activated) text = '<p>'+_('Quick create:') for col, name in [('isbn', _('ISBN')), ('formats', _('Formats')), ('yesno', _('Yes/No')), ('tags', _('Tags')), ('series', ngettext('Series', 'Series', 1)), ('rating', _('Rating')), ('people', _("Names")), ('text', _('Short text'))]: text += ' <a href="col:%s">%s</a>,'%(col, name) text = text[:-1] s.setText(text) l.addWidget(s) self.g = g = QGridLayout() l.addLayout(g) l.addStretch(10) self.button_box = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel, self) bb.accepted.connect(self.accept), bb.rejected.connect(self.reject) l.addWidget(bb) def add_row(text, widget): if text is None: f = g.addWidget if isinstance(widget, QWidget) else g.addLayout f(widget, g.rowCount(), 0, 1, -1) return row = g.rowCount() la = QLabel(text) g.addWidget(la, row, 0, 1, 1) if isinstance(widget, QWidget): la.setBuddy(widget) g.addWidget(widget, row, 1, 1, 1) else: widget.setContentsMargins(0, 0, 0, 0) g.addLayout(widget, row, 1, 1, 1) for i in range(widget.count()): w = widget.itemAt(i).widget() if isinstance(w, QWidget): la.setBuddy(w) break return la # Lookup name self.column_name_box = cnb = QLineEdit(self) cnb.setToolTip(_("Used for searching the column. Must contain only digits and lower case letters.")) add_row(_("&Lookup name:"), cnb) # Heading self.column_heading_box = chb = QLineEdit(self) chb.setToolTip(_("Column heading in the library view and category name in the Tag browser")) add_row(_("Column &heading:"), chb) # Column Type h = QHBoxLayout() self.column_type_box = ctb = QComboBox(self) ctb.setMinimumWidth(70) ctb.setToolTip(_("What kind of information will be kept in the column.")) h.addWidget(ctb) self.use_decorations = ud = QCheckBox(_("Show &checkmarks"), self) ud.setToolTip(_("Show check marks in the GUI. Values of 'yes', 'checked', and 'true'\n" "will show a green check. Values of 'no', 'unchecked', and 'false' will show a red X.\n" "Everything else will show nothing.")) h.addWidget(ud) self.is_names = ins = QCheckBox(_("Contains names"), self) ins.setToolTip(_("Check this box if this column contains names, like the authors column.")) h.addWidget(ins) add_row(_("&Column type:"), h) # Description self.description_box = d = QLineEdit(self) d.setToolTip(_("Optional text describing what this column is for")) add_row(_("D&escription:"), d) # Date/number formatting h = QHBoxLayout() self.format_box = fb = QLineEdit(self) h.addWidget(fb) self.format_default_label = la = QLabel('') la.setOpenExternalLinks(True), la.setWordWrap(True) h.addWidget(la) self.format_label = add_row('', h) # Template self.composite_box = cb = TemplateLineEditor(self) self.composite_default_label = cdl = QLabel(_("Default: (nothing)")) cb.setToolTip(_("Field template. Uses the same syntax as save templates.")) cdl.setToolTip(_("Similar to save templates. For example, %s") % "{title} {isbn}") h = QHBoxLayout() h.addWidget(cb), h.addWidget(cdl) self.composite_label = add_row(_("&Template:"), h) # Comments properties self.comments_heading_position = ct = QComboBox(self) for k, text in ( ('hide', _('No heading')), ('above', _('Show heading above the text')), ('side', _('Show heading to the side of the text')) ): ct.addItem(text, k) ct.setToolTip(_('Choose whether or not the column heading is shown in the Book\n' 'details panel and, if shown, where')) self.comments_heading_position_label = add_row(_('Column heading:'), ct) self.comments_type = ct = QComboBox(self) for k, text in ( ('html', 'HTML'), ('short-text', _('Short text, like a title')), ('long-text', _('Plain text')), ('markdown', _('Plain text formatted using markdown')) ): ct.addItem(text, k) ct.setToolTip(_('Choose how the data in this column is interpreted.\n' 'This controls how the data is displayed in the Book details panel\n' 'and how it is edited.')) self.comments_type_label = add_row(_('Interpret this column as:') + ' ', ct) # Values for enum type self.enum_box = eb = QLineEdit(self) eb.setToolTip(_( "A comma-separated list of permitted values. The empty value is always\n" "included, and is the default. For example, the list 'one,two,three' has\n" "four values, the first of them being the empty value.")) self.enum_default_label = add_row(_("&Values:"), eb) self.enum_colors = ec = QLineEdit(self) ec.setToolTip(_("A list of color names to use when displaying an item. The\n" "list must be empty or contain a color for each value.")) self.enum_colors_label = add_row(_('Colors:'), ec) # Rating allow half stars self.allow_half_stars = ahs = QCheckBox(_('Allow half stars')) ahs.setToolTip(_('Allow half star ratings, for example: ') + '★★★⯨') add_row(None, ahs) # Composite display properties l = QHBoxLayout() self.composite_sort_by_label = la = QLabel(_("&Sort/search column by")) self.composite_sort_by = csb = QComboBox(self) la.setBuddy(csb), csb.setToolTip(_("How this column should handled in the GUI when sorting and searching")) l.addWidget(la), l.addWidget(csb) self.composite_make_category = cmc = QCheckBox(_("Show in Tag browser")) cmc.setToolTip(_("If checked, this column will appear in the Tag browser as a category")) l.addWidget(cmc) self.composite_contains_html = cch = QCheckBox(_("Show as HTML in Book details")) cch.setToolTip('<p>' + _( 'If checked, this column will be displayed as HTML in ' 'Book details and the Content server. This can be used to ' 'construct links with the template language. For example, ' 'the template ' '<pre><big><b>{title}</b></big>' '{series:| [|}{series_index:| [|]]}</pre>' 'will create a field displaying the title in bold large ' 'characters, along with the series, for example <br>"<big><b>' 'An Oblique Approach</b></big> [Belisarius [1]]". The template ' '<pre><a href="https://www.beam-ebooks.de/ebook/{identifiers' ':select(beam)}">Beam book</a></pre> ' 'will generate a link to the book on the Beam e-books site.') + '</p>') l.addWidget(cch) add_row(None, l) # Default value self.default_value = dv = QLineEdit(self) dv.setToolTip('<p>' + _('Default value when a new book is added to the ' 'library. For Date columns enter the word "Now", or the date as ' 'yyyy-mm-dd. For Yes/No columns enter "Yes" or "No". For Text with ' 'a fixed set of values enter one of the permitted values. For ' 'Rating columns enter a number between 0 and 5.') + '</p>') self.default_value_label = add_row(_('Default value:'), dv) self.resize(self.sizeHint())
def initialize(self): ConfigWidgetBase.initialize(self) self.current_plugboards = copy.deepcopy( self.db.prefs.get('plugboards', {})) self.current_device = None self.current_format = None if self.gui.device_manager.connected_device is not None: self.device_label.setText( _('Device currently connected: ') + self.gui.device_manager.connected_device.__class__.__name__) else: self.device_label.setText(_('Device currently connected: None')) self.devices = ['', 'APPLE', 'FOLDER_DEVICE'] self.disabled_devices = [] self.device_to_formats_map = {} for device in device_plugins(): n = device_name_for_plugboards(device) self.device_to_formats_map[n] = set(device.settings().format_map) if getattr(device, 'CAN_DO_DEVICE_DB_PLUGBOARD', False): self.device_to_formats_map[n].add('device_db') if n not in self.devices: self.devices.append(n) for device in disabled_device_plugins(): n = device_name_for_plugboards(device) if n not in self.disabled_devices: self.disabled_devices.append(n) self.devices.sort(key=lambda x: x.lower()) self.devices.insert(1, plugboard_save_to_disk_value) self.devices.insert(1, plugboard_content_server_value) self.device_to_formats_map[plugboard_content_server_value] = \ plugboard_content_server_formats self.devices.insert(1, plugboard_email_value) self.device_to_formats_map[plugboard_email_value] = \ plugboard_email_formats self.devices.insert(1, plugboard_any_device_value) self.new_device.addItems(self.devices) self.formats = [''] self.format_to_writers_map = defaultdict(list) for w in metadata_writers(): for f in w.file_types: if f not in self.formats: self.formats.append(f) self.format_to_writers_map[f].append(w) self.formats.append('device_db') self.formats.sort() self.formats.insert(1, plugboard_any_format_value) self.new_format.addItems(self.formats) self.dest_fields = [ '', 'authors', 'author_sort', 'language', 'publisher', 'series', 'tags', 'title', 'title_sort', 'comments' ] self.source_widgets = [] self.dest_widgets = [] for i in range(0, len(self.dest_fields) - 1): w = TemplateLineEditor(self) self.source_widgets.append(w) self.fields_layout.addWidget(w, 5 + i, 0, 1, 1) w = QComboBox(self) self.dest_widgets.append(w) self.fields_layout.addWidget(w, 5 + i, 1, 1, 1) self.edit_device.currentIndexChanged[native_string_type].connect( self.edit_device_changed) self.edit_format.currentIndexChanged[native_string_type].connect( self.edit_format_changed) self.new_device.currentIndexChanged[native_string_type].connect( self.new_device_changed) self.new_format.currentIndexChanged[native_string_type].connect( self.new_format_changed) self.existing_plugboards.itemClicked.connect(self.existing_pb_clicked) self.ok_button.clicked.connect(self.ok_clicked) self.del_button.clicked.connect(self.del_clicked) self.refilling = False self.refill_all_boxes()