summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-20 23:38:58 +0100
committerrabite <rabite@posteo.de>2019-03-20 23:38:58 +0100
commit095cd1074e5240433de67b9ffd052c0555dabd8e (patch)
tree00710f64ef7eca106679371217c36d1fcbb61a24
parentfc2d6d268c6059981422bbe6879f887a5856a7e5 (diff)
filtering by name
-rw-r--r--src/file_browser.rs10
-rw-r--r--src/files.rs22
-rw-r--r--src/listview.rs30
-rw-r--r--src/preview.rs5
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<String>,
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<String>) {
+ self.filter = filter;
+ self.set_dirty();
+ }
+
+ pub fn get_filter(&self) -> Option<String> {
+ 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<Files> {
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<Files>
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<Files>
}
fn render(&self) -> Vec<String> {
- 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<File>,
- cached_files: Option<Files>) {
- if Some(file) == self.file.as_ref() { return }
+ cached_files: Option<Files>) -> 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) {