Handle mouse clicks and scrolling in tab header
Partially implements #840
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user