Fix clicking on scrollbar arrows/gutter not scrolling text

This commit is contained in:
Kovid Goyal 2019-10-07 07:22:03 +05:30
parent 6b224f2a35
commit bb5b7b0253
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -70,19 +70,26 @@ class CentralWidget(QWidget):
def __init__(self, web_view, parent): def __init__(self, web_view, parent):
QWidget.__init__(self, parent) QWidget.__init__(self, parent)
self._ignore_value_changes = False
self.web_view = web_view self.web_view = web_view
self.l = l = QHBoxLayout(self) self.l = l = QHBoxLayout(self)
l.setContentsMargins(0, 0, 0, 0), l.setSpacing(0) l.setContentsMargins(0, 0, 0, 0), l.setSpacing(0)
l.addWidget(web_view) l.addWidget(web_view)
self.vertical_scrollbar = vs = ScrollBar(Qt.Vertical, self) self.vertical_scrollbar = vs = ScrollBar(Qt.Vertical, self)
vs.sliderMoved[int].connect(self.slider_moved) vs.valueChanged[int].connect(self.value_changed)
l.addWidget(vs) l.addWidget(vs)
self.current_book_length = None self.current_book_length = None
web_view.notify_progress_frac.connect(self.update_scrollbar_positions) web_view.notify_progress_frac.connect(self.update_scrollbar_positions_on_scroll)
web_view.scrollbar_visibility_changed.connect(self.apply_scrollbar_visibility) web_view.scrollbar_visibility_changed.connect(self.apply_scrollbar_visibility)
web_view.overlay_visibility_changed.connect(self.overlay_visibility_changed) web_view.overlay_visibility_changed.connect(self.overlay_visibility_changed)
self.apply_scrollbar_visibility() self.apply_scrollbar_visibility()
def __enter__(self):
self._ignore_value_changes = True
def __exit__(self, *a):
self._ignore_value_changes = False
def apply_scrollbar_visibility(self): def apply_scrollbar_visibility(self):
visible = get_session_pref('standalone_scrollbar', default=False, group=None) visible = get_session_pref('standalone_scrollbar', default=False, group=None)
self.vertical_scrollbar.setVisible(bool(visible)) self.vertical_scrollbar.setVisible(bool(visible))
@ -91,23 +98,26 @@ class CentralWidget(QWidget):
self.vertical_scrollbar.setEnabled(not visible) self.vertical_scrollbar.setEnabled(not visible)
def set_scrollbar_value(self, frac): def set_scrollbar_value(self, frac):
val = int(self.vertical_scrollbar.maximum() * frac) with self:
self.vertical_scrollbar.setValue(val) val = int(self.vertical_scrollbar.maximum() * frac)
self.vertical_scrollbar.setValue(val)
def slider_moved(self, val): def value_changed(self, val):
frac = val / self.vertical_scrollbar.maximum() if not self._ignore_value_changes:
self.web_view.goto_frac(frac) frac = val / self.vertical_scrollbar.maximum()
self.web_view.goto_frac(frac)
def initialize_scrollbars(self, book_length): def initialize_scrollbars(self, book_length):
self.current_book_length = book_length with self:
maximum = book_length / 10 self.current_book_length = book_length
bar = self.vertical_scrollbar maximum = book_length / 10
bar.setMinimum(0) bar = self.vertical_scrollbar
bar.setMaximum(maximum) bar.setMinimum(0)
bar.setSingleStep(10) bar.setMaximum(maximum)
bar.setPageStep(100) bar.setSingleStep(10)
bar.setPageStep(100)
def update_scrollbar_positions(self, progress_frac, file_progress_frac, book_length): def update_scrollbar_positions_on_scroll(self, progress_frac, file_progress_frac, book_length):
if book_length != self.current_book_length: if book_length != self.current_book_length:
self.initialize_scrollbars(book_length) self.initialize_scrollbars(book_length)
if not self.vertical_scrollbar.isSliderDown(): if not self.vertical_scrollbar.isSliderDown():