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 {
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user