summaryrefslogtreecommitdiffstats
path: root/src/listview.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-01-25 20:20:34 +0100
committerrabite <rabite@posteo.de>2019-01-25 20:20:34 +0100
commitc381203bb2c9fd91add74154237dcc93853f73c3 (patch)
tree0a5ce0a1f6a3f8130fe4782600c444f07734b1b1 /src/listview.rs
parentf3f783a3a0bc3c96e4678c7fa986dc31bcb8d585 (diff)
sorting by name and size
Diffstat (limited to 'src/listview.rs')
-rw-r--r--src/listview.rs30
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)); }
}
}