Pass down relativized events to child views

So child views can correctly calculate the local mouse cursor position.
This commit is contained in:
Henrik Friedrichsen
2022-08-16 21:51:11 +02:00
parent 8aab5cabf2
commit af08a560c7
2 changed files with 33 additions and 29 deletions

View File

@@ -288,7 +288,12 @@ impl View for Layout {
} }
fn on_event(&mut self, event: Event) -> EventResult { fn on_event(&mut self, event: Event) -> EventResult {
// handle mouse events in cmdline/statusbar area
if let Event::Mouse { position, .. } = event { if let Event::Mouse { position, .. } = event {
if position.y == 0 {
return EventResult::consumed();
}
let result = self.get_result(); let result = self.get_result();
let cmdline_visible = self.cmdline.get_content().len() > 0; let cmdline_visible = self.cmdline.get_content().len() > 0;
@@ -297,17 +302,14 @@ impl View for Layout {
cmdline_height += 1; cmdline_height += 1;
} }
if position.y < self.last_size.y.saturating_sub(2 + cmdline_height) { if position.y >= self.last_size.y.saturating_sub(2 + cmdline_height)
if let Some(view) = self.get_current_view_mut() { && position.y < self.last_size.y - cmdline_height
view.on_event(event); {
}
} else if position.y < self.last_size.y - cmdline_height {
self.statusbar.on_event( self.statusbar.on_event(
event.relativized(Vec2::new(0, self.last_size.y - 2 - cmdline_height)), event.relativized(Vec2::new(0, self.last_size.y - 2 - cmdline_height)),
); );
return EventResult::Consumed(None);
} }
return EventResult::Consumed(None);
} }
if self.cmdline_focus { if self.cmdline_focus {
@@ -316,7 +318,7 @@ impl View for Layout {
} }
if let Some(view) = self.get_current_view_mut() { if let Some(view) = self.get_current_view_mut() {
view.on_event(event) view.on_event(event.relativized((0, 1)))
} else { } else {
EventResult::Ignored EventResult::Ignored
} }

View File

@@ -106,30 +106,32 @@ impl View for TabView {
} }
fn on_event(&mut self, event: Event) -> EventResult { fn on_event(&mut self, event: Event) -> EventResult {
// mouse event in tab header if let Event::Mouse {
if event.mouse_position().map(|m| m.y) == Some(1) { offset,
match event { position,
Event::Mouse { event,
offset: _, } = event
position, {
event, let position = position.checked_sub(offset);
} => { if let Some(0) = position.map(|p| p.y) {
match event { match event {
MouseEvent::WheelUp => self.move_focus(-1), MouseEvent::WheelUp => self.move_focus(-1),
MouseEvent::WheelDown => self.move_focus(1), MouseEvent::WheelDown => self.move_focus(1),
MouseEvent::Press(MouseButton::Left) => { MouseEvent::Press(MouseButton::Left) => {
let tabwidth = self.size.x / self.tabs.len(); let tabwidth = self.size.x / self.tabs.len();
let selected_tab = position.x.saturating_div(tabwidth); if let Some(selected_tab) = position.and_then(|p| p.x.checked_div(tabwidth))
{
self.move_focus_to(selected_tab); self.move_focus_to(selected_tab);
} }
_ => {} }
}; _ => {}
EventResult::consumed() };
} return EventResult::consumed();
_ => EventResult::Ignored,
} }
} 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 { } else {
EventResult::Ignored EventResult::Ignored
} }