diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index 0e17e74d6e..3d38eb24db 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -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() diff --git a/src/pyj/read_book/paged_mode.pyj b/src/pyj/read_book/paged_mode.pyj index e09d4cf0e9..6ebd4a0eea 100644 --- a/src/pyj/read_book/paged_mode.pyj +++ b/src/pyj/read_book/paged_mode.pyj @@ -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)