summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2021-09-25 12:59:08 -0400
committerJeff Zhao <jeff.no.zhao@gmail.com>2021-09-25 12:59:08 -0400
commitcbfdb2c715f47944e10b4a74e8fc74c1b51977de (patch)
treed56751a4888ff2162f2dbebbe5e5938c51f33ca4
parent281da8fcc27563530289046838bb50d340fa33ce (diff)
show_workers can close with custom key via --exit-key option
-rw-r--r--config/keymap.toml2
-rw-r--r--src/commands/key_command.rs28
-rw-r--r--src/commands/show_workers.rs7
-rw-r--r--src/config/keymap/keymapping.rs2
-rw-r--r--src/config/keymap/mod.rs2
-rw-r--r--src/ui/views/tui_worker_view.rs14
-rw-r--r--src/util/keyparse.rs (renamed from src/config/keymap/keyparse.rs)0
-rw-r--r--src/util/mod.rs1
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;