summaryrefslogtreecommitdiffstats
path: root/src/preview
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2022-08-31 12:48:34 -0400
committerJeff Zhao <jeff.no.zhao@gmail.com>2022-08-31 12:48:34 -0400
commit78e23d75de3ece52c91bb9aeb1bceb085e1fe557 (patch)
treeb95569193fb20368b0c2be139d8f5b754acde569 /src/preview
parent639307ab5ed2683ff25eb9e5310dcf6a9fb3dff3 (diff)
rework previews to have loading state as well
Diffstat (limited to 'src/preview')
-rw-r--r--src/preview/preview_default.rs22
-rw-r--r--src/preview/preview_dir.rs15
-rw-r--r--src/preview/preview_file.rs25
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);
}
}
});