From 5bf8e926b65dfaf853ff5a07fe4ee58f2e8a6d35 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 4 Oct 2020 12:01:41 +0530 Subject: [PATCH] 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) --- src/pyj/read_book/iframe.pyj | 5 +++-- src/pyj/read_book/selection_bar.pyj | 9 ++++++++- src/pyj/read_book/view.pyj | 7 +++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index 93a0f4507e..6c97035e92 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -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): diff --git a/src/pyj/read_book/selection_bar.pyj b/src/pyj/read_book/selection_bar.pyj index 6bb005813f..b5158ce750 100644 --- a/src/pyj/read_book/selection_bar.pyj +++ b/src/pyj/read_book/selection_bar.pyj @@ -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': diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 996c4310d0..8c42f143a5 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -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)