From 52c4a1586ea8d8023329f272bc0d1f76de60ab58 Mon Sep 17 00:00:00 2001 From: rabite Date: Mon, 18 Feb 2019 20:24:12 +0100 Subject: traitified listview --- src/listview.rs | 93 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 37 deletions(-) (limited to 'src/listview.rs') 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; + fn on_refresh(&mut self) {} + fn on_key(&mut self, _key: Key) {} +} + +impl Listable for ListView { + fn len(&self) -> usize { + self.content.len() + } + + fn render(&self)-> Vec { + 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 -where - T: Send, +pub struct ListView where ListView: Listable { pub content: T, lines: usize, @@ -26,7 +72,7 @@ where impl ListView where ListView: Widget, - T: Send + ListView: Listable { pub fn new(content: T) -> ListView { let view = ListView:: { @@ -346,7 +392,8 @@ impl ListView } } -impl Widget for ListView { + +impl Widget for ListView where ListView: Listable { fn get_coordinates(&self) -> &Coordinates { &self.coordinates } @@ -358,23 +405,19 @@ impl Widget for ListView { 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 { 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); } } -- cgit v1.2.3