Viewer: Allow drag scrolling in paged mode as well

This commit is contained in:
Kovid Goyal 2020-07-20 22:07:41 +05:30
parent 07d63bd3af
commit 23fb259c42
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 58 additions and 7 deletions

View File

@ -22,11 +22,12 @@ from read_book.extract import get_elements
from read_book.find import reset_find_caches, select_search_result
from read_book.flow_mode import (
anchor_funcs as flow_anchor_funcs, auto_scroll_action as flow_auto_scroll_action,
cancel_drag_scroll, ensure_selection_visible, flow_onwheel,
flow_to_scroll_fraction, handle_gesture as flow_handle_gesture,
cancel_drag_scroll as cancel_drag_scroll_flow, ensure_selection_visible,
flow_onwheel, flow_to_scroll_fraction, handle_gesture as flow_handle_gesture,
handle_shortcut as flow_handle_shortcut, layout as flow_layout,
scroll_by_page as flow_scroll_by_page,
scroll_to_extend_annotation as flow_annotation_scroll, start_drag_scroll
scroll_to_extend_annotation as flow_annotation_scroll,
start_drag_scroll as start_drag_scroll_flow
)
from read_book.footnotes import is_footnote_link
from read_book.globals import (
@ -38,7 +39,8 @@ from read_book.mathjax import apply_mathjax
from read_book.paged_mode import (
anchor_funcs as paged_anchor_funcs,
auto_scroll_action as paged_auto_scroll_action, calc_columns_per_screen,
current_cfi, get_columns_per_screen_data, handle_gesture as paged_handle_gesture,
cancel_drag_scroll as cancel_drag_scroll_paged, current_cfi,
get_columns_per_screen_data, handle_gesture as paged_handle_gesture,
handle_shortcut as paged_handle_shortcut, jump_to_cfi as paged_jump_to_cfi,
layout as paged_layout, onwheel as paged_onwheel,
prepare_for_resize as paged_prepare_for_resize, progress_frac,
@ -46,7 +48,7 @@ from read_book.paged_mode import (
scroll_by_page as paged_scroll_by_page, scroll_to_elem,
scroll_to_extend_annotation as paged_annotation_scroll,
scroll_to_fraction as paged_scroll_to_fraction, snap_to_selection,
will_columns_per_screen_change
start_drag_scroll as start_drag_scroll_paged, will_columns_per_screen_change
)
from read_book.referencing import (
elem_for_ref, end_reference_mode, start_reference_mode
@ -75,6 +77,11 @@ def layout_style():
return 'scrolling' if current_layout_mode() is 'flow' else 'paginated'
def cancel_drag_scroll():
cancel_drag_scroll_flow()
cancel_drag_scroll_paged()
class EPUBReadingSystem:
@property
@ -231,6 +238,7 @@ class IframeBoss:
self.auto_scroll_action = flow_auto_scroll_action
self.scroll_to_extend_annotation = flow_annotation_scroll
self.ensure_selection_visible = ensure_selection_visible
self.start_drag_scroll = start_drag_scroll_flow
paged_auto_scroll_action('stop')
else:
self.do_layout = paged_layout
@ -243,6 +251,7 @@ class IframeBoss:
self.auto_scroll_action = paged_auto_scroll_action
self.scroll_to_extend_annotation = paged_annotation_scroll
self.ensure_selection_visible = snap_to_selection
self.start_drag_scroll = start_drag_scroll_paged
flow_auto_scroll_action('stop')
update_settings(data.settings)
self.keyboard_shortcut_map = create_shortcut_map(data.settings.keyboard_shortcuts)
@ -544,7 +553,7 @@ class IframeBoss:
def onmousemove(self, evt):
if evt.buttons is not 1:
return
if 0 <= evt.clientY <= window.innerHeight or current_layout_mode() is not 'flow':
if 0 <= evt.clientY <= window.innerHeight:
cancel_drag_scroll()
return
sel = window.getSelection()
@ -552,7 +561,7 @@ class IframeBoss:
cancel_drag_scroll()
return
delta = evt.clientY if evt.clientY < 0 else (evt.clientY - window.innerHeight)
start_drag_scroll(delta)
self.start_drag_scroll(delta)
def onmouseup(self, evt):
cancel_drag_scroll()

View File

@ -746,3 +746,45 @@ def auto_scroll_action(action):
' scrolling'), is_non_critical=True
)
return False
class DragScroller:
INTERVAL = 500
def __init__(self):
self.backward = False
self.timer_id = None
def is_running(self):
return self.timer_id is not None
def start(self, backward):
if not self.is_running() or backward is not self.backward:
self.stop()
self.backward = backward
self.timer_id = window.setTimeout(self.do_one_page_turn.bind(self), self.INTERVAL)
def do_one_page_turn(self):
pos = previous_col_location() if self.backward else next_col_location()
if pos >= 0:
scroll_to_xpos(pos)
self.timer_id = window.setTimeout(self.do_one_page_turn.bind(self), self.INTERVAL * 2)
else:
self.stop()
def stop(self):
if self.timer_id is not None:
window.clearTimeout(self.timer_id)
self.timer_id = None
drag_scroller = DragScroller()
def cancel_drag_scroll():
drag_scroller.stop()
def start_drag_scroll(delta):
drag_scroller.start(delta < 0)