From 4f68d2e7c5d87ed70f6f006cfdeca3a4057b9948 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 20 Jul 2022 08:22:47 +0530 Subject: [PATCH] Fix a regression in 6.0 that caused the default cover to be rendered small in some contexts --- src/calibre/gui2/__init__.py | 23 +++++++++++++--------- src/calibre/gui2/book_details.py | 2 +- src/calibre/gui2/convert/metadata.py | 4 ++-- src/calibre/gui2/library/models.py | 5 ++++- src/calibre/gui2/metadata/basic_widgets.py | 2 +- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 93ef7dae87..198e4cda4f 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -13,10 +13,10 @@ from functools import lru_cache from qt.core import ( QApplication, QBuffer, QByteArray, QColor, QDateTime, QDesktopServices, QDialog, QDialogButtonBox, QEvent, QFile, QFileDialog, QFileIconProvider, QFileInfo, - QFont, QFontDatabase, QFontInfo, QFontMetrics, QGuiApplication, QIcon, QIODevice, - QLocale, QNetworkProxyFactory, QObject, QPalette, QResource, QSettings, - QSocketNotifier, QStringListModel, Qt, QThread, QTimer, QTranslator, - QUrl, pyqtSignal, pyqtSlot + QFont, QFontDatabase, QFontInfo, QFontMetrics, QGuiApplication, QIcon, + QImageReader, QImageWriter, QIODevice, QLocale, QNetworkProxyFactory, QObject, + QPalette, QResource, QSettings, QSocketNotifier, QStringListModel, Qt, QThread, + QTimer, QTranslator, QUrl, pyqtSignal, pyqtSlot ) from threading import Lock, RLock @@ -201,7 +201,6 @@ class IconResourceManager: ans = self(name) ba = QByteArray() if ans.availableSizes(): - from qt.core import QImageWriter pmap = ans.pixmap(ans.availableSizes()[0]) buf = QBuffer(ba) buf.open(QIODevice.OpenModeFlag.WriteOnly) @@ -1247,13 +1246,19 @@ class Application(QApplication): load_builtin_fonts() @lru_cache(maxsize=256) - def cached_qimage(self, name): - return self.cached_qpixmap(name).toImage() + def cached_qimage(self, name, device_pixel_ratio=0): + return self.cached_qpixmap(name, device_pixel_ratio).toImage() @lru_cache(maxsize=256) - def cached_qpixmap(self, name): + def cached_qpixmap(self, name, device_pixel_ratio=0): + # get the actual size of the image since QIcon does not tell us this for + # icons loaded from a theme + path = I(name, allow_user_override=False) + r = QImageReader(path) ic = QIcon.ic(name) - return ic.pixmap((ic.availableSizes() or (256,))[0]) + if not device_pixel_ratio: + device_pixel_ratio = self.devicePixelRatio() + return ic.pixmap(r.size(), device_pixel_ratio) def stylesheet_for_line_edit(self, is_error=False): return 'QLineEdit { border: 2px solid %s; border-radius: 3px }' % ( diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 38883e65b1..bf95625fe9 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -530,7 +530,7 @@ class CoverView(QWidget): # {{{ QSizePolicy.Policy.Expanding if vertical else QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - self.default_pixmap = QApplication.instance().cached_qpixmap('default_cover.png') + self.default_pixmap = QApplication.instance().cached_qpixmap('default_cover.png', device_pixel_ratio=self.devicePixelRatio()) self.pixmap = self.default_pixmap self.pwidth = self.pheight = None self.data = {} diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index 71b82a14d6..8de7926d68 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -106,12 +106,12 @@ class MetadataWidget(Widget, Ui_Form): pm = QPixmap() pm.loadFromData(cover) if not pm.isNull(): - pm.setDevicePixelRatio(getattr(self, 'devicePixelRatioF', self.devicePixelRatio)()) + pm.setDevicePixelRatio(self.devicePixelRatio()) self.cover.setPixmap(pm) self.cover_data = cover self.set_cover_tooltip(pm) else: - pm = QApplication.instance().cached_qpixmap('default_cover.png') + pm = QApplication.instance().cached_qpixmap('default_cover.png', device_pixel_ratio=self.devicePixelRatio()) self.cover.setPixmap(pm) self.cover.setToolTip(_('This book has no cover')) for x in ('author', 'series', 'publisher'): diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index fe87a81ee1..086a009209 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -268,7 +268,10 @@ class BooksModel(QAbstractTableModel): # {{{ @property def default_image(self): - return QApplication.instance().cached_qimage('default_cover.png') + from calibre.gui2.ui import get_gui + gui = get_gui() + dpr = gui.devicePixelRatio() if gui else 0 + return QApplication.instance().cached_qimage('default_cover.png', device_pixel_ratio=dpr) def _clear_caches(self): self.color_cache = defaultdict(dict) diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 57ac27b21b..fddde502da 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -1285,7 +1285,7 @@ class Cover(ImageView): # {{{ if cdata: pm.loadFromData(cdata) if pm.isNull(): - pm = QApplication.instance().cached_qpixmap('default_cover.png') + pm = QApplication.instance().cached_qpixmap('default_cover.png', device_pixel_ratio=self.devicePixelRatio()) else: self._cdata = cdata pm.setDevicePixelRatio(getattr(self, 'devicePixelRatioF', self.devicePixelRatio)())