E-book viewer: Add a preference under Scrolling behavior to reverse the tap zones used to turn pages. So tapping on the left goes forward and the right backward.

This commit is contained in:
Kovid Goyal 2021-05-24 07:40:39 +05:30
parent e74e14fdb0
commit 8e0ba51fd3
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 32 additions and 36 deletions

View File

@ -50,11 +50,11 @@ def create_scrolling_panel(container, apply_func, cancel_func):
container = container.lastChild
sd = get_session_data()
def cb(name, text):
def cb(name, text, title):
ans = E.input(type='checkbox', name=name, style='margin-left: 0')
if sd.get(name):
ans.checked = True
return E.div(style='margin-top:1ex', E.label(ans, text))
return E.div(style='margin-top:1ex', E.label(ans, text, title=title or ''))
def spinner(name, text, **kwargs):
ans = E.input(type='number', name=name, id=name)
@ -121,6 +121,10 @@ def create_scrolling_panel(container, apply_func, cancel_func):
container.appendChild(E.div(style='margin-top:1ex', _('Miscellaneous')))
container.appendChild(E.div(style='margin-left: 1rem'))
container.lastChild.appendChild(cb('book_scrollbar', _('Show a scrollbar')))
container.lastChild.appendChild(cb(
'reverse_page_turn_zones', _('Invert the page turn tap areas'),
_('Have tapping on the left side turn the page forward and the right side backwards')
))
container.appendChild(create_button_box(restore_defaults, apply_func, cancel_func))

View File

@ -58,9 +58,9 @@ class BookScrollbar:
bob_top = b.offsetTop
bob_bottom = bob_top + b.offsetHeight
if evt.clientY < bob_top:
self.view.left_margin_clicked(evt)
self.view.side_margin_clicked('left', evt)
elif evt.clientY > bob_bottom:
self.view.right_margin_clicked(evt)
self.view.side_margin_clicked('right', evt)
def on_bob_mouse_event(self, which, evt):
c = self.container

View File

@ -30,6 +30,7 @@ def update_settings(settings):
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
update_settings()

View File

@ -4,6 +4,7 @@ from __python__ import bound_methods, hash_literals
from read_book.globals import get_boss, ui_operations, ltr_page_progression
from read_book.viewport import scroll_viewport
from read_book.settings import opts
HOLD_THRESHOLD = 750 # milliseconds
TAP_THRESHOLD = 8 # pixels
@ -253,7 +254,7 @@ class BookTouchHandler(TouchHandler):
gesture.type = 'show-chrome'
else:
# default, books that go left to right.
if ltr_page_progression():
if ltr_page_progression() and not opts.reverse_page_turn_zones:
if gesture.viewport_x < min(100, scroll_viewport.width() / 4):
gesture.type = 'prev-page'
else:

View File

@ -191,9 +191,9 @@ def margin_elem(sd, which, id, onclick, oncontextmenu):
return ans
def side_margin_elem(self, sd, which):
def side_margin_elem(self, sd, which, icon):
ans = E.div(
E.div(class_='arrow', style='order: 3', svgicon(f'caret-{which}', '100%', '100%')),
E.div(class_='arrow', style='order: 3', svgicon(f'caret-{icon}', '100%', '100%')),
E.div(style='order:1'), E.div(style='order:2', class_='not-arrow'), E.div(style='order:4'),
style='width:{}px; user-select: none'.format(sd.get(f'margin_{which}', 20)),
@ -225,9 +225,9 @@ class View:
self.keyboard_shortcut_map = create_shortcut_map(sd.get('keyboard_shortcuts'))
if ui_operations.export_shortcut_map:
ui_operations.export_shortcut_map(self.keyboard_shortcut_map)
left_margin = side_margin_elem(self, sd, 'left')
left_margin = side_margin_elem(self, sd, 'left', 'right' if sd.get('reverse_page_turn_zones') else 'left')
set_left_margin_handler(left_margin)
right_margin = side_margin_elem(self, sd, 'right')
right_margin = side_margin_elem(self, sd, 'right', 'left' if sd.get('reverse_page_turn_zones') else 'right')
set_right_margin_handler(right_margin)
handlers = {
'autoscroll_state_changed': def(data):
@ -370,34 +370,21 @@ class View:
def on_hints_message(self, data):
self.hints.handle_message(data)
def left_margin_clicked(self, event):
if event.button is 0:
event.preventDefault(), event.stopPropagation()
sd = get_session_data()
self.iframe_wrapper.send_message(
'next_screen', backwards=True,
flip_if_rtl_page_progression=True,
all_pages_on_screen=sd.get('paged_margin_clicks_scroll_by_screen'))
elif event.button is 2:
event.preventDefault(), event.stopPropagation()
window.setTimeout(self.show_chrome, 0)
self.focus_iframe()
def right_margin_clicked(self, event):
if event.button is 0:
event.preventDefault(), event.stopPropagation()
sd = get_session_data()
self.iframe_wrapper.send_message(
'next_screen', backwards=False,
flip_if_rtl_page_progression=True,
all_pages_on_screen=sd.get('paged_margin_clicks_scroll_by_screen'))
elif event.button is 2:
event.preventDefault(), event.stopPropagation()
window.setTimeout(self.show_chrome, 0)
self.focus_iframe()
def side_margin_clicked(self, which, event):
self.left_margin_clicked(event) if which is 'left' else self.right_margin_clicked(event)
backwards = which is 'left'
if get_session_data().get('reverse_page_turn_zones'):
backwards = not backwards
if event.button is 0:
event.preventDefault(), event.stopPropagation()
sd = get_session_data()
self.iframe_wrapper.send_message(
'next_screen', backwards=backwards,
flip_if_rtl_page_progression=True,
all_pages_on_screen=sd.get('paged_margin_clicks_scroll_by_screen'))
elif event.button is 2:
event.preventDefault(), event.stopPropagation()
window.setTimeout(self.show_chrome, 0)
self.focus_iframe()
def top_margin_clicked(self, event):
if event.button is 0 or event.button is 2:
@ -999,6 +986,7 @@ class View:
'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'),
}
def show_name(self, name, initial_position=None):

View File

@ -76,6 +76,7 @@ defaults = {
'fullscreen_when_opening': 'auto',
'book_search_mode': 'contains',
'book_search_case_sensitive': False,
'reverse_page_turn_zones': False,
}
is_local_setting = {
@ -111,6 +112,7 @@ is_local_setting = {
'highlights_export_format': True,
'book_search_mode': True,
'book_search_case_sensitive': True,
'reverse_page_turn_zones': True,
}