summaryrefslogtreecommitdiffstats
path: root/src/history.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/history.rs')
-rw-r--r--src/history.rs130
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)
+}