diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 434754700c..39eaeae869 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -117,7 +117,7 @@ defs['cover_grid_width'] = 0 defs['cover_grid_height'] = 0 defs['cover_grid_spacing'] = 0 defs['cover_grid_color'] = (80, 80, 80) -defs['cover_grid_cache_size'] = 100 +defs['cover_grid_cache_size_multiple'] = 5 defs['cover_grid_disk_cache_size'] = 2500 defs['cover_grid_show_title'] = False defs['cover_grid_texture'] = None diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 1d9c72b5db..890d435b55 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -635,6 +635,9 @@ class GridView(QListView): self.update_timer.setInterval(200) self.update_timer.timeout.connect(self.update_viewport) self.update_timer.setSingleShot(True) + self.resize_timer = t = QTimer(self) + t.setInterval(200), t.setSingleShot(True) + t.timeout.connect(self.update_memory_cover_cache_size) @property def first_visible_row(self): @@ -719,14 +722,30 @@ class GridView(QListView): self.delegate.calculate_spacing() self.setSpacing(self.delegate.spacing) self.set_color() - self.delegate.cover_cache.set_limit(gprefs['cover_grid_cache_size']) if size_changed: self.thumbnail_cache.set_thumbnail_size(self.delegate.cover_size.width(), self.delegate.cover_size.height()) 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 resizeEvent(self, ev): + self.resize_timer.start() + return QListView.resizeEvent(self, ev) + + def update_memory_cover_cache_size(self): + try: + sz = self.delegate.item_size + except AttributeError: + return + rows, cols = self.width() // sz.width(), self.height() // sz.height() + num = (rows + 1) * (cols + 1) + limit = max(100, num * max(2, gprefs['cover_grid_cache_size_multiple'])) + if limit != self.delegate.cover_cache.limit: + self.delegate.cover_cache.set_limit(limit) def shown(self): + self.update_memory_cover_cache_size() if self.render_thread is None: self.thumbnail_cache.set_database(self.gui.current_db) self.render_thread = Thread(target=self.render_covers) diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 1e7977a4fa..356ca4907e 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -146,7 +146,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r('bd_overlay_cover_size', gprefs) r('cover_grid_width', gprefs) r('cover_grid_height', gprefs) - r('cover_grid_cache_size', gprefs) + r('cover_grid_cache_size_multiple', gprefs) r('cover_grid_disk_cache_size', gprefs) r('cover_grid_spacing', gprefs) r('cover_grid_show_title', gprefs) diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui index da1b9cabe0..f424595220 100644 --- a/src/calibre/gui2/preferences/look_feel.ui +++ b/src/calibre/gui2/preferences/look_feel.ui @@ -582,10 +582,10 @@ A value of zero means calculate automatically. - Number of covers to cache in &memory (keep this small): + Number of screenfulls of covers to cache in &memory (keep this small): - opt_cover_grid_cache_size + opt_cover_grid_cache_size_multiple @@ -604,12 +604,15 @@ A value of zero means calculate automatically. - + - The maximum number of covers to keep in memory. Increasing this will make rendering faster, at the cost of more memory usage. + The maximum number of screenfulls of thumbnails to keep in memory. Increasing this will make rendering faster, at the cost of more memory usage. Note that regardless of this setting, a minimum of one hudred thumbnails are always kept in memory, to ensure flicker free rendering. + + + 2 - 50000 + 100