diff --git a/src/calibre/db/utils.py b/src/calibre/db/utils.py index 90c960fd68..403085d9b6 100644 --- a/src/calibre/db/utils.py +++ b/src/calibre/db/utils.py @@ -256,9 +256,13 @@ class ThumbnailCache(object): self.group_id = group_id def set_thumbnail_size(self, width, height): + new_size = (width, height) with self.lock: - self.thumbnail_size = (width, height) - self.size_changed = True + if new_size != self.thumbnail_size: + self.thumbnail_size = new_size + self.size_changed = True + return True + return False def insert(self, book_id, timestamp, data): if self.max_size < len(data): diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 01be8892dc..6095122287 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -826,14 +826,17 @@ class GridView(QListView): self.delegate.calculate_spacing() self.setSpacing(self.delegate.spacing) self.set_color() - if size_changed: - 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())) + self.set_thumbnail_cache_image_size() cs = gprefs['cover_grid_disk_cache_size'] if (cs*(1024**2)) != self.thumbnail_cache.max_size: self.thumbnail_cache.set_size(cs) 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): self._ncols = None self.resize_timer.start() @@ -878,6 +881,9 @@ class GridView(QListView): def render_cover(self, book_id): if self.ignore_render_requests.is_set(): 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] use_cache = False if timestamp is None: @@ -893,7 +899,6 @@ class GridView(QListView): if has_cover: p = QImage() p.loadFromData(cdata, CACHE_FORMAT if cdata is tcdata else 'JPEG') - dpr = self.device_pixel_ratio p.setDevicePixelRatio(dpr) if p.isNull() and cdata is tcdata: # Invalid image in cache @@ -905,7 +910,7 @@ class GridView(QListView): if cdata is not None: width, height = p.width(), p.height() 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 self.ignore_render_requests.is_set(): return @@ -1147,4 +1152,14 @@ class GridView(QListView): if abs(dy) > 0: 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) + # }}}