From 095cd1074e5240433de67b9ffd052c0555dabd8e Mon Sep 17 00:00:00 2001 From: rabite Date: Wed, 20 Mar 2019 23:38:58 +0100 Subject: filtering by name --- src/file_browser.rs | 10 ++++++++++ src/files.rs | 22 +++++++++++++++++++++- src/listview.rs | 30 +++++++++++++++++++++++++----- src/preview.rs | 5 +++-- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/file_browser.rs b/src/file_browser.rs index 2effb3d..91194f2 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -397,6 +397,16 @@ impl FileBrowser { pub fn update_preview(&mut self) -> HResult<()> { if !self.main_widget()?.ready() { return Ok(()) } + if self.main_widget()? + .widget()? + .lock()? + .as_ref() + .unwrap() + .content + .len() == 0 { + self.preview_widget_mut()?.set_stale(); + return Ok(()); + } let file = self.selected_file()?.clone(); let selection = self.get_selection(&file).ok().cloned(); let cached_files = self.get_cached_files(&file).ok(); diff --git a/src/files.rs b/src/files.rs index 2ea4512..54e9049 100644 --- a/src/files.rs +++ b/src/files.rs @@ -61,6 +61,7 @@ pub struct Files { pub dirs_first: bool, pub reverse: bool, pub show_hidden: bool, + pub filter: Option, pub dirty: DirtyBit } @@ -104,6 +105,7 @@ impl Files { dirs_first: true, reverse: false, show_hidden: true, + filter: None, dirty: DirtyBit::new() }; @@ -148,6 +150,7 @@ impl Files { dirs_first: true, reverse: false, show_hidden: true, + filter: None, dirty: DirtyBit::new() }; @@ -295,8 +298,25 @@ impl Files { } } + pub fn set_filter(&mut self, filter: Option) { + self.filter = filter; + self.set_dirty(); + } + + pub fn get_filter(&self) -> Option { + self.filter.clone() + } + pub fn len(&self) -> usize { - self.files.len() + match &self.filter { + None => self.files.len(), + Some(filter) => { + self.files + .iter() + .filter(|f| f.name.contains(filter)) + .count() + } + } } pub fn get_selected(&self) -> Vec<&File> { diff --git a/src/listview.rs b/src/listview.rs index 5a42308..9c0389c 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -51,6 +51,7 @@ impl Listable for ListView { self.refresh()?; }, Key::Ctrl('s') => { self.find_file().ok(); } + Key::Char('F') => { self.filter().log(); } Key::Left => self.goto_grand_parent()?, Key::Right => self.goto_selected()?, Key::Char(' ') => self.multi_select_file(), @@ -331,6 +332,17 @@ impl ListView Ok(()) } + fn filter(&mut self) -> HResult<()> { + let filter = self.minibuffer("filter").ok(); + self.content.set_filter(filter); + + + if self.get_selection() > self.len() { + self.set_selection(self.len()); + } + Ok(()) + } + fn render_line(&self, file: &File) -> String { let name = &file.name; let (size, unit) = file.calculate_size().unwrap_or((0, "".to_string())); @@ -391,11 +403,19 @@ impl ListView } fn render(&self) -> Vec { - self.content - .files - .iter() - .map(|file| self.render_line(&file)) - .collect() + 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() + } } } diff --git a/src/preview.rs b/src/preview.rs index ca99f83..4c51ceb 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -303,8 +303,8 @@ impl Previewer { pub fn set_file(&mut self, file: &File, selection: Option, - cached_files: Option) { - if Some(file) == self.file.as_ref() { return } + cached_files: Option) -> HResult<()> { + if Some(file) == self.file.as_ref() && !self.widget.is_stale()? { return Ok(()) } self.file = Some(file.clone()); self.selection = selection.clone(); self.cached_files = cached_files.clone(); @@ -345,6 +345,7 @@ impl Previewer { return Ok(blank) } })))); + Ok(()) } pub fn reload(&mut self) { -- cgit v1.2.3