From af08a560c7aa727807ff9cb8d21db96f664254f9 Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Tue, 16 Aug 2022 21:51:11 +0200 Subject: [PATCH] Pass down relativized events to child views So child views can correctly calculate the local mouse cursor position. --- src/ui/layout.rs | 18 ++++++++++-------- src/ui/tabview.rs | 44 +++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/ui/layout.rs b/src/ui/layout.rs index d2734fa..2713a77 100644 --- a/src/ui/layout.rs +++ b/src/ui/layout.rs @@ -288,7 +288,12 @@ impl View for Layout { } fn on_event(&mut self, event: Event) -> EventResult { + // handle mouse events in cmdline/statusbar area if let Event::Mouse { position, .. } = event { + if position.y == 0 { + return EventResult::consumed(); + } + let result = self.get_result(); let cmdline_visible = self.cmdline.get_content().len() > 0; @@ -297,17 +302,14 @@ impl View for Layout { cmdline_height += 1; } - if position.y < self.last_size.y.saturating_sub(2 + cmdline_height) { - if let Some(view) = self.get_current_view_mut() { - view.on_event(event); - } - } else if position.y < self.last_size.y - cmdline_height { + if position.y >= self.last_size.y.saturating_sub(2 + cmdline_height) + && position.y < self.last_size.y - cmdline_height + { self.statusbar.on_event( event.relativized(Vec2::new(0, self.last_size.y - 2 - cmdline_height)), ); + return EventResult::Consumed(None); } - - return EventResult::Consumed(None); } if self.cmdline_focus { @@ -316,7 +318,7 @@ impl View for Layout { } if let Some(view) = self.get_current_view_mut() { - view.on_event(event) + view.on_event(event.relativized((0, 1))) } else { EventResult::Ignored } diff --git a/src/ui/tabview.rs b/src/ui/tabview.rs index b1588c8..6f666a1 100644 --- a/src/ui/tabview.rs +++ b/src/ui/tabview.rs @@ -106,30 +106,32 @@ impl View for TabView { } fn on_event(&mut self, event: Event) -> EventResult { - // mouse event in tab header - if event.mouse_position().map(|m| m.y) == Some(1) { - match event { - Event::Mouse { - offset: _, - position, - event, - } => { - match event { - MouseEvent::WheelUp => self.move_focus(-1), - MouseEvent::WheelDown => self.move_focus(1), - MouseEvent::Press(MouseButton::Left) => { - let tabwidth = self.size.x / self.tabs.len(); - let selected_tab = position.x.saturating_div(tabwidth); + if let Event::Mouse { + offset, + position, + event, + } = event + { + let position = position.checked_sub(offset); + if let Some(0) = position.map(|p| p.y) { + match event { + MouseEvent::WheelUp => self.move_focus(-1), + MouseEvent::WheelDown => self.move_focus(1), + MouseEvent::Press(MouseButton::Left) => { + let tabwidth = self.size.x / self.tabs.len(); + if let Some(selected_tab) = position.and_then(|p| p.x.checked_div(tabwidth)) + { self.move_focus_to(selected_tab); } - _ => {} - }; - EventResult::consumed() - } - _ => EventResult::Ignored, + } + _ => {} + }; + return EventResult::consumed(); } - } else if let Some(tab) = self.tabs.get_mut(self.selected) { - tab.view.on_event(event) + } + + if let Some(tab) = self.tabs.get_mut(self.selected) { + tab.view.on_event(event.relativized((0, 1))) } else { EventResult::Ignored }