summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-02-18 21:19:50 +0100
committerrabite <rabite@posteo.de>2019-02-18 21:19:50 +0100
commitfe542047c231cff6c1959fe05cb51e177ddfbcc6 (patch)
tree6aa62fe09c1906fbc7416cd5330f9db3a84aa3b5
parent52c4a1586ea8d8023329f272bc0d1f76de60ab58 (diff)
traitified(er) tabview
-rw-r--r--src/file_browser.rs28
-rw-r--r--src/tabview.rs64
2 files changed, 55 insertions, 37 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs
index f5809a5..322137c 100644
--- a/src/file_browser.rs
+++ b/src/file_browser.rs
@@ -8,20 +8,38 @@ use crate::files::{File, Files};
use crate::listview::ListView;
use crate::miller_columns::MillerColumns;
use crate::widget::Widget;
-use crate::tabview::Tabbable;
+use crate::tabview::{TabView, Tabbable};
#[derive(PartialEq)]
pub struct FileBrowser {
pub columns: MillerColumns<ListView<Files>>,
}
-impl Tabbable<FileBrowser> for FileBrowser {
- fn new_tab(&self) -> FileBrowser {
- FileBrowser::new().unwrap()
+impl Tabbable for TabView<FileBrowser> {
+ fn new_tab(&mut self) {
+ 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) {
- self.update_preview();
+ self.active_tab_mut().refresh();
}
}
diff --git a/src/tabview.rs b/src/tabview.rs
index 65cfaef..722932a 100644
--- a/src/tabview.rs
+++ b/src/tabview.rs
@@ -3,20 +3,32 @@ use termion::event::Key;
use crate::coordinates::{Coordinates};
use crate::widget::Widget;
-pub trait Tabbable<T: Widget> {
- fn new_tab(&self) -> T;
+pub trait Tabbable {
+ fn new_tab(&mut self);
+ fn close_tab(&mut self);
+ fn 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)]
-pub struct TabView<T> where T: Widget, T: Tabbable<T> {
+pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
widgets: Vec<T>,
- active: usize,
+ pub active: usize,
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> {
TabView {
widgets: vec![],
@@ -36,41 +48,35 @@ impl<T> TabView<T> where T: Widget, T: Tabbable<T> {
widget
}
- pub fn active_widget(&self) -> &T {
+ pub fn active_tab_(&self) -> &T {
&self.widgets[self.active]
}
-
- pub fn active_widget_mut(&mut self) -> &mut T {
- &mut self.widgets[self.active]
- }
- pub fn new_tab(&mut self) {
- let tab = self.active_widget().new_tab();
- self.push_widget(tab);
- self.active += 1;
+ pub fn active_tab_mut_(&mut self) -> &mut T {
+ &mut self.widgets[self.active]
}
- pub fn close_tab(&mut self) {
+ pub fn close_tab_(&mut self) {
if self.active == 0 { return }
if self.active + 1 >= self.widgets.len() { self.active -= 1 }
-
+
self.pop_widget();
}
- pub fn next_tab(&mut self) {
+ pub fn next_tab_(&mut self) {
if self.active + 1 == self.widgets.len() {
self.active = 0;
} else {
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 {
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 tabnums = (0..self.widgets.len()).map(|num| {
nums_length += format!("{} ", num).len();
@@ -86,7 +92,7 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
}).collect::<String>();
let nums_pos = xsize - nums_length as u16;
-
+
format!("{}{}{}{}",
header,
crate::term::header_color(),
@@ -95,15 +101,15 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
}
fn render_footer(&self) -> String {
- self.active_widget().render_footer()
+ self.active_tab_().render_footer()
}
fn refresh(&mut self) {
- self.active_widget_mut().refresh();
+ self.active_tab_mut().refresh();
}
fn get_drawlist(&self) -> String {
- self.active_widget().get_drawlist()
+ self.active_tab_().get_drawlist()
}
fn get_coordinates(&self) -> &Coordinates {
@@ -116,14 +122,8 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
self.coordinates = coordinates.clone();
self.refresh();
}
-
+
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_widget_mut().on_key(key)
- }
-
+ Tabbable::on_key(self, key);
}
}