diff options
Diffstat (limited to 'src/history.rs')
-rw-r--r-- | src/history.rs | 130 |
1 files changed, 50 insertions, 80 deletions
diff --git a/src/history.rs b/src/history.rs index 0035d88..5302828 100644 --- a/src/history.rs +++ b/src/history.rs @@ -12,32 +12,16 @@ use crate::context::UiContext; use crate::fs::{JoshutoDirEntry, JoshutoDirList, JoshutoMetadata}; pub trait DirectoryHistory { - fn populate_to_root( - &mut self, - path: &Path, - config: &AppConfig, - ui_context: &UiContext, - options: &DisplayOption, - tab_options: &TabDisplayOption, - ) -> io::Result<()>; + fn insert_entries(&mut self, entries: Vec<JoshutoDirList>); fn create_or_soft_update( &mut self, path: &Path, - config: &AppConfig, options: &DisplayOption, tab_options: &TabDisplayOption, ) -> io::Result<()>; fn create_or_reload( &mut self, path: &Path, - config: &AppConfig, - options: &DisplayOption, - tab_options: &TabDisplayOption, - ) -> io::Result<()>; - fn reload( - &mut self, - path: &Path, - config: &AppConfig, options: &DisplayOption, tab_options: &TabDisplayOption, ) -> io::Result<()>; @@ -49,53 +33,15 @@ pub trait DirectoryHistory { pub type JoshutoHistory = HashMap<PathBuf, JoshutoDirList>; impl DirectoryHistory for JoshutoHistory { - fn populate_to_root( - &mut self, - path: &Path, - config: &AppConfig, - ui_context: &UiContext, - options: &DisplayOption, - tab_options: &TabDisplayOption, - ) -> io::Result<()> { - let mut dirlists = Vec::new(); - - let mut prev: Option<&Path> = None; - for curr in path.ancestors() { - if self.contains_key(curr) { - let mut new_dirlist = - create_dirlist_with_history(self, curr, config, options, tab_options)?; - if let Some(ancestor) = prev.as_ref() { - if let Some(i) = get_index_of_value(&new_dirlist.contents, ancestor) { - new_dirlist.set_index(Some(i), ui_context, options); - } - } - dirlists.push(new_dirlist); - } else { - let mut new_dirlist = JoshutoDirList::from_path( - curr.to_path_buf().clone(), - config, - options, - tab_options, - )?; - if let Some(ancestor) = prev.as_ref() { - if let Some(i) = get_index_of_value(&new_dirlist.contents, ancestor) { - new_dirlist.set_index(Some(i), ui_context, options); - } - } - dirlists.push(new_dirlist); - } - prev = Some(curr); - } - for dirlist in dirlists { + fn insert_entries(&mut self, entries: Vec<JoshutoDirList>) { + for dirlist in entries { self.insert(dirlist.file_path().to_path_buf(), dirlist); } - Ok(()) } fn create_or_soft_update( &mut self, path: &Path, - config: &AppConfig, options: &DisplayOption, tab_options: &TabDisplayOption, ) -> io::Result<()> { @@ -106,9 +52,9 @@ impl DirectoryHistory for JoshutoHistory { }; if need_update { let dirlist = if contains_key { - create_dirlist_with_history(self, path, config, options, tab_options)? + create_dirlist_with_history(self, path, options, tab_options)? } else { - JoshutoDirList::from_path(path.to_path_buf(), config, options, tab_options)? + JoshutoDirList::from_path(path.to_path_buf(), options, tab_options)? }; self.insert(path.to_path_buf(), dirlist); } @@ -118,31 +64,18 @@ impl DirectoryHistory for JoshutoHistory { fn create_or_reload( &mut self, path: &Path, - config: &AppConfig, options: &DisplayOption, tab_options: &TabDisplayOption, ) -> io::Result<()> { let dirlist = if self.contains_key(path) { - create_dirlist_with_history(self, path, config, options, tab_options)? + create_dirlist_with_history(self, path, options, tab_options)? } else { - JoshutoDirList::from_path(path.to_path_buf(), config, options, tab_options)? + JoshutoDirList::from_path(path.to_path_buf(), options, tab_options)? }; self.insert(path.to_path_buf(), dirlist); Ok(()) } - fn reload( - &mut self, - path: &Path, - config: &AppConfig, - options: &DisplayOption, - tab_options: &TabDisplayOption, - ) -> io::Result<()> { - let dirlist = create_dirlist_with_history(self, path, config, options, tab_options)?; - self.insert(path.to_path_buf(), dirlist); - Ok(()) - } - fn depreciate_all_entries(&mut self) { self.iter_mut().for_each(|(_, v)| v.depreciate()); } @@ -167,12 +100,11 @@ fn get_index_of_value(arr: &[JoshutoDirEntry], val: &Path) -> Option<usize> { pub fn create_dirlist_with_history( history: &JoshutoHistory, path: &Path, - config: &AppConfig, options: &DisplayOption, tab_options: &TabDisplayOption, ) -> io::Result<JoshutoDirList> { let filter_func = options.filter_func(); - let mut contents = read_directory(path, filter_func, config, options, tab_options)?; + let mut contents = read_directory(path, filter_func, options, tab_options)?; // re-use directory size information on reload for entry in contents.iter_mut() { @@ -259,8 +191,7 @@ pub fn create_dirlist_with_history( pub fn read_directory<F>( path: &Path, filter_func: F, - config: &AppConfig, - options: &DisplayOption, + display_options: &DisplayOption, tab_options: &TabDisplayOption, ) -> io::Result<Vec<JoshutoDirEntry>> where @@ -276,7 +207,7 @@ where .into_iter() .filter_entry(|e| { if e.path().to_str().cmp(&path.to_str()).is_ne() { - filter_func(e, options, &dirlist_opts) + filter_func(e, display_options, &dirlist_opts) } else { true } @@ -288,8 +219,47 @@ where true } }) - .filter_map(|res| JoshutoDirEntry::from(&res.ok()?, path, config, options).ok()) + .filter_map(|res| JoshutoDirEntry::from(&res.ok()?, path, display_options).ok()) .collect(); Ok(results) } + +pub fn generate_entries_to_root( + path: &Path, + config: &AppConfig, + history: &JoshutoHistory, + ui_context: &UiContext, + display_options: &DisplayOption, + tab_options: &TabDisplayOption, +) -> io::Result<Vec<JoshutoDirList>> { + let mut dirlists = Vec::new(); + + let mut prev: Option<&Path> = None; + for curr in path.ancestors() { + if history.contains_key(curr) { + let mut new_dirlist = + create_dirlist_with_history(history, curr, display_options, tab_options)?; + if let Some(ancestor) = prev.as_ref() { + if let Some(i) = get_index_of_value(&new_dirlist.contents, ancestor) { + new_dirlist.set_index(Some(i), ui_context, display_options); + } + } + dirlists.push(new_dirlist); + } else { + let mut new_dirlist = JoshutoDirList::from_path( + curr.to_path_buf().clone(), + display_options, + tab_options, + )?; + if let Some(ancestor) = prev.as_ref() { + if let Some(i) = get_index_of_value(&new_dirlist.contents, ancestor) { + new_dirlist.set_index(Some(i), ui_context, display_options); + } + } + dirlists.push(new_dirlist); + } + prev = Some(curr); + } + Ok(dirlists) +} |