From f7f2cb63ebb26429a0b95d51dbd07c106eea62b5 Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Tue, 9 Aug 2022 17:42:49 +0200 Subject: [PATCH] Handle mouse clicks and scrolling in tab header Partially implements #840 --- src/ui/tabview.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/ui/tabview.rs b/src/ui/tabview.rs index aa45e3e..b1588c8 100644 --- a/src/ui/tabview.rs +++ b/src/ui/tabview.rs @@ -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, ids: HashMap, 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