mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-30 23:00:21 -04:00
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:
parent
e74e14fdb0
commit
8e0ba51fd3
@ -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))
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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,
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user