Handle mouse clicks and scrolling in tab header

Partially implements #840
This commit is contained in:
Henrik Friedrichsen
2022-08-09 17:42:49 +02:00
parent 6ce2ffdf44
commit f7f2cb63eb

View File

@@ -2,7 +2,7 @@ use std::cmp::{max, min};
use std::collections::HashMap;
use cursive::align::HAlign;
use cursive::event::{Event, EventResult};
use cursive::event::{Event, EventResult, MouseButton, MouseEvent};
use cursive::theme::{ColorStyle, ColorType, PaletteColor};
use cursive::traits::View;
use cursive::{Cursive, Printer, Vec2};
@@ -21,6 +21,7 @@ pub struct TabView {
tabs: Vec<Tab>,
ids: HashMap<String, usize>,
selected: usize,
size: Vec2,
}
impl TabView {
@@ -29,6 +30,7 @@ impl TabView {
tabs: Vec::new(),
ids: HashMap::new(),
selected: 0,
size: Vec2::default(),
}
}
@@ -97,13 +99,36 @@ impl View for TabView {
}
fn layout(&mut self, size: Vec2) {
self.size = size;
if let Some(tab) = self.tabs.get_mut(self.selected) {
tab.view.layout(Vec2::new(size.x, size.y - 1));
}
}
fn on_event(&mut self, event: Event) -> EventResult {
if let Some(tab) = self.tabs.get_mut(self.selected) {
// 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);
self.move_focus_to(selected_tab);
}
_ => {}
};
EventResult::consumed()
}
_ => EventResult::Ignored,
}
} else if let Some(tab) = self.tabs.get_mut(self.selected) {
tab.view.on_event(event)
} else {
EventResult::Ignored