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 {
// 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
}

View File

@@ -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
}