diff options
author | rabite <rabite@posteo.de> | 2019-02-18 20:24:12 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-02-18 20:38:28 +0100 |
commit | 52c4a1586ea8d8023329f272bc0d1f76de60ab58 (patch) | |
tree | 64912c4418cde21d495e818ce42b3fe9783bc0dc /src | |
parent | b4ed9cd6893088af5103ec4e18552669aa52eb93 (diff) |
traitified listview
Diffstat (limited to 'src')
-rw-r--r-- | src/listview.rs | 93 |
1 files changed, 56 insertions, 37 deletions
diff --git a/src/listview.rs b/src/listview.rs index c1e1d30..a64a340 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -9,10 +9,56 @@ use crate::files::{File, Files}; use crate::term; use crate::widget::{Widget}; +pub trait Listable { + fn len(&self) -> usize; + fn render(&self) -> Vec<String>; + fn on_refresh(&mut self) {} + fn on_key(&mut self, _key: Key) {} +} + +impl Listable for ListView<Files> { + fn len(&self) -> usize { + self.content.len() + } + + fn render(&self)-> Vec<String> { + self.render() + } + + fn on_refresh(&mut self) { + let visible_file_num = self.selection + self.get_coordinates().ysize() as usize; + self.content.meta_upto(visible_file_num); + } + + fn on_key(&mut self, key: Key) { + match key { + Key::Up | Key::Char('p') => { + self.move_up(); + self.refresh(); + } + Key::Char('P') => { for _ in 0..10 { self.move_up() } self.refresh(); } + Key::Char('N') => { for _ in 0..10 { self.move_down() } self.refresh(); } + Key::Down | Key::Char('n') => { + self.move_down(); + self.refresh(); + } + Key::Left => self.goto_grand_parent(), + Key::Right => self.goto_selected(), + Key::Char(' ') => self.multi_select_file(), + Key::Char('h') => self.toggle_hidden(), + Key::Char('r') => self.reverse_sort(), + Key::Char('s') => self.cycle_sort(), + Key::Char('K') => self.select_next_mtime(), + Key::Char('k') => self.select_prev_mtime(), + Key::Char('d') => self.toggle_dirs_first(), + Key::Char('!') => self.exec_cmd(), + _ => self.bad(Event::Key(key)) + } + } +} + #[derive(PartialEq)] -pub struct ListView<T> -where - T: Send, +pub struct ListView<T> where ListView<T>: Listable { pub content: T, lines: usize, @@ -26,7 +72,7 @@ where impl<T> ListView<T> where ListView<T>: Widget, - T: Send + ListView<T>: Listable { pub fn new(content: T) -> ListView<T> { let view = ListView::<T> { @@ -346,7 +392,8 @@ impl ListView<Files> } } -impl Widget for ListView<Files> { + +impl<T> Widget for ListView<T> where ListView<T>: Listable { fn get_coordinates(&self) -> &Coordinates { &self.coordinates } @@ -358,23 +405,19 @@ impl Widget for ListView<Files> { self.refresh(); } fn refresh(&mut self) { - let visible_file_num = self.selection + self.get_coordinates().ysize() as usize; - self.content.meta_upto(visible_file_num); - self.lines = self.content.len(); + self.on_refresh(); + self.lines = self.len(); self.buffer = self.render(); } fn get_drawlist(&self) -> String { let mut output = term::reset(); - let ysize = self.get_coordinates().ysize(); let (xpos, ypos) = self.coordinates.position().position(); output += &self .buffer .iter() - //.skip(self.offset) - //.take(ysize as usize) .enumerate() .map(|(i, item)| { let mut output = term::normal_color(); @@ -397,34 +440,10 @@ impl Widget for ListView<Files> { output } fn render_header(&self) -> String { - format!("{} files", self.content.len()) + format!("{} files", self.len()) } fn on_key(&mut self, key: Key) { - match key { - Key::Up | Key::Char('p') => { - self.move_up(); - self.refresh(); - } - Key::Char('P') => { for _ in 0..10 { self.move_up() } self.refresh(); } - Key::Char('N') => { for _ in 0..10 { self.move_down() } self.refresh(); } - Key::Down | Key::Char('n') => { - self.move_down(); - self.refresh(); - } - Key::Left => self.goto_grand_parent(), - Key::Right => self.goto_selected(), - Key::Char(' ') => self.multi_select_file(), - Key::Char('h') => self.toggle_hidden(), - Key::Char('r') => self.reverse_sort(), - Key::Char('s') => self.cycle_sort(), - Key::Char('K') => self.select_next_mtime(), - Key::Char('k') => self.select_prev_mtime(), - Key::Char('d') => self.toggle_dirs_first(), - Key::Char('!') => self.exec_cmd(), - _ => { - self.bad(Event::Key(key)); - } - } + Listable::on_key(self, key); } } |