Map gestures to configurable actions

This commit is contained in:
Kovid Goyal 2023-06-11 14:40:38 +05:30
parent dcfc477c28
commit 80702e5a72
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
9 changed files with 71 additions and 24 deletions

View File

@ -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)

View File

@ -0,0 +1,49 @@
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2023, Kovid Goyal <kovid at kovidgoyal.net>
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'

View File

@ -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)

View File

@ -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 = {

View File

@ -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(

View File

@ -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()

View File

@ -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'),

View File

@ -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):

View File

@ -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 = {