Cover Grid: Dynamically adjust the size of the in memory cover thumbnail cache based on the window size to ensure flicker free rendering even on very large screens. Fixes #1367211 [cover grid continuously redraws covers](https://bugs.launchpad.net/calibre/+bug/1367211)

This commit is contained in:
Kovid Goyal 2014-09-10 09:54:22 +05:30
parent 1c65579a5d
commit c274d3928e
4 changed files with 30 additions and 8 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -582,10 +582,10 @@ A value of zero means calculate automatically.</string>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Number of covers to cache in &amp;memory (keep this small):</string>
<string>Number of screenfulls of covers to cache in &amp;memory (keep this small):</string>
</property>
<property name="buddy">
<cstring>opt_cover_grid_cache_size</cstring>
<cstring>opt_cover_grid_cache_size_multiple</cstring>
</property>
</widget>
</item>
@ -604,12 +604,15 @@ A value of zero means calculate automatically.</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QSpinBox" name="opt_cover_grid_cache_size">
<widget class="QSpinBox" name="opt_cover_grid_cache_size_multiple">
<property name="toolTip">
<string>The maximum number of covers to keep in memory. Increasing this will make rendering faster, at the cost of more memory usage.</string>
<string>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.</string>
</property>
<property name="minimum">
<number>2</number>
</property>
<property name="maximum">
<number>50000</number>
<number>100</number>
</property>
</widget>
</item>