diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 33e75107eb..c3fb976bcd 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -530,35 +530,31 @@ def create_defs(): 'light': {}, 'dark': {}, } - # Migrate beta bookshelf_thumbnail - if isinstance(btv := gprefs.get('bookshelf_thumbnail'), bool): - gprefs['bookshelf_thumbnail'] = 'full' if btv else 'none' + with gprefs: + # Migrate beta bookshelf_thumbnail + if isinstance(btv := gprefs.get('bookshelf_thumbnail'), bool): + gprefs['bookshelf_thumbnail'] = 'full' if btv else 'none' - def migrate_tweak(tweak_name, pref_name): - # If the tweak has been changed then leave the tweak in the file so - # that the user can bounce between versions with and without the - # migration. For versions before the migration the tweak wins. For - # versions after the migration any changes win. - v = tweaks.get(tweak_name, None) - migrated_tweak_name = pref_name + '_tweak_migrated' - m = gprefs.get(migrated_tweak_name, None) - if m is None and v is not None: - gprefs[pref_name] = v - gprefs[migrated_tweak_name] = True - migrate_tweak('metadata_edit_elide_labels', 'edit_metadata_elide_labels') - migrate_tweak('metadata_edit_elision_point', 'edit_metadata_elision_point') - migrate_tweak('metadata_edit_bulk_cc_label_length', 'edit_metadata_bulk_cc_label_length') - migrate_tweak('metadata_edit_single_cc_label_length', 'edit_metadata_single_cc_label_length') - migrate_tweak('metadata_single_use_2_cols_for_custom_fields', 'edit_metadata_single_use_2_cols_for_custom_fields') + def migrate_tweak(tweak_name, pref_name): + # If the tweak has been changed then leave the tweak in the file so + # that the user can bounce between versions with and without the + # migration. For versions before the migration the tweak wins. For + # versions after the migration any changes win. + v = tweaks.get(tweak_name, None) + migrated_tweak_name = pref_name + '_tweak_migrated' + m = gprefs.get(migrated_tweak_name, None) + if m is None and v is not None: + gprefs[pref_name] = v + gprefs[migrated_tweak_name] = True + migrate_tweak('metadata_edit_elide_labels', 'edit_metadata_elide_labels') + migrate_tweak('metadata_edit_elision_point', 'edit_metadata_elision_point') + migrate_tweak('metadata_edit_bulk_cc_label_length', 'edit_metadata_bulk_cc_label_length') + migrate_tweak('metadata_edit_single_cc_label_length', 'edit_metadata_single_cc_label_length') + migrate_tweak('metadata_single_use_2_cols_for_custom_fields', 'edit_metadata_single_use_2_cols_for_custom_fields') - # Migrate show_emblems and draw_emblems_on_cover to emblem_style - show_emblems = gprefs.pop('show_emblems', None) - draw_emblems_on_cover = gprefs.pop('draw_emblems_on_cover', None) - if show_emblems is not None or draw_emblems_on_cover is not None: - if show_emblems: - gprefs['emblem_style'] = 'emboss' if draw_emblems_on_cover else 'gutter' - else: - gprefs['emblem_style'] = 'none' + if gprefs.get('show_emblems'): + gprefs['emblem_style'] = 'gutter' + gprefs.pop('show_emblems', None) create_defs() diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 0a04c96491..f0da35f4f7 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -732,7 +732,6 @@ class CoverDelegate(QStyledItemDelegate): painter.save() right_adjust = 0 - emblem_rect = None try: rect = option.rect rect.adjust(self.MARGIN, self.MARGIN, -self.MARGIN, -self.MARGIN) @@ -750,7 +749,6 @@ class CoverDelegate(QStyledItemDelegate): painter.drawText(rect, Qt.AlignmentFlag.AlignCenter|Qt.TextFlag.TextWordWrap, f'{title}\n\n{authors}') if self.title_height != 0: self.paint_title(painter, trect, db, book_id) - emblem_rect = QRect(rect) else: if self.animating is not None and self.animating.row() == index.row(): cover = cover.scaled(cover.size() * self._animated_size) @@ -766,9 +764,8 @@ class CoverDelegate(QStyledItemDelegate): if self.flush_bottom: trect.setTop(rect.bottom() + 5) self.paint_title(painter, trect, db, book_id, align_top=self.flush_bottom) - emblem_rect = QRect(rect) if self.original_emblem_style == 'emboss' and emblems: - self.paint_emblems_on_cover(painter, emblem_rect, emblems) + self.paint_emblems_on_cover(painter, rect, emblems) return if self.emblem_size > 0: # We don't draw embossed emblems as the ondevice/marked emblems are drawn in the gutter @@ -838,10 +835,8 @@ class CoverDelegate(QStyledItemDelegate): painter.restore() def paint_emblems_on_cover(self, painter, rect, emblems): - esz = self.emblem_size - if not esz: + if not (esz := self.emblem_size): return - margin = self.MARGIN r = gprefs['cover_corner_radius'] if r > 0: if gprefs['cover_corner_radius_unit'] == '%': @@ -850,23 +845,29 @@ class CoverDelegate(QStyledItemDelegate): corner_inset = int(r) else: corner_inset = 0 - available_height = rect.height() - corner_inset - max_per_edge = max(1, available_height // (esz + margin)) - with painter: + margin = self.MARGIN + rect = rect.adjusted(corner_inset, corner_inset, -corner_inset, -corner_inset - margin) + available_height = rect.height() + sz_with_margin = esz + margin + max_per_edge = max(1, available_height // sz_with_margin) + painter.save() + try: painter.setClipRect(rect) for i, emblem in enumerate(emblems): if i < max_per_edge: - x = rect.left() + margin - y = rect.top() + corner_inset + i * (esz + margin) + x = rect.left() + y = rect.top() + i * sz_with_margin else: j = i - max_per_edge if j >= max_per_edge: break - x = rect.right() - esz - margin - y = rect.top() + corner_inset + j * (esz + margin) + x = rect.right() - esz + y = rect.top() + j * sz_with_margin ew = int(emblem.width() / emblem.devicePixelRatio()) eh = int(emblem.height() / emblem.devicePixelRatio()) painter.drawPixmap(QRect(x, y, ew, eh), emblem) + finally: + painter.restore() def paint_embossed_emblem(self, pixmap, painter, orect, right_adjust, left=True): drect = QRect(orect) diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index 9be1ccf852..cd9177f33b 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -1180,16 +1180,6 @@ class EditRules(QWidget): # {{{ '
You can change an existing rule by double clicking it.') self.l1.setText('
'+ text) match pref_name: - case 'cover_grid_icon_rules': - self.enabled.setVisible(True) - self.enabled.setChecked(gprefs['show_emblems']) - self.enabled.setText(_('Show &emblems next to the covers')) - self.enabled.stateChanged.connect(self.enabled_toggled) - self.enabled.setToolTip(_( - 'If checked, you can tell calibre to display icons of your choosing' - ' next to the covers shown in the Cover grid, controlled by the' - ' metadata of the book.')) - self.enabled_toggled() case 'bookshelf_icon_rules': self.choices_label.setVisible(True) self.choices.setVisible(True) diff --git a/src/calibre/gui2/preferences/look_feel_tabs/cover_grid.py b/src/calibre/gui2/preferences/look_feel_tabs/cover_grid.py index 57bb558bfc..d70858efd3 100644 --- a/src/calibre/gui2/preferences/look_feel_tabs/cover_grid.py +++ b/src/calibre/gui2/preferences/look_feel_tabs/cover_grid.py @@ -39,9 +39,10 @@ class CoverGridTab(QTabWidget, LazyConfigWidgetBase, Ui_cover_grid_tab): r('emblem_position', gprefs, choices=[ (_('Left'), 'left'), (_('Top'), 'top'), (_('Right'), 'right'), (_('Bottom'), 'bottom')]) r('emblem_style', gprefs, choices=[ - (_('Do not show emblems'), 'none'), - (_('Show in a gutter next to the cover'), 'gutter'), - (_('Draw on the cover'), 'emboss')]) + (_('No emblems'), 'none'), + (_('Show next to cover'), 'gutter'), + (_('Show on top of cover'), 'emboss') + ]) fm = db.field_metadata choices = sorted((('{} ({})'.format(fm[k]['name'], k), k) for k in fm.displayable_field_keys() if fm[k]['name']),