diff options
author | rabite <rabite@posteo.de> | 2019-04-06 17:22:28 +0200 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-04-06 17:22:28 +0200 |
commit | 7f70fa29046e09be414b52ba572eb9675979cd46 (patch) | |
tree | 49c753d75c71c43b6ca2d3093e5b361822e7361a /src/listview.rs | |
parent | cab0de7a05fd446e68fc10d37253d67400c33417 (diff) | |
parent | 6098ad301595c0c808634fe03e2d194d3fc65c3c (diff) |
Merge branch 'master' into evil
Diffstat (limited to 'src/listview.rs')
-rw-r--r-- | src/listview.rs | 118 |
1 files changed, 89 insertions, 29 deletions
diff --git a/src/listview.rs b/src/listview.rs index 125f59f..7a3a5a0 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -14,6 +14,7 @@ pub trait Listable { fn render(&self) -> Vec<String>; fn render_header(&self) -> HResult<String> { Ok("".to_string()) } fn render_footer(&self) -> HResult<String> { Ok("".to_string()) } + fn on_new(&mut self) -> HResult<()> { Ok(()) } fn on_refresh(&mut self) -> HResult<()> { Ok(()) } fn on_key(&mut self, _key: Key) -> HResult<()> { Ok(()) } } @@ -27,13 +28,27 @@ impl Listable for ListView<Files> { self.render() } + fn on_new(&mut self) -> HResult<()> { + let show_hidden = self.config().show_hidden(); + self.content.show_hidden = show_hidden; + Ok(()) + } + fn on_refresh(&mut self) -> HResult<()> { - let visible_file_num = self.selection + self.get_coordinates()?.ysize() as usize; - self.content.meta_upto(visible_file_num); + let sender = self.core.get_sender(); + + let visible_files = self.core.coordinates.size_u().1 + self.offset + 1; + + self.content.meta_upto(visible_files, Some(sender.clone())); if self.content.is_dirty() { - self.core.set_dirty(); self.content.set_clean(); + self.core.set_dirty(); + } + + if self.content.dirty_meta.is_dirty() { + self.content.meta_upto(visible_files, Some(sender.clone())); + self.core.set_dirty(); } Ok(()) } @@ -50,12 +65,16 @@ impl Listable for ListView<Files> { self.move_down(); self.refresh()?; }, + Key::Char('<') => self.move_top(), + Key::Char('>') => self.move_bottom(), Key::Char('S') => { self.search_file().log(); } Key::Alt('s') => { self.search_next().log(); } - Key::Char('F') => { self.filter().log(); } + Key::Alt('S') => { self.search_prev().log(); } + Key::Ctrl('f') => { self.filter().log(); } Key::Left => self.goto_grand_parent()?, Key::Right => self.goto_selected()?, Key::Char(' ') => self.multi_select_file(), + Key::Char('v') => self.invert_selection(), Key::Char('t') => self.toggle_tag()?, Key::Char('h') => self.toggle_hidden(), Key::Char('r') => self.reverse_sort(), @@ -88,7 +107,7 @@ where ListView<T>: Listable { pub fn new(core: &WidgetCore, content: T) -> ListView<T> { - let view = ListView::<T> { + let mut view = ListView::<T> { content: content, lines: 0, selection: 0, @@ -98,6 +117,7 @@ where seeking: false, searching: None }; + view.on_new().log(); view } @@ -129,6 +149,15 @@ where self.seeking = false; } + pub fn move_top(&mut self) { + self.set_selection(0); + } + + pub fn move_bottom(&mut self) { + let lines = self.lines; + self.set_selection(lines - 1); + } + pub fn get_selection(&self) -> usize { self.selection } @@ -137,8 +166,7 @@ where let ysize = self.get_coordinates().unwrap().ysize() as usize; let mut offset = 0; - while position + 2 - >= ysize + offset { + while position >= ysize + offset { offset += 1 } @@ -152,19 +180,18 @@ impl ListView<Files> { pub fn selected_file(&self) -> &File { let selection = self.selection; - let file = &self.content[selection]; + let file = &self.content.get_files()[selection]; file } pub fn selected_file_mut(&mut self) -> &mut File { let selection = self.selection; - let file = &mut self.content.files[selection]; - file + let file = self.content.get_file_mut(selection); + file.unwrap() } pub fn clone_selected_file(&self) -> File { - let selection = self.selection; - let file = self.content[selection].clone(); + let file = self.selected_file().clone(); file } @@ -202,9 +229,9 @@ impl ListView<Files> pub fn select_file(&mut self, file: &File) { let pos = self .content - .files + .get_files() .iter() - .position(|item| item == file) + .position(|item| item == &file) .unwrap_or(0); self.set_selection(pos); } @@ -282,10 +309,9 @@ impl ListView<Files> self.refresh().log(); } - fn toggle_hidden(&mut self) { + pub fn toggle_hidden(&mut self) { let file = self.clone_selected_file(); self.content.toggle_hidden(); - self.content.reload_files(); self.select_file(&file); self.refresh().log(); } @@ -310,6 +336,14 @@ impl ListView<Files> self.move_down(); } + pub fn invert_selection(&mut self) { + for file in self.content.get_files_mut() { + file.toggle_selection(); + } + self.content.set_dirty(); + self.refresh().log(); + } + fn toggle_tag(&mut self) -> HResult<()> { self.selected_file_mut().toggle_tag()?; @@ -364,6 +398,40 @@ impl ListView<Files> Ok(()) } + fn search_prev(&mut self) -> HResult<()> { + if self.searching.is_none() { + self.show_status("No search pattern set!").log(); + } + let prev_search = self.searching.clone()?; + + + self.reverse_sort(); + + let selection = self.get_selection(); + + let file = self.content + .files + .iter() + .skip(selection+1) + .find(|file| { + if file.name.to_lowercase().contains(&prev_search) { + true + } else { + false + } + }).cloned(); + + self.reverse_sort(); + + if let Some(file) = file { + let file = file.clone(); + self.select_file(&file); + } else { + self.show_status("Reached last search result!").log(); + } + Ok(()) + } + fn filter(&mut self) -> HResult<()> { let filter = self.minibuffer("filter").ok(); @@ -438,19 +506,11 @@ impl ListView<Files> } fn render(&self) -> Vec<String> { - match self.content.get_filter() { - Some(filter) => self.content - .files - .iter() - .filter(|f| f.name.contains(&filter)) - .map(|file| self.render_line(&file)) - .collect(), - None => self.content - .files - .iter() - .map(|file| self.render_line(&file)) - .collect() - } + self.content + .get_files() + .iter() + .map(|file| self.render_line(&file)) + .collect() } } |