diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-09-25 12:59:08 -0400 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-09-25 12:59:08 -0400 |
commit | cbfdb2c715f47944e10b4a74e8fc74c1b51977de (patch) | |
tree | d56751a4888ff2162f2dbebbe5e5938c51f33ca4 | |
parent | 281da8fcc27563530289046838bb50d340fa33ce (diff) |
show_workers can close with custom key via --exit-key option
-rw-r--r-- | config/keymap.toml | 2 | ||||
-rw-r--r-- | src/commands/key_command.rs | 28 | ||||
-rw-r--r-- | src/commands/show_workers.rs | 7 | ||||
-rw-r--r-- | src/config/keymap/keymapping.rs | 2 | ||||
-rw-r--r-- | src/config/keymap/mod.rs | 2 | ||||
-rw-r--r-- | src/ui/views/tui_worker_view.rs | 14 | ||||
-rw-r--r-- | src/util/keyparse.rs (renamed from src/config/keymap/keyparse.rs) | 0 | ||||
-rw-r--r-- | src/util/mod.rs | 1 |
8 files changed, 40 insertions, 16 deletions
diff --git a/config/keymap.toml b/config/keymap.toml index 5e351c5..606d0c1 100644 --- a/config/keymap.toml +++ b/config/keymap.toml @@ -56,7 +56,7 @@ mapcommand = [ { keys = [ " " ], command = "select --toggle=true" }, { keys = [ "t" ], command = "select --all=true --toggle=true" }, - { keys = [ "w" ], command = "show_workers --exit=w" }, + { keys = [ "w" ], command = "show_workers --exit-key=w" }, { keys = [ "b", "b" ], command = "bulk_rename" }, { keys = [ "=" ], command = "set_mode" }, diff --git a/src/commands/key_command.rs b/src/commands/key_command.rs index 8032aa8..6f407a2 100644 --- a/src/commands/key_command.rs +++ b/src/commands/key_command.rs @@ -1,9 +1,12 @@ use std::path; +use termion::event::Key; + use crate::context::AppContext; use crate::error::{JoshutoError, JoshutoErrorKind, JoshutoResult}; use crate::io::IoWorkerOptions; use crate::ui::TuiBackend; +use crate::util::keyparse::str_to_key; use crate::util::select::SelectOption; use crate::util::sort::SortType; @@ -63,7 +66,7 @@ pub enum KeyCommand { SelectFiles(String, SelectOption), SetMode, SubProcess(Vec<String>, bool), - ShowWorkers, + ShowWorkers(Key), ToggleHiddenFiles, @@ -127,7 +130,7 @@ impl KeyCommand { Self::SetMode => "set_mode", Self::SubProcess(_, false) => "shell", Self::SubProcess(_, true) => "spawn", - Self::ShowWorkers => "show_workers", + Self::ShowWorkers(_) => "show_workers", Self::ToggleHiddenFiles => "toggle_hidden", @@ -330,7 +333,24 @@ impl std::str::FromStr for KeyCommand { format!("{}: {}", arg, e), )), }, - "show_workers" => Ok(Self::ShowWorkers), + "show_workers" => match shell_words::split(arg) { + Ok(args) => { + let mut exit_key = Key::Esc; + for arg in args.iter() { + if let Some(key_str) = arg.strip_prefix("--exit-key=") { + match str_to_key(key_str) { + Some(key) => exit_key = key, + _ => eprintln!("Error: failed to parse key '{}'", arg), + } + } + } + Ok(Self::ShowWorkers(exit_key)) + }, + Err(e) => Err(JoshutoError::new( + JoshutoErrorKind::InvalidParameters, + format!("{}: {}", arg, e), + )), + } "sort" => match arg { "reverse" => Ok(Self::SortReverse), arg => match SortType::parse(arg) { @@ -422,7 +442,7 @@ impl AppExecute for KeyCommand { Self::SubProcess(v, spawn) => { sub_process::sub_process(context, backend, v.as_slice(), *spawn) } - Self::ShowWorkers => show_workers::show_workers(context, backend), + Self::ShowWorkers(k) => show_workers::show_workers(context, backend, k), Self::ToggleHiddenFiles => show_hidden::toggle_hidden(context), diff --git a/src/commands/show_workers.rs b/src/commands/show_workers.rs index c5bd4b1..5a98134 100644 --- a/src/commands/show_workers.rs +++ b/src/commands/show_workers.rs @@ -1,13 +1,14 @@ +use termion::event::Key; + use crate::context::AppContext; use crate::error::JoshutoResult; - use crate::ui::views::TuiWorkerView; use crate::ui::TuiBackend; -pub fn show_workers(context: &mut AppContext, backend: &mut TuiBackend) -> JoshutoResult<()> { +pub fn show_workers(context: &mut AppContext, backend: &mut TuiBackend, exit_key: &Key) -> JoshutoResult<()> { context.flush_event(); - let view = TuiWorkerView::new(); + let view = TuiWorkerView::new(exit_key.clone()); view.display(context, backend); Ok(()) } diff --git a/src/config/keymap/keymapping.rs b/src/config/keymap/keymapping.rs index e102f9c..e36e49a 100644 --- a/src/config/keymap/keymapping.rs +++ b/src/config/keymap/keymapping.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use termion::event::MouseEvent; use termion::event::{Event, Key}; -use super::keyparse::str_to_event; +use crate::util::keyparse::str_to_event; use crate::commands::{CommandKeybind, KeyCommand}; use crate::config::{parse_to_config_file, ConfigStructure, Flattenable}; use crate::io::IoWorkerOptions; diff --git a/src/config/keymap/mod.rs b/src/config/keymap/mod.rs index a224626..14ad630 100644 --- a/src/config/keymap/mod.rs +++ b/src/config/keymap/mod.rs @@ -1,5 +1,3 @@ -pub mod keyparse; - mod keymapping; pub use self::keymapping::AppKeyMapping; diff --git a/src/ui/views/tui_worker_view.rs b/src/ui/views/tui_worker_view.rs index 91388bf..59f7abd 100644 --- a/src/ui/views/tui_worker_view.rs +++ b/src/ui/views/tui_worker_view.rs @@ -8,11 +8,13 @@ use crate::ui::widgets::{TuiTopBar, TuiWorker}; use crate::ui::TuiBackend; use crate::util::input; -pub struct TuiWorkerView {} +pub struct TuiWorkerView { + exit_key: Key, +} impl TuiWorkerView { - pub fn new() -> Self { - Self {} + pub fn new(exit_key: Key) -> Self { + Self { exit_key } } pub fn display(&self, context: &mut AppContext, backend: &mut TuiBackend) { @@ -43,8 +45,10 @@ impl TuiWorkerView { if let Ok(event) = context.poll_event() { match event { AppEvent::Termion(event) => { - if let Event::Key(Key::Esc) = event { - break; + match event { + Event::Key(Key::Esc) => break, + Event::Key(k) if k == self.exit_key => break, + _ => {}, } context.flush_event(); } diff --git a/src/config/keymap/keyparse.rs b/src/util/keyparse.rs index e850cc2..e850cc2 100644 --- a/src/config/keymap/keyparse.rs +++ b/src/util/keyparse.rs diff --git a/src/util/mod.rs b/src/util/mod.rs index 848ae31..c684bf0 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -4,6 +4,7 @@ pub mod devicons; pub mod display; pub mod format; pub mod input; +pub mod keyparse; pub mod name_resolution; pub mod search; pub mod select; |