diff --git a/src/pyj/read_book/flow_mode.pyj b/src/pyj/read_book/flow_mode.pyj index ab955abbba..bd47f81e44 100644 --- a/src/pyj/read_book/flow_mode.pyj +++ b/src/pyj/read_book/flow_mode.pyj @@ -23,7 +23,6 @@ from __python__ import bound_methods, hash_literals from dom import set_css from range_utils import wrap_range, unwrap from read_book.cfi import scroll_to as cfi_scroll_to -from read_book.touch import GESTURE from read_book.globals import current_spine_item, get_boss, rtl_page_progression, ltr_page_progression from read_book.settings import opts from read_book.viewport import line_height, rem_size, scroll_viewport @@ -537,9 +536,9 @@ def start_drag_scroll(delta): def handle_gesture(gesture): flick_animator.stop() - if gesture.type is GESTURE.flick_block_forward or gesture.type is GESTURE.flick_block_backward: + if gesture.resolved_action is 'animated_scroll': flick_animator.start(gesture) - elif gesture.type.startsWith('swipe_') and gesture.type.endsWith('_in_progress'): + elif gesture.resolved_action is 'pan': if gesture.points.length > 1 and not gesture.is_held: delta = gesture.points[-2] - gesture.points[-1] if Math.abs(delta) >= 1: @@ -559,11 +558,11 @@ def handle_gesture(gesture): # In horizontal modes, just move by the delta. else: scroll_viewport.scroll_by(delta, 0) - elif gesture.type is GESTURE.back_zone_tap: + elif gesture.resolved_action is 'prev_page' or gesture.resolved_action is 'prev_screen': # should flip = False - previous is previous whether RTL or LTR. # flipping of this command is handled higher up scroll_by_page(-1, False) - elif gesture.type is GESTURE.forward_zone_tap: + elif gesture.resolved_action is 'next_page' or gesture.resolved_action is 'next_screen': # should flip = False - next is next whether RTL or LTR. # flipping of this command is handled higher up scroll_by_page(1, False) diff --git a/src/pyj/read_book/gestures.pyj b/src/pyj/read_book/gestures.pyj new file mode 100644 index 0000000000..116c1b6f2e --- /dev/null +++ b/src/pyj/read_book/gestures.pyj @@ -0,0 +1,49 @@ +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2023, Kovid Goyal +from __python__ import bound_methods, hash_literals + +from read_book.touch import GESTURE +from read_book.settings import opts + +default_actions_for_gesture = { + 'common': { + GESTURE.back_zone_tap: 'prev_page', + GESTURE.forward_zone_tap: 'next_page', + GESTURE.control_zone_tap: 'show_chrome', + GESTURE.two_finger_tap: 'show_chrome', + GESTURE.long_tap: 'highlight_or_inspect', + GESTURE.pinch_in: 'decrease_font_size', + GESTURE.pinch_out: 'increase_font_size', + }, + 'flow_mode': { + GESTURE.swipe_inline_backward_in_progress: 'pan', + GESTURE.swipe_inline_forward_in_progress: 'pan', + GESTURE.swipe_block_backward_in_progress: 'pan', + GESTURE.swipe_block_forward_in_progress: 'pan', + GESTURE.flick_block_forward: 'animated_scroll', + GESTURE.flick_block_backward: 'animated_scroll', + GESTURE.flick_inline_forward: 'animated_scroll', + GESTURE.flick_inline_backward: 'animated_scroll', + }, + 'paged_mode': { + GESTURE.flick_block_forward: 'next_section', + GESTURE.flick_block_backward: 'prev_section', + GESTURE.flick_inline_forward: 'next_screen', + GESTURE.flick_inline_backward: 'prev_screen', + GESTURE.swipe_inline_forward_hold: 'next_screen', + GESTURE.swipe_inline_backward_hold: 'prev_screen', + }, +} + +def action_for_gesture(gesture, in_flow_mode): + overrides = opts.gesture_overrides + mode = 'flow_mode' if in_flow_mode else 'paged_mode' + mode_overrides = overrides[mode] or {} + if mode_overrides[gesture.type]: + return mode_overrides[gesture.type] + common_overrides = overrides.common or {} + if common_overrides[gesture.type]: + return common_overrides[gesture.type] + if default_actions_for_gesture[mode][gesture.type]: + return default_actions_for_gesture[mode][gesture.type] + return default_actions_for_gesture.common[gesture.type] or 'none' diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index f19ba47dfb..5c06a3db58 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -9,7 +9,6 @@ from range_utils import ( all_annots_in_selection, highlight_associated_with_selection, last_span_for_crw, reset_highlight_counter, select_crw, unwrap_all_crw, unwrap_crw, wrap_text_in_range ) -from read_book.touch import GESTURE from read_book.cfi import cfi_for_selection, range_from_cfi from read_book.extract import get_elements from read_book.find import ( @@ -27,6 +26,7 @@ from read_book.flow_mode import ( start_drag_scroll as start_drag_scroll_flow ) from read_book.footnotes import is_footnote_link +from read_book.gestures import action_for_gesture from read_book.globals import ( annot_id_uuid_map, clear_annot_id_uuid_map, current_book, current_layout_mode, current_spine_item, runtime, set_boss, set_current_spine_item, set_layout_mode, @@ -316,13 +316,14 @@ class IframeBoss: self.auto_scroll_action('toggle') def handle_gesture(self, gesture): - if gesture.type is GESTURE.control_zone_tap or gesture.type is GESTURE.two_finger_tap: + gesture.resolved_action = action_for_gesture(gesture, current_layout_mode() is 'flow') + if gesture.resolved_action is 'show_chrome': self.send_message('show_chrome') - elif gesture.type is GESTURE.pinch_in: + elif gesture.resolved_action is 'decrease_font_size': self.send_message('bump_font_size', increase=False) - elif gesture.type is GESTURE.pinch_out: + elif gesture.resolved_action is 'increase_font_size': self.send_message('bump_font_size', increase=True) - elif gesture.type is GESTURE.long_tap: + elif gesture.resolved_action is 'highlight_or_inspect': self.handle_long_tap(gesture) else: self._handle_gesture(gesture) diff --git a/src/pyj/read_book/paged_mode.pyj b/src/pyj/read_book/paged_mode.pyj index 42c816ded1..343810263d 100644 --- a/src/pyj/read_book/paged_mode.pyj +++ b/src/pyj/read_book/paged_mode.pyj @@ -32,7 +32,6 @@ from read_book.cfi import ( scroll_to as cfi_scroll_to ) from read_book.globals import current_spine_item, get_boss, rtl_page_progression -from read_book.touch import GESTURE from read_book.settings import opts from read_book.viewport import scroll_viewport, line_height, rem_size, get_unit_size_in_pixels from utils import ( @@ -811,18 +810,18 @@ def handle_shortcut(sc_name, evt): def handle_gesture(gesture): # Gesture progression direction is determined in the gesture code, # don't set flip_if_rtl_page_progression=True here. - if gesture.type is GESTURE.flick_block_forward: + if gesture.resolved_action is 'next_section': get_boss().send_message('next_section', forward=True) - elif gesture.type is GESTURE.flick_block_backward: + elif gesture.resolved_action is 'prev_section': get_boss().send_message('next_section', forward=False) - elif gesture.type is GESTURE.flick_inline_forward or gesture.type is GESTURE.swipe_inline_forward_hold: + elif gesture.resolved_action is 'next_screen': scroll_by_page(False, True) - elif gesture.type is GESTURE.flick_inline_backward or gesture.type is GESTURE.swipe_inline_backward_hold: + elif gesture.resolved_action is 'prev_screen': scroll_by_page(True, True) - elif gesture.type is GESTURE.back_zone_tap: - scroll_by_page(True, opts.paged_taps_scroll_by_screen) - elif gesture.type is GESTURE.forward_zone_tap: - scroll_by_page(False, opts.paged_taps_scroll_by_screen) + elif gesture.resolved_action is 'prev_page': + scroll_by_page(True, False) + elif gesture.resolved_action is 'next_page': + scroll_by_page(False, False) anchor_funcs = { diff --git a/src/pyj/read_book/prefs/scrolling.pyj b/src/pyj/read_book/prefs/scrolling.pyj index 87204aa08f..f3ccf67be3 100644 --- a/src/pyj/read_book/prefs/scrolling.pyj +++ b/src/pyj/read_book/prefs/scrolling.pyj @@ -69,8 +69,6 @@ def create_scrolling_panel(container, apply_func, cancel_func): 'paged_wheel_scrolls_by_screen', _('Mouse wheel scrolls by screen fulls instead of pages'))) container.lastChild.appendChild(cb( 'paged_margin_clicks_scroll_by_screen', _('Clicking on the margins scrolls by screen fulls instead of pages'))) - container.lastChild.appendChild(cb( - 'paged_taps_scroll_by_screen', _('Tapping scrolls by screen fulls instead of pages'))) container.lastChild.appendChild( E.div(style='display:grid;margin-top:1ex;align-items:center;grid-template-columns:auto min-content;grid-gap:1ex; max-width: 30em', *spinner( diff --git a/src/pyj/read_book/settings.pyj b/src/pyj/read_book/settings.pyj index 4ce39e2f29..7b5cc894bb 100644 --- a/src/pyj/read_book/settings.pyj +++ b/src/pyj/read_book/settings.pyj @@ -27,11 +27,11 @@ def update_settings(settings): opts.override_book_colors = settings.override_book_colors opts.paged_wheel_scrolls_by_screen = v'!!settings.paged_wheel_scrolls_by_screen' opts.paged_pixel_scroll_threshold = settings.paged_pixel_scroll_threshold - opts.paged_taps_scroll_by_screen = v'!!settings.paged_taps_scroll_by_screen' opts.scroll_auto_boundary_delay = settings.scroll_auto_boundary_delay opts.scroll_stop_boundaries = v'!!settings.scroll_stop_boundaries' opts.reverse_page_turn_zones = v'!!settings.reverse_page_turn_zones' opts.user_stylesheet = settings.user_stylesheet + opts.gesture_overrides = settings.gesture_overrides update_settings() diff --git a/src/pyj/read_book/touch.pyj b/src/pyj/read_book/touch.pyj index 14952656dd..9c968931a2 100644 --- a/src/pyj/read_book/touch.pyj +++ b/src/pyj/read_book/touch.pyj @@ -20,6 +20,7 @@ GESTURE_NAMES = { 'two_finger_tap': _('Two finger tap'), 'pinch_in': _('Pinch in'), 'pinch_out': _('Pinch out'), + 'flick_inline_backward': _('Flick in writing direction, backwards'), 'flick_inline_forward': _('Flick in writing direction, forwards'), 'flick_block_backward': _('Flick perpendicular to writing direction, backwards'), diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 1aabe9ea6e..b661ff0b66 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -1017,12 +1017,12 @@ class View: 'cover_preserve_aspect_ratio': sd.get('cover_preserve_aspect_ratio'), 'paged_wheel_scrolls_by_screen': sd.get('paged_wheel_scrolls_by_screen'), 'paged_pixel_scroll_threshold': sd.get('paged_pixel_scroll_threshold'), - 'paged_taps_scroll_by_screen': sd.get('paged_taps_scroll_by_screen'), 'lines_per_sec_auto': sd.get('lines_per_sec_auto'), 'lines_per_sec_smooth': sd.get('lines_per_sec_smooth'), 'scroll_auto_boundary_delay': sd.get('scroll_auto_boundary_delay'), 'scroll_stop_boundaries': sd.get('scroll_stop_boundaries'), 'reverse_page_turn_zones': sd.get('reverse_page_turn_zones'), + 'gesture_overrides': sd.get('gesture_overrides'), } def show_name(self, name, initial_position=None): diff --git a/src/pyj/session.pyj b/src/pyj/session.pyj index 0c1d9cd29e..0812a7c427 100644 --- a/src/pyj/session.pyj +++ b/src/pyj/session.pyj @@ -53,7 +53,6 @@ defaults = { 'override_book_colors': 'never', 'paged_margin_clicks_scroll_by_screen': True, 'paged_wheel_scrolls_by_screen': False, - 'paged_taps_scroll_by_screen': False, 'paged_pixel_scroll_threshold': 60, 'read_mode': 'paged', 'scroll_auto_boundary_delay': 5, @@ -78,6 +77,7 @@ defaults = { 'book_search_mode': 'contains', 'book_search_case_sensitive': False, 'reverse_page_turn_zones': False, + 'gesture_overrides': {}, } is_local_setting = {