diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/file_browser.rs | 57 | ||||
-rw-r--r-- | src/files.rs | 29 |
2 files changed, 41 insertions, 45 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs index 2da07f6..c0b0a0f 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -255,7 +255,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, move |_| { + let main_widget = AsyncWidget::new(&core, move |stale| { let name = if main_path.parent().is_none() { "root".to_string() } else { @@ -266,16 +266,16 @@ impl FileBrowser { let main_dir = File::new(&name, main_path.clone(), None); - let mut files = cache.get_files_sync(&main_dir)?; - let selection = cache.get_selection(&main_dir).ok(); + let (selected_file, files) = cache.get_files(&main_dir, + stale.clone())?; + let mut files = files.run_sync()?; files.meta_all(); let mut list = ListView::new(&core_m.clone(), files); - if let Some(file) = selection { - list.select_file(&file); - } + selected_file.map(|f| list.select_file(&f)); + list.refresh().log(); @@ -284,7 +284,7 @@ impl FileBrowser { let cache = fs_cache.clone(); if let Some(left_path) = left_path { - let left_widget = AsyncWidget::new(&core, move |_| { + let left_widget = AsyncWidget::new(&core, move |stale| { let name = if left_path.parent().is_none() { "root".to_string() } else { @@ -295,14 +295,12 @@ impl FileBrowser { let left_dir = File::new(&name, left_path.clone(), None); - let files = cache.get_files_sync(&left_dir)?; - let selection = cache.get_selection(&left_dir).ok(); - let mut list = ListView::new(&core_l, - files); - if let Some(file) = selection { - list.select_file(&file); - } + let (selected_file, files) = cache.get_files(&left_dir, + stale.clone())?; + let files = files.run_sync()?; + let mut list = ListView::new(&core_l, files); + selected_file.map(|f| list.select_file(&f)); list.refresh().log(); Ok(list) @@ -375,20 +373,20 @@ impl FileBrowser { let core = self.core.clone(); let cache = self.fs_cache.clone(); - let main_widget = AsyncWidget::new(&core.clone(), move |_| { - let files = match previewer_files { - Some(files) => files, - None => cache.get_files_sync(&dir)? + let main_widget = AsyncWidget::new(&core.clone(), move |stale| { + let (selected_file, files) = match previewer_files { + Some(files) => (None, files), + None => { + let (selected_file, files) = cache.get_files(&dir, + stale.clone())?; + let files = files.run_sync()?; + (selected_file, files) + } }; - let selection = cache.get_selection(&dir).ok(); - let mut list = ListView::new(&core, files); - if let Some(file) = selection { - list.select_file(&file); - } - + selected_file.map(|f| list.select_file(&f)); list.content.meta_all(); Ok(list) @@ -557,9 +555,12 @@ 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(), move |_| { - let files = cache.get_files_sync(&left_dir)?; - let list = ListView::new(&core, files); + let left_widget = AsyncWidget::new(&core.clone(), move |stale| { + let (selected_file, files) = cache.get_files(&left_dir, + stale.clone())?; + let files = files.run_sync()?; + let mut list = ListView::new(&core, files); + selected_file.map(|f| list.select_file(&f)); Ok(list) }); @@ -674,7 +675,7 @@ impl FileBrowser { } let preview = self.preview_widget_mut()?; - preview.set_file(file).log(); + preview.set_file(&file).log(); Ok(()) } diff --git a/src/files.rs b/src/files.rs index 25d21ad..7720aa7 100644 --- a/src/files.rs +++ b/src/files.rs @@ -190,26 +190,12 @@ impl RefreshPackage { // Files added, removed, renamed to hidden, etc... files.recalculate_len(); - let new_len = files.len(); - // Need to unpack this to prevent issue with recursive Files type - // Also, if no files remain add placeholder - let files = if files.len() > 0 { - // Sort again to make sure new/changed files are in correct order - files.sort(); - files.files - } else { - let placeholder = File::new_placeholder(&files.directory.path).unwrap(); - files.files.push(placeholder); - - // Need to sort because of possible hidden files - files.sort(); - files.files - }; + files.sort(); + // Prerender new buffer in current thread let mut old_buffer = old_buffer; - // Prerender new buffer in current thread - let new_buffer = files.iter() + let new_buffer = files.iter_files() .map(|file| { match list_pos_map.get(&file) { Some(&old_pos) => @@ -221,6 +207,15 @@ impl RefreshPackage { } }).collect(); + // Need to unpack this to prevent issue with recursive Files type + // Also, if no files remain add placeholder and set len + let (files, new_len) = if files.len() > 0 { + (files.files, files.len) + } else { + let placeholder = File::new_placeholder(&files.directory.path).unwrap(); + files.files.push(placeholder); + (files.files, 1) + }; RefreshPackage { |