diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2022-08-31 12:13:55 -0400 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2022-08-31 12:13:55 -0400 |
commit | 39b131a910ab8da1df2385280367e3fcc0750fb6 (patch) | |
tree | aeb6640522e08a5242cbc2143fd294dc5cedb407 /src/preview | |
parent | 0ca4ffd657f1a2884ca8422be8a78baa42f00de4 (diff) |
more fine grain error handling for previewing directories
Diffstat (limited to 'src/preview')
-rw-r--r-- | src/preview/preview_default.rs | 34 | ||||
-rw-r--r-- | src/preview/preview_dir.rs | 20 |
2 files changed, 44 insertions, 10 deletions
diff --git a/src/preview/preview_default.rs b/src/preview/preview_default.rs index bb5ea64..9f2fb66 100644 --- a/src/preview/preview_default.rs +++ b/src/preview/preview_default.rs @@ -4,17 +4,37 @@ use crate::context::AppContext; use crate::fs::JoshutoMetadata; use crate::preview::{preview_dir, preview_file}; +#[derive(Debug, Clone)] +pub enum PreviewState { + Loading, + Error { message: String }, +} + +impl PreviewState { + pub fn is_loading(&self) -> bool { + match *self { + Self::Loading => true, + _ => false, + } + } +} + pub fn load_preview_path(context: &mut AppContext, p: path::PathBuf, metadata: JoshutoMetadata) { let preview_options = context.config_ref().preview_options_ref(); - if metadata.is_dir() { - let need_to_load = context - .tab_context_ref() - .curr_tab_ref() - .history_ref() + let tab = context.tab_context_ref().curr_tab_ref(); + // only load if there doesn't already exist a loading thread and + // there isn't an entry in history + let need_to_load = tab + .history_metadata_ref() .get(p.as_path()) - .map(|e| e.need_update()) - .unwrap_or(true); + .map(|m| m.is_loading()) + .unwrap_or(true) + && tab + .history_ref() + .get(p.as_path()) + .map(|e| e.need_update()) + .unwrap_or(true); if need_to_load { preview_dir::Background::load_preview(context, p); diff --git a/src/preview/preview_dir.rs b/src/preview/preview_dir.rs index cf592a9..ab0931b 100644 --- a/src/preview/preview_dir.rs +++ b/src/preview/preview_dir.rs @@ -4,6 +4,7 @@ use std::thread; use crate::context::AppContext; use crate::event::AppEvent; use crate::fs::JoshutoDirList; +use crate::preview::preview_default::PreviewState; pub struct Background {} @@ -16,11 +17,24 @@ impl Background { .curr_tab_ref() .option_ref() .clone(); + let tab_id = context.tab_context_ref().curr_tab_id(); + + // add to loading state + context + .tab_context_mut() + .curr_tab_mut() + .history_metadata_mut() + .insert(p.clone(), PreviewState::Loading); thread::spawn(move || { - if let Ok(dirlist) = JoshutoDirList::from_path(p, &options, &tab_options) { - let _ = event_tx.send(AppEvent::PreviewDir(Ok(Box::new(dirlist)))); - } + let path_clone = p.clone(); + let dir_res = JoshutoDirList::from_path(p, &options, &tab_options); + let res = AppEvent::PreviewDir { + id: tab_id, + path: path_clone, + res: Box::new(dir_res), + }; + let _ = event_tx.send(res); }) } } |