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 Queue import Queue 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 @@ class GridView(QListView): 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 @@ class GridView(QListView): 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 @@ class GridView(QListView): 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']: