From 798eb321d8a9b20e4c3ea145b0c4b288cdcb368f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 7 Aug 2013 09:54:25 +0530 Subject: [PATCH] Grid View: Delay rendering on wheel events Ignore continuous wheel events, only rendering after the "last" wheel event, where two wheel event are continuous if they occur within 200 msecs of each other. --- src/calibre/gui2/library/alternate_views.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 193afb5c95..656d8baaff 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -15,7 +15,7 @@ from functools import wraps, partial from PyQt4.Qt import ( - QListView, QSize, QStyledItemDelegate, QModelIndex, Qt, QImage, pyqtSignal, + QListView, QSize, QStyledItemDelegate, QModelIndex, Qt, QImage, pyqtSignal, QTimer, QPalette, QColor, QItemSelection, QPixmap, QMenu, QApplication, QMimeData, QIcon, QUrl, QDrag, QPoint, QPainter, QRect, pyqtProperty, QPropertyAnimation, QEasingCurve) @@ -470,6 +470,10 @@ def __init__(self, parent): self.context_menu = None self.verticalScrollBar().sliderPressed.connect(self.slider_pressed) self.verticalScrollBar().sliderReleased.connect(self.slider_released) + self.update_timer = QTimer(self) + self.update_timer.setInterval(200) + self.update_timer.timeout.connect(self.update_viewport) + self.update_timer.setSingleShot(True) @property def first_visible_row(self): @@ -491,6 +495,7 @@ def last_visible_row(self): return ans + (geom.width() // item_width) def update_viewport(self): + self.ignore_render_requests.clear() m = self.model() for r in xrange(self.first_visible_row or 0, self.last_visible_row or (m.count() - 1)): self.update(m.index(r, 0)) @@ -502,6 +507,11 @@ def slider_released(self): self.ignore_render_requests.clear() self.update_viewport() + def wheelEvent(self, e): + self.ignore_render_requests.set() + QListView.wheelEvent(self, e) + self.update_timer.start() + def double_clicked(self, index): d = self.delegate if d.animating is None and not config['disable_animations']: