summaryrefslogtreecommitdiffstats
path: root/src/preview
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2021-06-21 10:32:07 -0400
committerJeff Zhao <jeff.no.zhao@gmail.com>2021-06-21 10:46:47 -0400
commit58ad2824f631dcf8ff2a3f267733ffc0c302b3b3 (patch)
tree5d8b805c2eba9f3d3c7dd218e37ae524efc4e0d8 /src/preview
parent0b5f098109c3dc8c488d5d8e6eee06e278f2ce4e (diff)
refactor previewing code
- event.rs is moved out of utils as its an integral part of the codebase - load_child.rs has been replaced with preview module - moved previewing logic inside run.rs instead of spreading it across multiple commands
Diffstat (limited to 'src/preview')
-rw-r--r--src/preview/mod.rs6
-rw-r--r--src/preview/preview_default.rs27
-rw-r--r--src/preview/preview_dir.rs48
-rw-r--r--src/preview/preview_file.rs86
-rw-r--r--src/preview/preview_sh.rs15
5 files changed, 164 insertions, 18 deletions
diff --git a/src/preview/mod.rs b/src/preview/mod.rs
index 6a3e7fd..ebab23f 100644
--- a/src/preview/mod.rs
+++ b/src/preview/mod.rs
@@ -1,3 +1,3 @@
-pub mod preview_sh;
-
-pub use self::preview_sh::preview_with_script;
+pub mod preview_default;
+pub mod preview_dir;
+pub mod preview_file;
diff --git a/src/preview/preview_default.rs b/src/preview/preview_default.rs
new file mode 100644
index 0000000..9601800
--- /dev/null
+++ b/src/preview/preview_default.rs
@@ -0,0 +1,27 @@
+use std::path;
+
+use crate::context::AppContext;
+use crate::preview::{preview_dir, preview_file};
+use crate::ui::TuiBackend;
+
+pub fn load_preview_path(context: &mut AppContext, backend: &mut TuiBackend, p: path::PathBuf) {
+ if p.is_dir() {
+ preview_dir::load_preview(context, p);
+ } else if p.is_file() {
+ preview_file::preview_path_with_script(context, backend, p);
+ }
+}
+
+pub fn load_preview(context: &mut AppContext, backend: &mut TuiBackend) {
+ let mut p: Option<path::PathBuf> = None;
+ if let Some(curr_list) = context.tab_context_ref().curr_tab_ref().curr_list_ref() {
+ if let Some(index) = curr_list.index {
+ let entry = &curr_list.contents[index];
+ p = Some(entry.file_path().to_path_buf())
+ }
+ }
+
+ if let Some(p) = p {
+ load_preview_path(context, backend, p);
+ }
+}
diff --git a/src/preview/preview_dir.rs b/src/preview/preview_dir.rs
new file mode 100644
index 0000000..bf1d151
--- /dev/null
+++ b/src/preview/preview_dir.rs
@@ -0,0 +1,48 @@
+use std::io;
+use std::path;
+use std::thread;
+
+use crate::context::AppContext;
+use crate::event::AppEvent;
+use crate::history::DirectoryHistory;
+
+pub fn load_preview(context: &mut AppContext, p: path::PathBuf) -> io::Result<path::PathBuf> {
+ // get preview
+ let options = context.config_ref().display_options_ref().clone();
+ context
+ .tab_context_mut()
+ .curr_tab_mut()
+ .history_mut()
+ .create_or_soft_update(p.as_path(), &options)?;
+ Ok(p)
+}
+
+pub struct CursorDir {}
+
+impl CursorDir {
+ pub fn load(context: &mut AppContext) -> io::Result<()> {
+ let mut p: Option<path::PathBuf> = None;
+ if let Some(curr_list) = context.tab_context_ref().curr_tab_ref().curr_list_ref() {
+ if let Some(index) = curr_list.index {
+ let entry = &curr_list.contents[index];
+ p = Some(entry.file_path().to_path_buf())
+ }
+ }
+
+ let res = match p {
+ Some(p) if p.is_dir() => load_preview(context, p),
+ Some(p) => Err(io::Error::new(
+ io::ErrorKind::InvalidData,
+ "Not a directory".to_string(),
+ )),
+ None => Err(io::Error::new(
+ io::ErrorKind::NotFound,
+ "No such file or directory".to_string(),
+ )),
+ };
+ match res {
+ Ok(_) => Ok(()),
+ Err(e) => Err(e),
+ }
+ }
+}
diff --git a/src/preview/preview_file.rs b/src/preview/preview_file.rs
new file mode 100644
index 0000000..5aabb13
--- /dev/null
+++ b/src/preview/preview_file.rs
@@ -0,0 +1,86 @@
+use std::io;
+use std::path;
+use std::process::{Command, Output};
+
+use tui::layout::{Constraint, Direction, Layout, Rect};
+use tui::widgets::{Block, Borders};
+
+use crate::context::AppContext;
+use crate::ui::TuiBackend;
+
+pub fn preview_path_with_script(
+ context: &AppContext,
+ backend: &mut TuiBackend,
+ p: path::PathBuf,
+) -> io::Result<Output> {
+ let preview_options = context.config_ref().preview_options_ref();
+ let config = context.config_ref();
+
+ match preview_options.preview_script.as_ref() {
+ None => Err(io::Error::new(
+ io::ErrorKind::Other,
+ "No preview script specified",
+ )),
+ Some(script) => {
+ let area = backend.terminal.as_ref().unwrap().size().unwrap();
+
+ let constraints: &[Constraint; 3] = &config.display_options_ref().default_layout;
+
+ let layout_rect = if config.display_options_ref().show_borders() {
+ let area = Rect {
+ y: area.top() + 1,
+ height: area.height - 2,
+ ..area
+ };
+
+ let block = Block::default().borders(Borders::ALL);
+ let inner = block.inner(area);
+
+ let layout_rect = Layout::default()
+ .direction(Direction::Horizontal)
+ .constraints(constraints.as_ref())
+ .split(inner);
+
+ let block = Block::default().borders(Borders::LEFT);
+ let inner3 = block.inner(layout_rect[2]);
+ inner3
+ } else {
+ let layout_rect = Layout::default()
+ .direction(Direction::Horizontal)
+ .vertical_margin(1)
+ .constraints(constraints.as_ref())
+ .split(area);
+ layout_rect[2]
+ };
+
+ let file_full_path = p.as_path();
+ let preview_width = layout_rect.width;
+ let preview_height = layout_rect.height;
+ let image_cache = 0;
+ let preview_image = if preview_options.preview_images { 1 } else { 0 };
+
+ // spawn preview process
+ Command::new(script)
+ .arg(file_full_path)
+ .arg(preview_width.to_string())
+ .arg(preview_height.to_string())
+ .arg(image_cache.to_string())
+ .arg(preview_image.to_string())
+ .output()
+ }
+ }
+}
+
+pub fn preview_with_script(context: &AppContext, backend: &mut TuiBackend) -> io::Result<Output> {
+ let curr_tab = context.tab_context_ref().curr_tab_ref();
+ let child_list = curr_tab.child_list_ref();
+
+ let preview_options = context.config_ref().preview_options_ref();
+
+ let config = context.config_ref();
+
+ match child_list.and_then(|list| list.curr_entry_ref()) {
+ None => Err(io::Error::new(io::ErrorKind::Other, "No file to preview")),
+ Some(entry) => preview_path_with_script(context, backend, entry.file_path().to_path_buf()),
+ }
+}
diff --git a/src/preview/preview_sh.rs b/src/preview/preview_sh.rs
deleted file mode 100644
index 9d66ab4..0000000
--- a/src/preview/preview_sh.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-use crate::context::AppContext;
-use crate::ui::TuiBackend;
-
-pub fn preview_with_script(context: &AppContext, backend: &mut TuiBackend) {
- let preview_options = context.config_ref().preview_options_ref();
- if let Some(script_path) = preview_options.preview_script.as_ref() {
- let file_full_path = 0;
- let preview_width = 0;
- let preview_height = 0;
- let image_cache = 0;
- let preview_image = if preview_options.preview_images { 1 } else { 0 };
-
- // spawn preview process
- }
-}