diff options
author | rabite <rabite@posteo.de> | 2019-01-25 20:20:34 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-01-25 20:20:34 +0100 |
commit | c381203bb2c9fd91add74154237dcc93853f73c3 (patch) | |
tree | 0a5ce0a1f6a3f8130fe4782600c444f07734b1b1 /src/listview.rs | |
parent | f3f783a3a0bc3c96e4678c7fa986dc31bcb8d585 (diff) |
sorting by name and size
Diffstat (limited to 'src/listview.rs')
-rw-r--r-- | src/listview.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/listview.rs b/src/listview.rs index 93424d7..c29351e 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -61,6 +61,16 @@ impl<T: 'static> ListView<T> where ListView<T>: Widget { self.selection += 1; } + fn set_selection(&mut self, position: usize) { + let ysize = self.dimensions.1 as usize; + let mut offset = 0; + + while position + 1 > ysize + offset { offset += 1 } + + self.offset = offset; + self.selection = position; + } + fn render_line(&self, file: &File) -> String { let name = &file.name; let (size, unit) = file.calculate_size(); @@ -100,6 +110,12 @@ impl ListView<Files> where file } + fn clone_selected_file(&self) -> File { + let selection = self.selection; + let file = self.content[selection].clone(); + file + } + fn grand_parent(&self) -> Option<PathBuf> { self.selected_file().grand_parent() } @@ -131,6 +147,19 @@ impl ListView<Files> where } } } + + fn select_file(&mut self, file: &File) { + let pos = self.content.files.iter().position(|item| item == file).unwrap(); + self.set_selection(pos); + } + + fn cycle_sort(&mut self) { + let file = self.clone_selected_file(); + self.content.cycle_sort(); + self.select_file(&file); + self.refresh(); + self.show_status(&format!("Sorting by: {}", self.content.sort)); + } } @@ -207,6 +236,7 @@ impl Widget for ListView<Files> { Key::Right => { self.goto_selected() }, + Key::Char('s') => { self.cycle_sort() } , _ => { self.bad(Event::Key(key)); } } } |