Skip to content

Commit

Permalink
Draw rounded corners for covers in most places. Preference controllin…
Browse files Browse the repository at this point in the history
…g it is moved to the main section of look & feel since it applies more universally
  • Loading branch information
kovidgoyal committed May 20, 2024
1 parent 600270a commit 02b0385
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 206 deletions.
18 changes: 17 additions & 1 deletion src/calibre/gui2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@
QLocale,
QNetworkProxyFactory,
QObject,
QPainterPath,
QPalette,
QRectF,
QResource,
QSettings,
QSocketNotifier,
Expand Down Expand Up @@ -426,7 +428,7 @@ def create_defs():
defs['cover_grid_disk_cache_size'] = 2500
defs['cover_grid_show_title'] = False
defs['cover_grid_texture'] = None
defs['cover_grid_corner_radius'] = 0
defs['cover_corner_radius'] = 0
defs['show_vl_tabs'] = False
defs['vl_tabs_closable'] = True
defs['show_highlight_toggle_button'] = False
Expand Down Expand Up @@ -1756,3 +1758,17 @@ def raise_without_focus(self: QWidget) -> None:

QWidget.raise_and_focus = raise_and_focus
QWidget.raise_without_focus = raise_without_focus


@contextmanager
def clip_border_radius(painter, rect):
painter.save()
r = gprefs['cover_corner_radius']
if r > 0:
pp = QPainterPath()
pp.addRoundedRect(QRectF(rect), r, r)
painter.setClipPath(pp)
try:
yield
finally:
painter.restore()
16 changes: 14 additions & 2 deletions src/calibre/gui2/book_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,18 @@
from calibre.ebooks.metadata.book.base import Metadata, field_metadata
from calibre.ebooks.metadata.book.render import mi_to_html
from calibre.ebooks.metadata.search_internet import all_author_searches, all_book_searches, name_for, url_for_author_search, url_for_book_search
from calibre.gui2 import NO_URL_FORMATTING, choose_save_file, config, default_author_link, gprefs, pixmap_to_data, question_dialog, rating_font, safe_open_url
from calibre.gui2 import (
NO_URL_FORMATTING,
choose_save_file,
clip_border_radius,
config,
default_author_link,
gprefs,
pixmap_to_data,
question_dialog,
rating_font,
safe_open_url,
)
from calibre.gui2.dialogs.confirm_delete import confirm
from calibre.gui2.dialogs.confirm_delete import confirm as confirm_delete
from calibre.gui2.dnd import dnd_get_files, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions
Expand Down Expand Up @@ -825,7 +836,8 @@ def paintEvent(self, event):
dpr = self.devicePixelRatio()
spmap = self.pixmap.scaled(target.size() * dpr, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)
spmap.setDevicePixelRatio(dpr)
p.drawPixmap(target, spmap)
with clip_border_radius(p, target):
p.drawPixmap(target, spmap)
if gprefs['bd_overlay_cover_size']:
sztgt = target.adjusted(0, 0, 0, -4)
f = p.font()
Expand Down
22 changes: 3 additions & 19 deletions src/calibre/gui2/library/alternate_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import os
import weakref
from collections import namedtuple
from contextlib import contextmanager
from functools import wraps
from io import BytesIO
from textwrap import wrap
Expand All @@ -37,13 +36,11 @@
QMimeData,
QModelIndex,
QPainter,
QPainterPath,
QPalette,
QPixmap,
QPoint,
QPropertyAnimation,
QRect,
QRectF,
QSize,
QStyledItemDelegate,
QStyleOptionViewItem,
Expand All @@ -64,7 +61,7 @@
from calibre import fit_image, human_readable, prepare_string_for_xml
from calibre.constants import DEBUG, config_dir, islinux
from calibre.ebooks.metadata import fmt_sidx, rating_to_stars
from calibre.gui2 import config, empty_index, gprefs, rating_font
from calibre.gui2 import clip_border_radius, config, empty_index, gprefs, rating_font
from calibre.gui2.dnd import path_from_qurl
from calibre.gui2.gestures import GestureManager
from calibre.gui2.library.caches import CoverCache, ThumbnailCache
Expand Down Expand Up @@ -565,7 +562,7 @@ def cached_emblem(self, cache, name, raw_icon=None):
return ans

def paint(self, painter, option, index):
with self.clip_border_radius(painter, option.rect):
with clip_border_radius(painter, option.rect):
QStyledItemDelegate.paint(self, painter, option, empty_index) # draw the hover and selection highlights
m = index.model()
db = m.db
Expand Down Expand Up @@ -662,21 +659,8 @@ def paint(self, painter, option, index):
finally:
painter.restore()

@contextmanager
def clip_border_radius(self, painter, rect):
painter.save()
r = gprefs['cover_grid_corner_radius']
if r > 0:
pp = QPainterPath()
pp.addRoundedRect(QRectF(rect), r, r)
painter.setClipPath(pp)
try:
yield
finally:
painter.restore()

def paint_cover(self, painter: QPainter, rect: QRect, pixmap: QPixmap):
with self.clip_border_radius(painter, rect):
with clip_border_radius(painter, rect):
painter.drawPixmap(rect, pixmap)

def paint_title(self, painter, rect, db, book_id):
Expand Down
2 changes: 1 addition & 1 deletion src/calibre/gui2/preferences/look_feel.py
Original file line number Diff line number Diff line change
Expand Up @@ -625,8 +625,8 @@ def genesis(self, gui):
r('tag_browser_allow_keyboard_focus', gprefs)
r('bd_show_cover', gprefs)
r('bd_overlay_cover_size', gprefs)
r('cover_corner_radius', gprefs)
r('cover_grid_width', gprefs)
r('cover_grid_corner_radius', gprefs)
r('cover_grid_height', gprefs)
r('cover_grid_cache_size_multiple', gprefs)
r('cover_grid_disk_cache_size', gprefs)
Expand Down
Loading

0 comments on commit 02b0385

Please sign in to comment.