From 9a73323fa33fbb8009c42917f320d5807af514cb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 7 Mar 2022 21:15:11 +0530 Subject: [PATCH] E-book viewer: Allow scrolling of the ToC, highlights, bookmarks, etc. with touch gestures. Fixes #1963875 [Make the Viewer TOC touch friendly](https://bugs.launchpad.net/calibre/+bug/1963875) --- src/calibre/gui2/viewer/bookmarks.py | 8 +++++--- src/calibre/gui2/viewer/highlights.py | 4 +++- src/calibre/gui2/viewer/search.py | 7 +++++-- src/calibre/gui2/viewer/toc.py | 9 +++++---- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/viewer/bookmarks.py b/src/calibre/gui2/viewer/bookmarks.py index 78633d0af0..b9cb03a145 100644 --- a/src/calibre/gui2/viewer/bookmarks.py +++ b/src/calibre/gui2/viewer/bookmarks.py @@ -5,9 +5,9 @@ import json from operator import itemgetter from qt.core import ( - QAction, QComboBox, QGridLayout, QHBoxLayout, QIcon, QInputDialog, - QItemSelectionModel, QLabel, QListWidget, QListWidgetItem, QPushButton, Qt, - QWidget, pyqtSignal + QAbstractItemView, QAction, QComboBox, QGridLayout, QHBoxLayout, QIcon, + QInputDialog, QItemSelectionModel, QLabel, QListWidget, QListWidgetItem, + QPushButton, QScroller, Qt, QWidget, pyqtSignal ) from calibre.gui2 import choose_files, choose_save_file @@ -32,6 +32,8 @@ class BookmarksList(QListWidget): self.addAction(ac) self.ac_delete = ac = QAction(QIcon(I('trash.png')), _('Remove this bookmark'), self) self.addAction(ac) + QScroller.grabGesture(self.viewport(), QScroller.ScrollerGestureType.TouchGesture) + self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) @property def current_non_removed_item(self): diff --git a/src/calibre/gui2/viewer/highlights.py b/src/calibre/gui2/viewer/highlights.py index 2140fc35a3..9d648b51ba 100644 --- a/src/calibre/gui2/viewer/highlights.py +++ b/src/calibre/gui2/viewer/highlights.py @@ -10,7 +10,7 @@ from qt.core import ( QAbstractItemView, QColor, QDialog, QFont, QHBoxLayout, QIcon, QImage, QItemSelectionModel, QKeySequence, QLabel, QMenu, QPainter, QPainterPath, QPalette, QPixmap, QPushButton, QRect, QSizePolicy, QStyle, Qt, QTextCursor, - QTextEdit, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal + QTextEdit, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, QScroller ) from calibre.constants import ( @@ -175,6 +175,8 @@ class Highlights(QTreeWidget): self.uuid_map = {} self.section_font = QFont(self.font()) self.section_font.setItalic(True) + QScroller.grabGesture(self.viewport(), QScroller.ScrollerGestureType.TouchGesture) + self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) def show_context_menu(self, point): index = self.indexAt(point) diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index e645e61ce7..800fc86ea8 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -6,8 +6,9 @@ import regex from collections import Counter, OrderedDict from html import escape from qt.core import ( - QCheckBox, QComboBox, QFont, QHBoxLayout, QIcon, QLabel, Qt, QToolButton, - QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal + QAbstractItemView, QCheckBox, QComboBox, QFont, QHBoxLayout, QIcon, QLabel, + QScroller, Qt, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, + pyqtSignal ) from threading import Thread @@ -471,6 +472,8 @@ class Results(QTreeWidget): # {{{ self.section_map = {} self.search_results = [] self.item_map = {} + QScroller.grabGesture(self.viewport(), QScroller.ScrollerGestureType.TouchGesture) + self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) def current_item_changed(self, current, previous): if current is not None: diff --git a/src/calibre/gui2/viewer/toc.py b/src/calibre/gui2/viewer/toc.py index 388fdb98e9..0b0a975b17 100644 --- a/src/calibre/gui2/viewer/toc.py +++ b/src/calibre/gui2/viewer/toc.py @@ -4,11 +4,10 @@ import re from functools import partial - from qt.core import ( - QApplication, QFont, QHBoxLayout, QIcon, QMenu, QModelIndex, QStandardItem, - QStandardItemModel, QStyledItemDelegate, Qt, QToolButton, QToolTip, QTreeView, - QWidget, pyqtSignal, QEvent + QAbstractItemView, QApplication, QEvent, QFont, QHBoxLayout, QIcon, QMenu, + QModelIndex, QScroller, QStandardItem, QStandardItemModel, QStyledItemDelegate, + Qt, QToolButton, QToolTip, QTreeView, QWidget, pyqtSignal ) from calibre.gui2 import error_dialog @@ -48,6 +47,8 @@ class TOCView(QTreeView): self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.customContextMenuRequested.connect(self.context_menu) QApplication.instance().palette_changed.connect(self.set_style_sheet, type=Qt.ConnectionType.QueuedConnection) + QScroller.grabGesture(self.viewport(), QScroller.ScrollerGestureType.TouchGesture) + self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) def setModel(self, model): QTreeView.setModel(self, model)