Respect the scroll per line/column book list setting when doing momentum_scroll

This commit is contained in:
Kovid Goyal
2025-12-10 18:39:12 +05:30
parent b1af5e8681
commit f8e69c70e9
5 changed files with 23 additions and 5 deletions
+1 -1
View File
@@ -774,7 +774,7 @@ CoverTuple = namedtuple('CoverTuple', ['book_id', 'has_cover', 'cache_valid',
# The View {{{
@setup_dnd_interface
class GridView(QListView, MomentumScrollMixin):
class GridView(MomentumScrollMixin, QListView):
update_item = pyqtSignal(object, object)
files_dropped = pyqtSignal(object)
+1 -1
View File
@@ -591,7 +591,7 @@ class HoveredCover:
@setup_dnd_interface
class BookshelfView(QAbstractScrollArea, MomentumScrollMixin):
class BookshelfView(MomentumScrollMixin, QAbstractScrollArea):
'''
Enhanced bookshelf view displaying books as spines on shelves.
+6 -2
View File
@@ -366,9 +366,13 @@ class BooksView(TableView): # {{{
self.alternate_views = AlternateViews(self)
for wv in self, self.pin_view:
if not tweaks['horizontal_scrolling_per_column']:
if tweaks['horizontal_scrolling_per_column']:
wv.update_momentum_scroll_settings(enable_x=False)
else:
wv.setHorizontalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel)
if not tweaks['vertical_scrolling_per_row']:
if tweaks['vertical_scrolling_per_row']:
wv.update_momentum_scroll_settings(enable_x=False)
else:
wv.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel)
wv.setEditTriggers(QAbstractItemView.EditTrigger.EditKeyPressed)
+14
View File
@@ -1,3 +1,6 @@
#!/usr/bin/env python
# License: GPLv3 Copyright: 2025, Kovid Goyal <kovid at kovidgoyal.net>
from collections import deque
from typing import NamedTuple
@@ -44,6 +47,10 @@ class MomentumSettings(NamedTuple):
timer_interval_ms: int = 16 # ~60 FPS update rate
# Time to wait after ScrollEnd to see if system momentum arrives
momentum_detection_delay_ms: int = 50
# Whether to enable momentum in the specified axis, defers to Qt handling
# of wheelevents when false
enable_x: bool = True
enable_y: bool = True
# How much to scale scroll amounts by
x_multiplier: float = 1
y_multiplier: float = 1
@@ -336,6 +343,9 @@ class MomentumScrollMixin:
def wheelEvent(self, event: QWheelEvent):
self._ensure_momentum_scroller()
if (not self._momentum_scroller.settings.enable_x and event.angleDelta().x() != 0) or (
not self._momentum_scroller.settings.enable_y and event.angleDelta().y() != 0):
return super().wheelEvent(event)
self._momentum_scroller.handle_wheel_event(event)
event.accept()
@@ -344,6 +354,10 @@ class MomentumScrollMixin:
if self._momentum_scroller:
self._momentum_scroller.stop()
def update_momentum_scroll_settings(self, **kw) -> None:
self._ensure_momentum_scroller()
self._momentum_scroller.settings = self._momentum_scroller.settings._replace(**kw)
# Demo {{{
if __name__ == '__main__':
+1 -1
View File
@@ -28,7 +28,7 @@ from calibre.gui2.library.delegates import (
from calibre.gui2.momentum_scroll import MomentumScrollMixin
class TableView(QTableView, MomentumScrollMixin):
class TableView(MomentumScrollMixin, QTableView):
def closeEditor(self, editor, hint):
# We want to implement our own go to next/previous cell behavior