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.
This commit is contained in:
Kovid Goyal 2013-08-07 09:54:25 +05:30
parent 6ce79b2d96
commit 798eb321d8

View File

@ -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']: