diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-06-21 10:32:07 -0400 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-06-21 10:46:47 -0400 |
commit | 58ad2824f631dcf8ff2a3f267733ffc0c302b3b3 (patch) | |
tree | 5d8b805c2eba9f3d3c7dd218e37ae524efc4e0d8 /src/preview | |
parent | 0b5f098109c3dc8c488d5d8e6eee06e278f2ce4e (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.rs | 6 | ||||
-rw-r--r-- | src/preview/preview_default.rs | 27 | ||||
-rw-r--r-- | src/preview/preview_dir.rs | 48 | ||||
-rw-r--r-- | src/preview/preview_file.rs | 86 | ||||
-rw-r--r-- | src/preview/preview_sh.rs | 15 |
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 - } -} |