summaryrefslogtreecommitdiffstats
path: root/src/preview
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2022-08-31 12:13:55 -0400
committerJeff Zhao <jeff.no.zhao@gmail.com>2022-08-31 12:13:55 -0400
commit39b131a910ab8da1df2385280367e3fcc0750fb6 (patch)
treeaeb6640522e08a5242cbc2143fd294dc5cedb407 /src/preview
parent0ca4ffd657f1a2884ca8422be8a78baa42f00de4 (diff)
more fine grain error handling for previewing directories
Diffstat (limited to 'src/preview')
-rw-r--r--src/preview/preview_default.rs34
-rw-r--r--src/preview/preview_dir.rs20
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);
})
}
}