diff options
Diffstat (limited to 'src/file_browser.rs')
-rw-r--r-- | src/file_browser.rs | 103 |
1 files changed, 59 insertions, 44 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs index 34ab2a6..cdd2284 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -1,6 +1,7 @@ use termion::event::Key; use pathbuftools::PathBufTools; use osstrtools::OsStrTools; +use async_value::Stale; use std::io::Write; use std::sync::{Arc, Mutex, RwLock}; @@ -196,24 +197,33 @@ impl Tabbable for TabView<FileBrowser> { } fn on_config_loaded(&mut self) -> HResult<()> { - // hack: wait a bit for widget readyness... - let duration = std::time::Duration::from_millis(100); - std::thread::sleep(duration); - let show_hidden = self.config().show_hidden(); + for tab in self.widgets.iter_mut() { - tab.left_widget_mut().map(|w| { - w.content.show_hidden = show_hidden; - w.content.dirty_meta.set_dirty(); - w.refresh().log(); - }).ok(); - - tab.main_widget_mut().map(|w| { - w.content.show_hidden = show_hidden; - w.content.dirty_meta.set_dirty(); - w.content.sort(); - w.refresh().log(); - }).ok(); + tab.left_async_widget_mut().map(|async_w| { + async_w.widget.on_ready(move |mut w, _| { + w.as_mut() + .map(|mut w| { + w.content.show_hidden = show_hidden; + w.content.dirty_meta.set_dirty(); + w.refresh().log(); + }).ok(); + Ok(()) + }).log(); + }).log(); + + tab.main_async_widget_mut().map(|async_w| { + async_w.widget.on_ready(move |mut w, _| { + w.as_mut() + .map(|mut w| { + w.content.show_hidden = show_hidden; + w.content.dirty_meta.set_dirty(); + w.content.sort(); + w.refresh().log(); + }).ok(); + Ok(()) + }).log() + }).log(); tab.preview_widget_mut().map(|w| w.config_loaded()).ok(); } @@ -252,7 +262,7 @@ impl FileBrowser { let left_path = main_path.parent().map(|p| p.to_path_buf()); let cache = fs_cache.clone(); - let main_widget = AsyncWidget::new(&core, Box::new(move |_| { + let main_widget = AsyncWidget::new(&core, move |_| { let name = if main_path.parent().is_none() { "root".to_string() } else { @@ -277,11 +287,11 @@ impl FileBrowser { list.refresh().log(); Ok(list) - })); + }); let cache = fs_cache.clone(); if let Some(left_path) = left_path { - let left_widget = AsyncWidget::new(&core, Box::new(move |_| { + let left_widget = AsyncWidget::new(&core, move |_| { let name = if left_path.parent().is_none() { "root".to_string() } else { @@ -303,14 +313,14 @@ impl FileBrowser { list.refresh().log(); Ok(list) - })); + }); let left_widget = FileBrowserWidgets::FileList(left_widget); columns.push_widget(left_widget); } else { - let left_widget = AsyncWidget::new(&core, Box::new(move |_| { + let left_widget = AsyncWidget::new(&core, move |_| { let blank = TextView::new_blank(&core_l); Ok(blank) - })); + }); let left_widget = FileBrowserWidgets::Blank(left_widget); columns.push_widget(left_widget); @@ -372,7 +382,7 @@ impl FileBrowser { let core = self.core.clone(); let cache = self.fs_cache.clone(); - let main_widget = AsyncWidget::new(&core.clone(), Box::new(move |_| { + let main_widget = AsyncWidget::new(&core.clone(), move |_| { let files = match previewer_files { Some(files) => files, None => cache.get_files_sync(&dir)? @@ -389,7 +399,7 @@ impl FileBrowser { list.content.meta_all(); Ok(list) - })); + }); let main_widget = FileBrowserWidgets::FileList(main_widget); self.columns.insert_widget(1, main_widget); @@ -492,9 +502,9 @@ impl FileBrowser { self.cwd = dir.clone(); let main_async_widget = self.main_async_widget_mut()?; - main_async_widget.change_to(Box::new(move |stale, core| { - let (selected_file, files) = cache.get_files(&dir, stale)?; - let files = files.wait()?; + main_async_widget.change_to(move |stale: &Stale, core| { + let (selected_file, files) = cache.get_files(&dir, stale.clone())?; + let files = files.run_sync()?; let mut list = ListView::new(&core, files); @@ -505,14 +515,14 @@ impl FileBrowser { list.select_file(&file); } Ok(list) - })).log(); + }).log(); if let Ok(grand_parent) = self.cwd()?.parent_as_file() { self.left_widget_goto(&grand_parent).log(); } else { - self.left_async_widget_mut()?.change_to(Box::new(move |_,_| { + self.left_async_widget_mut()?.change_to(move |_,_| { HError::stale()? - })).log(); + }).log(); } Ok(()) @@ -530,15 +540,15 @@ impl FileBrowser { let dir = dir.clone(); let left_async_widget = self.left_async_widget_mut()?; - left_async_widget.change_to(Box::new(move |stale, core| { - let cached_files = cache.get_files(&dir, stale)?; + left_async_widget.change_to(move |stale, core| { + let cached_files = cache.get_files(&dir, stale.clone())?; let (_, files) = cached_files; - let files = files.wait()?; + let files = files.run_sync()?; let list = ListView::new(&core, files); Ok(list) - }))?; + })?; Ok(()) } @@ -552,19 +562,19 @@ impl FileBrowser { if let Ok(left_dir) = new_cwd.parent_as_file() { let cache = self.fs_cache.clone(); - let left_widget = AsyncWidget::new(&core.clone(), Box::new(move |_| { + let left_widget = AsyncWidget::new(&core.clone(), move |_| { let files = cache.get_files_sync(&left_dir)?; let list = ListView::new(&core, files); Ok(list) - })); + }); let left_widget = FileBrowserWidgets::FileList(left_widget); self.columns.prepend_widget(left_widget); } else { - let left_widget = AsyncWidget::new(&core.clone(), Box::new(move |_| { + let left_widget = AsyncWidget::new(&core.clone(), move |_| { let blank = TextView::new_blank(&core); Ok(blank) - })); + }); let left_widget = FileBrowserWidgets::Blank(left_widget); self.columns.prepend_widget(left_widget); @@ -669,9 +679,9 @@ impl FileBrowser { pub fn take_main_files(&mut self) -> HResult<Files> { let core = self.core.clone(); - let blank = AsyncWidget::new(&core.clone(), Box::new(move |_| { + let blank = AsyncWidget::new(&core.clone(), move |_| { HError::no_files() - })); + }); let blank = FileBrowserWidgets::Blank(blank); let old_widget = self.columns.replace_widget(1, blank); @@ -685,9 +695,9 @@ impl FileBrowser { pub fn take_left_files(&mut self) -> HResult<Files> { let core = self.core.clone(); - let blank = AsyncWidget::new(&core.clone(), Box::new(move |_| { + let blank = AsyncWidget::new(&core.clone(), move |_| { HError::no_files() - })); + }); let blank = FileBrowserWidgets::FileList(blank); let old_widget = self.columns.replace_widget(0, blank); @@ -930,9 +940,14 @@ impl FileBrowser { let file = File::new_from_path(&path, None)?; let dir = file.parent_as_file()?; - self.main_widget_goto_wait(&dir).log(); + self.main_widget_goto(&dir).log(); - self.main_widget_mut()?.select_file(&file); + self.main_async_widget_mut()? + .widget + .on_ready(move |w, _| { + w?.select_file(&file); + Ok(()) + })?; } } else { let msg = format!("Can't access path: {}!", |