Viewer: Fix mouse wheel not working while selection bar is visible

Fixes #1898413 [Viewer: some mouse actions with popup bar displayed should be changed](https://bugs.launchpad.net/calibre/+bug/1898413)
This commit is contained in:
Kovid Goyal 2020-10-04 12:01:41 +05:30
parent 8bd7109300
commit 5bf8e926b6
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 16 additions and 5 deletions

View File

@ -137,7 +137,7 @@ class IframeBoss:
'scroll_to_ref': self.on_scroll_to_ref,
'set_reference_mode': self.set_reference_mode,
'toggle_autoscroll': self.toggle_autoscroll,
'wheel_from_margin': self.wheel_from_margin,
'fake_wheel_event': self.fake_wheel_event,
'window_size': self.received_window_size,
'overlay_visibility_changed': self.on_overlay_visibility_changed,
'show_search_result': self.show_search_result,
@ -305,7 +305,8 @@ class IframeBoss:
def gesture_from_margin(self, data):
self.handle_gesture(data.gesture)
def wheel_from_margin(self, data):
def fake_wheel_event(self, data):
# these are wheel events from margin or selection mode
self.onwheel(data.evt)
def report_human_scroll(self, scrolled_by_frac):

View File

@ -247,6 +247,7 @@ class SelectionBar:
container.addEventListener('touchend', self.touchend_on_container, {'passive': False})
container.addEventListener('touchcancel', self.touchend_on_container, {'passive': False})
container.addEventListener('keydown', self.on_keydown, {'passive': False})
container.addEventListener('wheel', self.on_wheel, {'passive': False})
container.setAttribute('tabindex', '0')
self.dragging_handle = None
@ -289,6 +290,8 @@ class SelectionBar:
clear(bar_container)
bar_container.style.maxWidth = 'min(50rem, 90vw)' if self.supports_css_min_max else '50rem'
bar_container.style.backgroundColor = get_color("window-background")
notes_container = E.div()
notes_container.addEventListener('wheel', def(evt): evt.stopPropagation();, {'passive': True})
for x in [
E.div(style='height: 4ex; display: flex; align-items: center; padding: 5px; justify-content: center'),
@ -296,7 +299,7 @@ class SelectionBar:
E.div(
style='display: none; padding: 5px;',
E.div(),
notes_container,
)
]:
bar_container.appendChild(x)
@ -545,6 +548,10 @@ class SelectionBar:
self.end_handle_drag()
return
def on_wheel(self, ev):
ev.stopPropagation(), ev.preventDefault()
self.view.send_wheel_event_to_iframe(ev, 'selection-mode')
def on_keydown(self, ev):
ev.stopPropagation(), ev.preventDefault()
if ev.key is 'Escape':

View File

@ -389,10 +389,13 @@ class View:
def on_margin_wheel(self, which, event):
event.preventDefault()
evt = {}
self.send_wheel_event_to_iframe(event, f'margin-{which}')
def send_wheel_event_to_iframe(self, event, location):
evt = {'location': location}
for attr in ('deltaX', 'deltaY', 'deltaMode', 'altKey', 'ctrlKey', 'shiftKey', 'metaKey'):
evt[attr] = event[attr]
self.iframe_wrapper.send_message('wheel_from_margin', evt=evt)
self.iframe_wrapper.send_message('fake_wheel_event', evt=evt)
def forward_gesture(self, gesture):
self.iframe_wrapper.send_message('gesture_from_margin', gesture=gesture)