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