diff options
author | rabite <rabite@posteo.de> | 2019-01-21 17:47:58 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-01-21 17:47:58 +0100 |
commit | 8ad1b657ec3d20bab2199b33a22ff9a191dfe58d (patch) | |
tree | 9cf9d11a7f40060c0a5ceb8b72c9577f443b5614 /src/listview.rs | |
parent | 724cc61680e14d45fb7c0e5ebac525b71e7a1381 (diff) |
got file sizes working in listview
Diffstat (limited to 'src/listview.rs')
-rw-r--r-- | src/listview.rs | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/src/listview.rs b/src/listview.rs index 2e26ace..e5f7c77 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -1,9 +1,11 @@ +use unicode_width::{UnicodeWidthStr}; use termion::event::{Key,Event}; use crate::term; use crate::files::Files; use crate::widget::Widget; -use crate::window::{STATUS_BAR_MARGIN, HEADER_MARGIN}; + +// Maybe also buffer drawlist for efficiency when it doesn't change every draw pub struct ListView<T> { pub content: T, @@ -29,7 +31,7 @@ impl<T: 'static> ListView<T> where ListView<T>: Widget { pub fn to_trait(self) -> Box<Widget> { Box::new(self) } - + fn move_up(&mut self) { if self.selection == 0 { return; @@ -57,6 +59,26 @@ impl<T: 'static> ListView<T> where ListView<T>: Widget { self.selection += 1; } + fn render_line(&self, name: &str, size: usize, unit: &str) -> String { + let (xsize, _) = self.get_dimensions(); + let sized_string = term::sized_string(name, xsize); + let padding = xsize - sized_string.width() as u16; + + + + format!( + "{}{}{:padding$}{}{}{}{}", + term::normal_color(), + sized_string, + " ", + term::highlight_color(), + term::cursor_left(size.to_string().width() + unit.width()), + size, + unit, + padding = padding as usize + ) + } + } impl Widget for ListView<Files> { @@ -66,25 +88,32 @@ impl Widget for ListView<Files> { fn get_position(&self) -> (u16, u16) { self.position } + fn set_dimensions(&mut self, size: (u16, u16)) { + self.dimensions = size; + } + fn set_position(&mut self, position: (u16, u16)) { + self.position = position; + } fn refresh(&mut self) { self.buffer = self.render(); } - + + + fn render(&self) -> Vec<String> { self.content.iter().map(|file| { - self.render_line(&file.name, - &format!("{:?}", file.size), - false) + let (size, unit) = file.calculate_size(); + self.render_line(&file.name, size, &unit) }).collect() } - + fn get_drawlist(&mut self) -> String { let mut output = term::reset(); let (xsize, ysize) = self.dimensions; let (xpos, ypos) = self.position; output += &term::reset(); - + for (i, item) in self.buffer .iter() .skip(self.offset) @@ -102,10 +131,10 @@ impl Widget for ListView<Files> { term::reset()); } - + if ysize as usize > self.buffer.len() { let start_y = self.buffer.len() + 1 + ypos as usize; - for i in start_y..ysize as usize { + for i in start_y..ysize as usize { output += &format!("{}{:xsize$}{}", term::gotoy(i), " ", xsize = xsize as usize); } } @@ -115,7 +144,7 @@ impl Widget for ListView<Files> { fn render_header(&self) -> String { format!("{} files", self.content.len()) } - + fn on_key(&mut self, key: Key) { match key { Key::Up => { self.move_up(); self.refresh() }, |