diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2022-08-31 12:48:34 -0400 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2022-08-31 12:48:34 -0400 |
commit | 78e23d75de3ece52c91bb9aeb1bceb085e1fe557 (patch) | |
tree | b95569193fb20368b0c2be139d8f5b754acde569 /src/preview | |
parent | 639307ab5ed2683ff25eb9e5310dcf6a9fb3dff3 (diff) |
rework previews to have loading state as well
Diffstat (limited to 'src/preview')
-rw-r--r-- | src/preview/preview_default.rs | 22 | ||||
-rw-r--r-- | src/preview/preview_dir.rs | 15 | ||||
-rw-r--r-- | src/preview/preview_file.rs | 25 |
3 files changed, 41 insertions, 21 deletions
diff --git a/src/preview/preview_default.rs b/src/preview/preview_default.rs index 22e709f..002f5c0 100644 --- a/src/preview/preview_default.rs +++ b/src/preview/preview_default.rs @@ -4,17 +4,7 @@ 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 { - matches!(*self, Self::Loading) - } -} +use super::preview_file::PreviewFileState; pub fn load_preview_path(context: &mut AppContext, p: path::PathBuf, metadata: JoshutoMetadata) { let preview_options = context.config_ref().preview_options_ref(); @@ -39,11 +29,11 @@ pub fn load_preview_path(context: &mut AppContext, p: path::PathBuf, metadata: J } else if metadata.len() <= preview_options.max_preview_size { let need_to_load = context .preview_context_ref() - .get_preview_ref(p.as_path()) - .map(|p| { - p.as_ref() - .map(|p| p.modified < metadata.modified()) - .unwrap_or(true) + .previews_ref() + .get(p.as_path()) + .map(|data| match data { + PreviewFileState::Success { data } => data.modified < metadata.modified(), + _ => false, }) .unwrap_or(true); diff --git a/src/preview/preview_dir.rs b/src/preview/preview_dir.rs index ab0931b..77090a3 100644 --- a/src/preview/preview_dir.rs +++ b/src/preview/preview_dir.rs @@ -4,7 +4,18 @@ use std::thread; use crate::context::AppContext; use crate::event::AppEvent; use crate::fs::JoshutoDirList; -use crate::preview::preview_default::PreviewState; + +#[derive(Debug, Clone)] +pub enum PreviewDirState { + Loading, + Error { message: String }, +} + +impl PreviewDirState { + pub fn is_loading(&self) -> bool { + matches!(*self, Self::Loading) + } +} pub struct Background {} @@ -24,7 +35,7 @@ impl Background { .tab_context_mut() .curr_tab_mut() .history_metadata_mut() - .insert(p.clone(), PreviewState::Loading); + .insert(p.clone(), PreviewDirState::Loading); thread::spawn(move || { let path_clone = p.clone(); diff --git a/src/preview/preview_file.rs b/src/preview/preview_file.rs index d89ee4b..25a9580 100644 --- a/src/preview/preview_file.rs +++ b/src/preview/preview_file.rs @@ -6,6 +6,12 @@ use std::time; use crate::context::AppContext; use crate::event::AppEvent; +pub enum PreviewFileState { + Loading, + Error { message: String }, + Success { data: FilePreview }, +} + #[derive(Clone, Debug)] pub struct FilePreview { pub status: std::process::ExitStatus, @@ -32,7 +38,7 @@ impl std::convert::From<Output> for FilePreview { pub struct Background {} impl Background { - pub fn preview_path_with_script(context: &AppContext, path: path::PathBuf) { + pub fn preview_path_with_script(context: &mut AppContext, path: path::PathBuf) { let preview_options = context.config_ref().preview_options_ref(); if let Some(script) = preview_options.preview_script.as_ref() { let ui_context = context.ui_context_ref(); @@ -50,6 +56,11 @@ impl Background { let script = script.clone(); let event_tx = context.clone_event_tx(); + context + .preview_context_mut() + .previews_mut() + .insert(path.clone(), PreviewFileState::Loading); + let _ = thread::spawn(move || { let file_full_path = path.as_path(); @@ -70,10 +81,18 @@ impl Background { match res { Ok(output) => { let preview = FilePreview::from(output); - let _ = event_tx.send(AppEvent::PreviewFile(path, Box::new(Ok(preview)))); + let res = AppEvent::PreviewFile { + path, + res: Box::new(Ok(preview)), + }; + let _ = event_tx.send(res); } Err(e) => { - let _ = event_tx.send(AppEvent::PreviewFile(path, Box::new(Err(e)))); + let res = AppEvent::PreviewFile { + path, + res: Box::new(Err(e)), + }; + let _ = event_tx.send(res); } } }); |