Cover grid: Check for cover size change due to screen scale change on every paint event and invalidate cache if there is a change. Fixes #1723972 [Small covers in Calibre](https://bugs.launchpad.net/calibre/+bug/1723972)

This commit is contained in:
Kovid Goyal 2019-04-18 21:47:22 +05:30
parent 9ae7a26cb0
commit 8b75374b4b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 26 additions and 7 deletions

View File

@ -256,9 +256,13 @@ class ThumbnailCache(object):
self.group_id = group_id self.group_id = group_id
def set_thumbnail_size(self, width, height): def set_thumbnail_size(self, width, height):
new_size = (width, height)
with self.lock: with self.lock:
self.thumbnail_size = (width, height) if new_size != self.thumbnail_size:
self.size_changed = True self.thumbnail_size = new_size
self.size_changed = True
return True
return False
def insert(self, book_id, timestamp, data): def insert(self, book_id, timestamp, data):
if self.max_size < len(data): if self.max_size < len(data):

View File

@ -826,14 +826,17 @@ class GridView(QListView):
self.delegate.calculate_spacing() self.delegate.calculate_spacing()
self.setSpacing(self.delegate.spacing) self.setSpacing(self.delegate.spacing)
self.set_color() self.set_color()
if size_changed: self.set_thumbnail_cache_image_size()
dpr = self.device_pixel_ratio
self.thumbnail_cache.set_thumbnail_size(int(dpr * self.delegate.cover_size.width()), int(dpr*self.delegate.cover_size.height()))
cs = gprefs['cover_grid_disk_cache_size'] cs = gprefs['cover_grid_disk_cache_size']
if (cs*(1024**2)) != self.thumbnail_cache.max_size: if (cs*(1024**2)) != self.thumbnail_cache.max_size:
self.thumbnail_cache.set_size(cs) self.thumbnail_cache.set_size(cs)
self.update_memory_cover_cache_size() self.update_memory_cover_cache_size()
def set_thumbnail_cache_image_size(self):
dpr = self.device_pixel_ratio
self.thumbnail_cache.set_thumbnail_size(
int(dpr * self.delegate.cover_size.width()), int(dpr*self.delegate.cover_size.height()))
def resizeEvent(self, ev): def resizeEvent(self, ev):
self._ncols = None self._ncols = None
self.resize_timer.start() self.resize_timer.start()
@ -878,6 +881,9 @@ class GridView(QListView):
def render_cover(self, book_id): def render_cover(self, book_id):
if self.ignore_render_requests.is_set(): if self.ignore_render_requests.is_set():
return return
dpr = self.device_pixel_ratio
page_width = int(dpr * self.delegate.cover_size.width())
page_height = int(dpr * self.delegate.cover_size.height())
tcdata, timestamp = self.thumbnail_cache[book_id] tcdata, timestamp = self.thumbnail_cache[book_id]
use_cache = False use_cache = False
if timestamp is None: if timestamp is None:
@ -893,7 +899,6 @@ class GridView(QListView):
if has_cover: if has_cover:
p = QImage() p = QImage()
p.loadFromData(cdata, CACHE_FORMAT if cdata is tcdata else 'JPEG') p.loadFromData(cdata, CACHE_FORMAT if cdata is tcdata else 'JPEG')
dpr = self.device_pixel_ratio
p.setDevicePixelRatio(dpr) p.setDevicePixelRatio(dpr)
if p.isNull() and cdata is tcdata: if p.isNull() and cdata is tcdata:
# Invalid image in cache # Invalid image in cache
@ -905,7 +910,7 @@ class GridView(QListView):
if cdata is not None: if cdata is not None:
width, height = p.width(), p.height() width, height = p.width(), p.height()
scaled, nwidth, nheight = fit_image( scaled, nwidth, nheight = fit_image(
width, height, int(dpr * self.delegate.cover_size.width()), int(dpr * self.delegate.cover_size.height())) width, height, page_width, page_height)
if scaled: if scaled:
if self.ignore_render_requests.is_set(): if self.ignore_render_requests.is_set():
return return
@ -1147,4 +1152,14 @@ class GridView(QListView):
if abs(dy) > 0: if abs(dy) > 0:
b.setValue(b.value() - dy) b.setValue(b.value() - dy)
def paintEvent(self, ev):
dpr = self.device_pixel_ratio
page_width = int(dpr * self.delegate.cover_size.width())
page_height = int(dpr * self.delegate.cover_size.height())
size_changed = self.thumbnail_cache.set_thumbnail_size(page_width, page_height)
if size_changed:
self.delegate.cover_cache.clear()
return super(GridView, self).paintEvent(ev)
# }}} # }}}