Pass down relativized events to child views
So child views can correctly calculate the local mouse cursor position.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user