mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Viewer: Allow drag scrolling in paged mode as well
This commit is contained in:
parent
07d63bd3af
commit
23fb259c42
@ -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()
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user