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, 'scroll_to_ref': self.on_scroll_to_ref,
'set_reference_mode': self.set_reference_mode, 'set_reference_mode': self.set_reference_mode,
'toggle_autoscroll': self.toggle_autoscroll, '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, 'window_size': self.received_window_size,
'overlay_visibility_changed': self.on_overlay_visibility_changed, 'overlay_visibility_changed': self.on_overlay_visibility_changed,
'show_search_result': self.show_search_result, 'show_search_result': self.show_search_result,
@ -305,7 +305,8 @@ class IframeBoss:
def gesture_from_margin(self, data): def gesture_from_margin(self, data):
self.handle_gesture(data.gesture) 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) self.onwheel(data.evt)
def report_human_scroll(self, scrolled_by_frac): 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('touchend', self.touchend_on_container, {'passive': False})
container.addEventListener('touchcancel', 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('keydown', self.on_keydown, {'passive': False})
container.addEventListener('wheel', self.on_wheel, {'passive': False})
container.setAttribute('tabindex', '0') container.setAttribute('tabindex', '0')
self.dragging_handle = None self.dragging_handle = None
@ -289,6 +290,8 @@ class SelectionBar:
clear(bar_container) clear(bar_container)
bar_container.style.maxWidth = 'min(50rem, 90vw)' if self.supports_css_min_max else '50rem' bar_container.style.maxWidth = 'min(50rem, 90vw)' if self.supports_css_min_max else '50rem'
bar_container.style.backgroundColor = get_color("window-background") 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 [ for x in [
E.div(style='height: 4ex; display: flex; align-items: center; padding: 5px; justify-content: center'), E.div(style='height: 4ex; display: flex; align-items: center; padding: 5px; justify-content: center'),
@ -296,7 +299,7 @@ class SelectionBar:
E.div( E.div(
style='display: none; padding: 5px;', style='display: none; padding: 5px;',
E.div(), notes_container,
) )
]: ]:
bar_container.appendChild(x) bar_container.appendChild(x)
@ -545,6 +548,10 @@ class SelectionBar:
self.end_handle_drag() self.end_handle_drag()
return 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): def on_keydown(self, ev):
ev.stopPropagation(), ev.preventDefault() ev.stopPropagation(), ev.preventDefault()
if ev.key is 'Escape': if ev.key is 'Escape':

View File

@ -389,10 +389,13 @@ class View:
def on_margin_wheel(self, which, event): def on_margin_wheel(self, which, event):
event.preventDefault() 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'): for attr in ('deltaX', 'deltaY', 'deltaMode', 'altKey', 'ctrlKey', 'shiftKey', 'metaKey'):
evt[attr] = event[attr] 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): def forward_gesture(self, gesture):
self.iframe_wrapper.send_message('gesture_from_margin', gesture=gesture) self.iframe_wrapper.send_message('gesture_from_margin', gesture=gesture)