mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
E-book viewer: Add a new option under scrolling behavior to control horizontal mouse wheel events jumping to next section
This commit is contained in:
parent
7e4a7eed21
commit
8271fcff30
@ -679,43 +679,63 @@ def is_return():
|
|||||||
return fsd and fsd.cols_per_screen is cols_per_screen and fsd.spine_index is csi.index and fsd.spine_name is csi.name
|
return fsd and fsd.cols_per_screen is cols_per_screen and fsd.spine_index is csi.index and fsd.spine_name is csi.name
|
||||||
|
|
||||||
|
|
||||||
class HandleWheel:
|
class WheelState:
|
||||||
|
last_event_mode = 'page'
|
||||||
def __init__(self):
|
last_event_at = -10000
|
||||||
self.reset()
|
last_event_backwards = False
|
||||||
|
accumulated_scroll = 0
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self.last_event_mode = 'page'
|
self.last_event_mode = WheelState.last_event_mode
|
||||||
self.last_event_at = -10000
|
self.last_event_at = WheelState.last_event_at
|
||||||
self.last_event_backwards = False
|
self.last_event_backwards = WheelState.last_event_backwards
|
||||||
self.accumulated_scroll = 0
|
self.accumulated_scroll = WheelState.accumulated_scroll
|
||||||
|
|
||||||
def onwheel(self, evt):
|
def add_pixel_scroll(self, backward, delta, scroll_func):
|
||||||
if not (evt.deltaY or evt.deltaX):
|
|
||||||
return
|
|
||||||
if evt.deltaY:
|
|
||||||
backward = evt.deltaY < 0
|
|
||||||
if evt.deltaMode is window.WheelEvent.DOM_DELTA_PIXEL:
|
|
||||||
self.add_pixel_scroll(backward, Math.abs(evt.deltaY))
|
|
||||||
else:
|
|
||||||
self.do_scroll(backward)
|
|
||||||
if evt.deltaX:
|
|
||||||
backward = evt.deltaX < 0
|
|
||||||
self.do_section_jump(backward)
|
|
||||||
|
|
||||||
def add_pixel_scroll(self, backward, deltaY):
|
|
||||||
now = window.performance.now()
|
now = window.performance.now()
|
||||||
if now - self.last_event_at > 1000 or self.last_event_backwards is not backward or self.last_event_mode is not 'pixel':
|
if now - self.last_event_at > 1000 or self.last_event_backwards is not backward or self.last_event_mode is not 'pixel':
|
||||||
self.accumulated_scroll = 0
|
self.accumulated_scroll = 0
|
||||||
self.last_event_mode = 'pixel'
|
self.last_event_mode = 'pixel'
|
||||||
self.last_event_at = now
|
self.last_event_at = now
|
||||||
self.last_event_backwards = backward
|
self.last_event_backwards = backward
|
||||||
self.accumulated_scroll += deltaY
|
self.accumulated_scroll += delta
|
||||||
if self.accumulated_scroll > opts.paged_pixel_scroll_threshold:
|
if self.accumulated_scroll > opts.paged_pixel_scroll_threshold:
|
||||||
self.do_scroll(backward)
|
self.reset()
|
||||||
|
scroll_func(backward)
|
||||||
|
|
||||||
|
|
||||||
|
class HandleWheel:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.vertical_state = WheelState()
|
||||||
|
self.horizontal_state = WheelState()
|
||||||
|
|
||||||
|
def onwheel(self, evt):
|
||||||
|
if not (evt.deltaY or evt.deltaX):
|
||||||
|
return
|
||||||
|
major_axis_vertical = True
|
||||||
|
if evt.deltaY:
|
||||||
|
if evt.deltaX:
|
||||||
|
major_axis_vertical = Math.abs(evt.deltaY) >= Math.abs(evt.deltaX)
|
||||||
|
else:
|
||||||
|
major_axis_vertical = False
|
||||||
|
if major_axis_vertical:
|
||||||
|
backward = evt.deltaY < 0
|
||||||
|
if evt.deltaMode is window.WheelEvent.DOM_DELTA_PIXEL:
|
||||||
|
self.vertical_state.add_pixel_scroll(backward, Math.abs(evt.deltaY), self.do_scroll)
|
||||||
|
else:
|
||||||
|
self.vertical_state.reset()
|
||||||
|
self.do_scroll(backward)
|
||||||
|
else:
|
||||||
|
if opts.paged_wheel_section_jumps:
|
||||||
|
backward = evt.deltaX < 0
|
||||||
|
if evt.deltaMode is window.WheelEvent.DOM_DELTA_PIXEL:
|
||||||
|
self.horizontal_state.add_pixel_scroll(backward, Math.abs(evt.deltaX), self.do_section_jump)
|
||||||
|
else:
|
||||||
|
self.horizontal_state.reset()
|
||||||
|
self.do_section_jump(backward)
|
||||||
|
|
||||||
def do_scroll(self, backward):
|
def do_scroll(self, backward):
|
||||||
self.reset()
|
|
||||||
if opts.paged_wheel_scrolls_by_screen:
|
if opts.paged_wheel_scrolls_by_screen:
|
||||||
pos = previous_screen_location() if backward else next_screen_location()
|
pos = previous_screen_location() if backward else next_screen_location()
|
||||||
else:
|
else:
|
||||||
@ -726,7 +746,6 @@ class HandleWheel:
|
|||||||
scroll_to_pos(pos)
|
scroll_to_pos(pos)
|
||||||
|
|
||||||
def do_section_jump(self, backward):
|
def do_section_jump(self, backward):
|
||||||
self.reset()
|
|
||||||
get_boss().send_message('next_section', forward=not backward)
|
get_boss().send_message('next_section', forward=not backward)
|
||||||
|
|
||||||
wheel_handler = HandleWheel()
|
wheel_handler = HandleWheel()
|
||||||
|
@ -67,6 +67,8 @@ def create_scrolling_panel(container, apply_func, cancel_func):
|
|||||||
container.appendChild(E.div(style='margin-left: 1rem'))
|
container.appendChild(E.div(style='margin-left: 1rem'))
|
||||||
container.lastChild.appendChild(cb(
|
container.lastChild.appendChild(cb(
|
||||||
'paged_wheel_scrolls_by_screen', _('Mouse wheel scrolls by screen fulls instead of pages')))
|
'paged_wheel_scrolls_by_screen', _('Mouse wheel scrolls by screen fulls instead of pages')))
|
||||||
|
container.lastChild.appendChild(cb(
|
||||||
|
'paged_wheel_section_jumps', _('Horizontal mouse wheel jumps to next/previous section')))
|
||||||
container.lastChild.appendChild(cb(
|
container.lastChild.appendChild(cb(
|
||||||
'paged_margin_clicks_scroll_by_screen', _('Clicking on the margins scrolls by screen fulls instead of pages')))
|
'paged_margin_clicks_scroll_by_screen', _('Clicking on the margins scrolls by screen fulls instead of pages')))
|
||||||
container.lastChild.appendChild(
|
container.lastChild.appendChild(
|
||||||
|
@ -26,6 +26,7 @@ def update_settings(settings):
|
|||||||
opts.margin_bottom = max(0, settings.margin_bottom)
|
opts.margin_bottom = max(0, settings.margin_bottom)
|
||||||
opts.override_book_colors = settings.override_book_colors
|
opts.override_book_colors = settings.override_book_colors
|
||||||
opts.paged_wheel_scrolls_by_screen = v'!!settings.paged_wheel_scrolls_by_screen'
|
opts.paged_wheel_scrolls_by_screen = v'!!settings.paged_wheel_scrolls_by_screen'
|
||||||
|
opts.paged_wheel_section_jumps = v'!!settings.paged_wheel_section_jumps'
|
||||||
opts.paged_pixel_scroll_threshold = settings.paged_pixel_scroll_threshold
|
opts.paged_pixel_scroll_threshold = settings.paged_pixel_scroll_threshold
|
||||||
opts.scroll_auto_boundary_delay = settings.scroll_auto_boundary_delay
|
opts.scroll_auto_boundary_delay = settings.scroll_auto_boundary_delay
|
||||||
opts.scroll_stop_boundaries = v'!!settings.scroll_stop_boundaries'
|
opts.scroll_stop_boundaries = v'!!settings.scroll_stop_boundaries'
|
||||||
|
@ -1018,6 +1018,7 @@ class View:
|
|||||||
'hide_tooltips': sd.get('hide_tooltips'),
|
'hide_tooltips': sd.get('hide_tooltips'),
|
||||||
'cover_preserve_aspect_ratio': sd.get('cover_preserve_aspect_ratio'),
|
'cover_preserve_aspect_ratio': sd.get('cover_preserve_aspect_ratio'),
|
||||||
'paged_wheel_scrolls_by_screen': sd.get('paged_wheel_scrolls_by_screen'),
|
'paged_wheel_scrolls_by_screen': sd.get('paged_wheel_scrolls_by_screen'),
|
||||||
|
'paged_wheel_section_jumps': sd.get('paged_wheel_section_jumps'),
|
||||||
'paged_pixel_scroll_threshold': sd.get('paged_pixel_scroll_threshold'),
|
'paged_pixel_scroll_threshold': sd.get('paged_pixel_scroll_threshold'),
|
||||||
'lines_per_sec_auto': sd.get('lines_per_sec_auto'),
|
'lines_per_sec_auto': sd.get('lines_per_sec_auto'),
|
||||||
'lines_per_sec_smooth': sd.get('lines_per_sec_smooth'),
|
'lines_per_sec_smooth': sd.get('lines_per_sec_smooth'),
|
||||||
|
@ -53,6 +53,7 @@ defaults = {
|
|||||||
'override_book_colors': 'never',
|
'override_book_colors': 'never',
|
||||||
'paged_margin_clicks_scroll_by_screen': True,
|
'paged_margin_clicks_scroll_by_screen': True,
|
||||||
'paged_wheel_scrolls_by_screen': False,
|
'paged_wheel_scrolls_by_screen': False,
|
||||||
|
'paged_wheel_section_jumps': True,
|
||||||
'paged_pixel_scroll_threshold': 60,
|
'paged_pixel_scroll_threshold': 60,
|
||||||
'read_mode': 'paged',
|
'read_mode': 'paged',
|
||||||
'scroll_auto_boundary_delay': 5,
|
'scroll_auto_boundary_delay': 5,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user