cache directory contents(/selections/settings/...)

This commit is contained in:
rabite 2019-03-09 12:10:57 +01:00
parent 5d45653901
commit 8cd72e3004
3 changed files with 66 additions and 11 deletions

View File

@ -55,6 +55,7 @@ pub struct FileBrowser {
pub columns: MillerColumns<FileBrowserWidgets>, pub columns: MillerColumns<FileBrowserWidgets>,
pub cwd: File, pub cwd: File,
selections: HashMap<File, File>, selections: HashMap<File, File>,
cached_files: HashMap<File, Files>,
core: WidgetCore, core: WidgetCore,
watcher: INotifyWatcher, watcher: INotifyWatcher,
watches: Vec<PathBuf>, watches: Vec<PathBuf>,
@ -196,6 +197,7 @@ impl FileBrowser {
Ok(FileBrowser { columns: miller, Ok(FileBrowser { columns: miller,
cwd: cwd, cwd: cwd,
selections: HashMap::new(), selections: HashMap::new(),
cached_files: HashMap::new(),
core: core.clone(), core: core.clone(),
watcher: watcher, watcher: watcher,
watches: vec![], watches: vec![],
@ -230,10 +232,17 @@ impl FileBrowser {
let dir = dir.clone(); let dir = dir.clone();
let selected_file = self.get_selection(&dir).ok().cloned(); let selected_file = self.get_selection(&dir).ok().cloned();
self.get_files().and_then(|files| self.cache_files(files)).log();
let cached_files = self.get_cached_files(&dir).ok();
let main_widget = self.main_widget_mut()?; let main_widget = self.main_widget_mut()?;
main_widget.change_to(Box::new(move |stale, core| { main_widget.change_to(Box::new(move |stale, core| {
let path = dir.path(); let path = dir.path();
let files = Files::new_from_path_cancellable(&path, stale)?; let cached_files = cached_files.clone();
let files = cached_files.or_else(|| {
Files::new_from_path_cancellable(&path, stale).ok()
})?;
let mut list = ListView::new(&core, files); let mut list = ListView::new(&core, files);
@ -253,12 +262,19 @@ impl FileBrowser {
} }
pub fn left_widget_goto(&mut self, dir: &File) -> HResult<()> { pub fn left_widget_goto(&mut self, dir: &File) -> HResult<()> {
self.get_left_files().and_then(|files| self.cache_files(files)).log();
let cached_files = self.get_cached_files(&dir).ok();
let dir = dir.clone(); let dir = dir.clone();
let left_widget = self.left_widget_mut()?; let left_widget = self.left_widget_mut()?;
left_widget.change_to(Box::new(move |stale, core| { left_widget.change_to(Box::new(move |stale, core| {
let path = dir.path(); let path = dir.path();
let files = Files::new_from_path_cancellable(&path, stale)?; let cached_files = cached_files.clone();
let files = cached_files.or_else(|| {
Files::new_from_path_cancellable(&path, stale).ok()
})?;
let list = ListView::new(&core, files); let list = ListView::new(&core, files);
Ok(list) Ok(list)
}))?; }))?;
@ -277,8 +293,9 @@ impl FileBrowser {
if !self.main_widget()?.ready() { return Ok(()) } if !self.main_widget()?.ready() { return Ok(()) }
let file = self.selected_file()?.clone(); let file = self.selected_file()?.clone();
let selection = self.get_selection(&file).ok().cloned(); let selection = self.get_selection(&file).ok().cloned();
let cached_files = self.get_cached_files(&file).ok();
let preview = self.preview_widget_mut()?; let preview = self.preview_widget_mut()?;
preview.set_file(&file, selection); preview.set_file(&file, selection, cached_files);
Ok(()) Ok(())
} }
@ -297,6 +314,24 @@ impl FileBrowser {
Ok(self.selections.get(dir)?) Ok(self.selections.get(dir)?)
} }
pub fn get_files(&mut self) -> HResult<Files> {
Ok(self.main_widget()?.widget()?.lock()?.as_ref()?.content.clone())
}
pub fn get_left_files(&mut self) -> HResult<Files> {
Ok(self.left_widget()?.widget()?.lock()?.as_ref()?.content.clone())
}
pub fn cache_files(&mut self, files: Files) -> HResult<()> {
let dir = files.directory.clone();
self.cached_files.insert(dir, files);
Ok(())
}
pub fn get_cached_files(&mut self, dir: &File) -> HResult<Files> {
Ok(self.cached_files.get(dir)?.clone())
}
pub fn save_selection(&mut self) -> HResult<()> { pub fn save_selection(&mut self) -> HResult<()> {
let cwd = self.cwd()?.clone(); let cwd = self.cwd()?.clone();
if let Ok(main_selection) = self.selected_file() { if let Ok(main_selection) = self.selected_file() {

View File

@ -21,7 +21,7 @@ lazy_static! {
static ref COLORS: LsColors = LsColors::from_env().unwrap(); static ref COLORS: LsColors = LsColors::from_env().unwrap();
} }
#[derive(PartialEq, Clone, Debug)] #[derive(PartialEq, Eq, Hash, Clone, Debug)]
pub struct Files { pub struct Files {
pub directory: File, pub directory: File,
pub files: Vec<File>, pub files: Vec<File>,
@ -277,7 +277,7 @@ impl std::fmt::Display for SortBy {
} }
} }
#[derive(Debug, Copy, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum SortBy { pub enum SortBy {
Name, Name,
Size, Size,

View File

@ -82,6 +82,11 @@ impl<T: Send + 'static> WillBe<T> where {
Ok(()) Ok(())
} }
pub fn take(&mut self) -> HResult<T> {
self.check()?;
Ok(self.thing.lock()?.take()?)
}
pub fn check(&self) -> HResult<()> { pub fn check(&self) -> HResult<()> {
match *self.state.lock()? { match *self.state.lock()? {
State::Is => Ok(()), State::Is => Ok(()),
@ -161,6 +166,9 @@ impl<T: Widget + Send + 'static> WillBeWidget<T> {
_ => false _ => false
} }
} }
pub fn take(&mut self) -> HResult<T> {
self.willbe.take()
}
} }
// impl<T: Widget + Send> WillBeWidget<T> { // impl<T: Widget + Send> WillBeWidget<T> {
@ -230,7 +238,8 @@ pub struct Previewer {
widget: WillBeWidget<Box<dyn Widget + Send>>, widget: WillBeWidget<Box<dyn Widget + Send>>,
core: WidgetCore, core: WidgetCore,
file: Option<File>, file: Option<File>,
selection: Option<File> selection: Option<File>,
cached_files: Option<Files>
} }
@ -244,7 +253,8 @@ impl Previewer {
Previewer { widget: willbe, Previewer { widget: willbe,
core: core.clone(), core: core.clone(),
file: None, file: None,
selection: None } selection: None,
cached_files: None }
} }
fn become_preview(&mut self, fn become_preview(&mut self,
@ -254,10 +264,14 @@ impl Previewer {
self.widget.set_coordinates(&coordinates).ok(); self.widget.set_coordinates(&coordinates).ok();
} }
pub fn set_file(&mut self, file: &File, selection: Option<File>) { pub fn set_file(&mut self,
file: &File,
selection: Option<File>,
cached_files: Option<Files>) {
if Some(file) == self.file.as_ref() { return } if Some(file) == self.file.as_ref() { return }
self.file = Some(file.clone()); self.file = Some(file.clone());
self.selection = selection.clone(); self.selection = selection.clone();
self.cached_files = cached_files.clone();
let coordinates = self.get_coordinates().unwrap().clone(); let coordinates = self.get_coordinates().unwrap().clone();
let file = file.clone(); let file = file.clone();
@ -270,10 +284,12 @@ impl Previewer {
let file = file.clone(); let file = file.clone();
let selection = selection.clone(); let selection = selection.clone();
let cached_files = cached_files.clone();
if file.kind == Kind::Directory { if file.kind == Kind::Directory {
let preview = Previewer::preview_dir(&file, let preview = Previewer::preview_dir(&file,
selection, selection,
cached_files,
&core, &core,
stale.clone()); stale.clone());
return preview; return preview;
@ -298,7 +314,8 @@ impl Previewer {
pub fn reload(&mut self) { pub fn reload(&mut self) {
if let Some(file) = self.file.clone() { if let Some(file) = self.file.clone() {
self.file = None; self.file = None;
self.set_file(&file, self.selection.clone()); let cache = self.cached_files.take();
self.set_file(&file, self.selection.clone(), cache);
} }
} }
@ -308,11 +325,14 @@ impl Previewer {
fn preview_dir(file: &File, fn preview_dir(file: &File,
selection: Option<File>, selection: Option<File>,
cached_files: Option<Files>,
core: &WidgetCore, core: &WidgetCore,
stale: Arc<Mutex<bool>>) stale: Arc<Mutex<bool>>)
-> Result<WidgetO, HError> { -> Result<WidgetO, HError> {
let files = Files::new_from_path_cancellable(&file.path, let files = cached_files.or_else(|| {
stale.clone())?; Files::new_from_path_cancellable(&file.path,
stale.clone()).ok()
})?;
let len = files.len(); let len = files.len();
if len == 0 || is_stale(&stale)? { return Previewer::preview_failed(&file) } if len == 0 || is_stale(&stale)? { return Previewer::preview_failed(&file) }