1
0
mirror of https://github.com/bobwen-dev/hunter synced 2025-04-12 00:55:41 +02:00

traitified(er) tabview

This commit is contained in:
rabite 2019-02-18 21:19:50 +01:00
parent 52c4a1586e
commit fe542047c2
2 changed files with 55 additions and 37 deletions

View File

@ -8,20 +8,38 @@ use crate::files::{File, Files};
use crate::listview::ListView; use crate::listview::ListView;
use crate::miller_columns::MillerColumns; use crate::miller_columns::MillerColumns;
use crate::widget::Widget; use crate::widget::Widget;
use crate::tabview::Tabbable; use crate::tabview::{TabView, Tabbable};
#[derive(PartialEq)] #[derive(PartialEq)]
pub struct FileBrowser { pub struct FileBrowser {
pub columns: MillerColumns<ListView<Files>>, pub columns: MillerColumns<ListView<Files>>,
} }
impl Tabbable<FileBrowser> for FileBrowser { impl Tabbable for TabView<FileBrowser> {
fn new_tab(&self) -> FileBrowser { fn new_tab(&mut self) {
FileBrowser::new().unwrap() let tab = FileBrowser::new().unwrap();
self.push_widget(tab);
self.active += 1;
}
fn close_tab(&mut self) {
self.close_tab_();
}
fn next_tab(&mut self) {
self.next_tab_();
}
fn active_tab(& self) -> & dyn Widget {
self.active_tab_()
}
fn active_tab_mut(&mut self) -> &mut dyn Widget {
self.active_tab_mut_()
} }
fn on_next_tab(&mut self) { fn on_next_tab(&mut self) {
self.update_preview(); self.active_tab_mut().refresh();
} }
} }

View File

@ -3,20 +3,32 @@ use termion::event::Key;
use crate::coordinates::{Coordinates}; use crate::coordinates::{Coordinates};
use crate::widget::Widget; use crate::widget::Widget;
pub trait Tabbable<T: Widget> { pub trait Tabbable {
fn new_tab(&self) -> T; fn new_tab(&mut self);
fn close_tab(&mut self);
fn next_tab(&mut self);
fn on_next_tab(&mut self); fn on_next_tab(&mut self);
fn active_tab(&self) -> &dyn Widget;
fn active_tab_mut(&mut self) -> &mut dyn Widget;
fn on_key(&mut self, key: Key) {
match key {
Key::Ctrl('t') => { self.new_tab(); },
Key::Ctrl('w') => self.close_tab(),
Key::Char('\t') => self.next_tab(),
_ => self.active_tab_mut().on_key(key)
}
}
} }
#[derive(PartialEq)] #[derive(PartialEq)]
pub struct TabView<T> where T: Widget, T: Tabbable<T> { pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
widgets: Vec<T>, widgets: Vec<T>,
active: usize, pub active: usize,
coordinates: Coordinates coordinates: Coordinates
} }
impl<T> TabView<T> where T: Widget, T: Tabbable<T> { impl<T> TabView<T> where T: Widget, TabView<T>: Tabbable {
pub fn new() -> TabView<T> { pub fn new() -> TabView<T> {
TabView { TabView {
widgets: vec![], widgets: vec![],
@ -36,41 +48,35 @@ impl<T> TabView<T> where T: Widget, T: Tabbable<T> {
widget widget
} }
pub fn active_widget(&self) -> &T { pub fn active_tab_(&self) -> &T {
&self.widgets[self.active] &self.widgets[self.active]
} }
pub fn active_widget_mut(&mut self) -> &mut T { pub fn active_tab_mut_(&mut self) -> &mut T {
&mut self.widgets[self.active] &mut self.widgets[self.active]
} }
pub fn new_tab(&mut self) { pub fn close_tab_(&mut self) {
let tab = self.active_widget().new_tab();
self.push_widget(tab);
self.active += 1;
}
pub fn close_tab(&mut self) {
if self.active == 0 { return } if self.active == 0 { return }
if self.active + 1 >= self.widgets.len() { self.active -= 1 } if self.active + 1 >= self.widgets.len() { self.active -= 1 }
self.pop_widget(); self.pop_widget();
} }
pub fn next_tab(&mut self) { pub fn next_tab_(&mut self) {
if self.active + 1 == self.widgets.len() { if self.active + 1 == self.widgets.len() {
self.active = 0; self.active = 0;
} else { } else {
self.active += 1 self.active += 1
} }
self.active_widget_mut().on_next_tab(); self.on_next_tab();
} }
} }
impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> { impl<T> Widget for TabView<T> where T: Widget, TabView<T>: Tabbable {
fn render_header(&self) -> String { fn render_header(&self) -> String {
let xsize = self.get_coordinates().xsize(); let xsize = self.get_coordinates().xsize();
let header = self.active_widget().render_header(); let header = self.active_tab_().render_header();
let mut nums_length = 0; let mut nums_length = 0;
let tabnums = (0..self.widgets.len()).map(|num| { let tabnums = (0..self.widgets.len()).map(|num| {
nums_length += format!("{} ", num).len(); nums_length += format!("{} ", num).len();
@ -95,15 +101,15 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
} }
fn render_footer(&self) -> String { fn render_footer(&self) -> String {
self.active_widget().render_footer() self.active_tab_().render_footer()
} }
fn refresh(&mut self) { fn refresh(&mut self) {
self.active_widget_mut().refresh(); self.active_tab_mut().refresh();
} }
fn get_drawlist(&self) -> String { fn get_drawlist(&self) -> String {
self.active_widget().get_drawlist() self.active_tab_().get_drawlist()
} }
fn get_coordinates(&self) -> &Coordinates { fn get_coordinates(&self) -> &Coordinates {
@ -118,12 +124,6 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
} }
fn on_key(&mut self, key: Key) { fn on_key(&mut self, key: Key) {
match key { Tabbable::on_key(self, key);
Key::Ctrl('t') => self.new_tab(),
Key::Ctrl('w') => self.close_tab(),
Key::Char('\t') => self.next_tab(),
_ => self.active_widget_mut().on_key(key)
}
} }
} }