diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 7ec08a1eb8..0ac56cebd4 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -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) diff --git a/src/calibre/gui2/library/bookshelf_view.py b/src/calibre/gui2/library/bookshelf_view.py index ee9c8acb56..e24e7787c4 100644 --- a/src/calibre/gui2/library/bookshelf_view.py +++ b/src/calibre/gui2/library/bookshelf_view.py @@ -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. diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 9db7b14ad7..2b98cc72cf 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -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) diff --git a/src/calibre/gui2/momentum_scroll.py b/src/calibre/gui2/momentum_scroll.py index 0917250590..0fe623247b 100644 --- a/src/calibre/gui2/momentum_scroll.py +++ b/src/calibre/gui2/momentum_scroll.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# License: GPLv3 Copyright: 2025, Kovid Goyal + 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__': diff --git a/src/calibre/gui2/pin_columns.py b/src/calibre/gui2/pin_columns.py index 1170c8e7de..c9f2e9514e 100644 --- a/src/calibre/gui2/pin_columns.py +++ b/src/calibre/gui2/pin_columns.py @@ -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