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