aboutsummaryrefslogtreecommitdiff
path: root/src/app/input/modal.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-10 02:26:25 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-10 02:27:41 +0300
commit77fcde0a2736c3927d1bc589bd9b4d0173a9df46 (patch)
tree209c704342fb52a7ecbb5fe0cdbc291f7650e720 /src/app/input/modal.rs
parent0facd819b4747c7634040b561509137c2608b024 (diff)
fix: support paste in modal inputs
refs #302
Diffstat (limited to 'src/app/input/modal.rs')
-rw-r--r--src/app/input/modal.rs72
1 files changed, 65 insertions, 7 deletions
diff --git a/src/app/input/modal.rs b/src/app/input/modal.rs
index 5b179e9b..79d066f9 100644
--- a/src/app/input/modal.rs
+++ b/src/app/input/modal.rs
@@ -194,9 +194,7 @@ pub(crate) fn handle_navigator_key(
KeyCode::Char(c)
if key.modifiers.is_empty() || key.modifiers == KeyModifiers::SHIFT =>
{
- state.navigator.state_filter = None;
- state.navigator.query.push(c);
- state.clamp_navigator_selection_from(terminal_runtimes);
+ insert_navigator_search_text(state, terminal_runtimes, &c.to_string());
}
_ => {}
}
@@ -283,6 +281,19 @@ pub(crate) fn handle_navigator_key(
}
}
+pub(crate) fn insert_navigator_search_text(
+ state: &mut AppState,
+ terminal_runtimes: &crate::terminal::TerminalRuntimeRegistry,
+ text: &str,
+) {
+ if !state.navigator.search_focused {
+ return;
+ }
+ state.navigator.state_filter = None;
+ state.navigator.query.push_str(text);
+ state.clamp_navigator_selection_from(terminal_runtimes);
+}
+
pub(crate) fn handle_keybind_help_key(state: &mut AppState, key: KeyEvent) {
match key.code {
KeyCode::Up | KeyCode::Char('k') => state.scroll_keybind_help(-1),
@@ -498,6 +509,13 @@ fn clear_rename_input(state: &mut AppState) {
state.name_input_replace_on_type = false;
}
+pub(crate) fn insert_rename_input_text(state: &mut AppState, text: &str) {
+ if state.name_input_replace_on_type {
+ clear_rename_input(state);
+ }
+ state.name_input.push_str(text);
+}
+
fn delete_rename_input_char(state: &mut AppState) {
if state.name_input_replace_on_type {
clear_rename_input(state);
@@ -578,10 +596,7 @@ pub(crate) fn handle_rename_key(state: &mut AppState, key: KeyEvent) {
}
KeyCode::Backspace => delete_rename_input_char(state),
KeyCode::Char(c) if key.modifiers.difference(KeyModifiers::SHIFT).is_empty() => {
- if state.name_input_replace_on_type {
- clear_rename_input(state);
- }
- state.name_input.push(c);
+ insert_rename_input_text(state, &c.to_string());
}
_ => {}
}
@@ -1094,6 +1109,23 @@ mod tests {
}
#[test]
+ fn rename_modal_replaces_prefilled_text_on_paste() {
+ let mut state = state_with_workspaces(&["test"]);
+ state.mode = Mode::RenameTab;
+ state.name_input = "2".into();
+ state.name_input_replace_on_type = true;
+
+ insert_rename_input_text(&mut state, "feature/logs");
+
+ assert_eq!(state.name_input, "feature/logs");
+ assert!(!state.name_input_replace_on_type);
+
+ insert_rename_input_text(&mut state, "-copy");
+
+ assert_eq!(state.name_input, "feature/logs-copy");
+ }
+
+ #[test]
fn rename_modal_handles_line_editing_shortcuts() {
let mut state = state_with_workspaces(&["test"]);
state.mode = Mode::RenameWorkspace;
@@ -1166,6 +1198,32 @@ mod tests {
}
#[test]
+ fn navigator_search_accepts_pasted_text_when_focused() {
+ let mut state = state_with_workspaces(&["alpha", "beta"]);
+ let terminal_runtimes = crate::terminal::TerminalRuntimeRegistry::new();
+ state.mode = Mode::Navigator;
+ state.navigator.search_focused = true;
+ state.navigator.state_filter = Some(NavigatorStateFilter::Working);
+
+ insert_navigator_search_text(&mut state, &terminal_runtimes, "beta");
+
+ assert_eq!(state.navigator.query, "beta");
+ assert_eq!(state.navigator.state_filter, None);
+ }
+
+ #[test]
+ fn navigator_search_ignores_paste_when_search_is_not_focused() {
+ let mut state = state_with_workspaces(&["alpha", "beta"]);
+ let terminal_runtimes = crate::terminal::TerminalRuntimeRegistry::new();
+ state.mode = Mode::Navigator;
+ state.navigator.search_focused = false;
+
+ insert_navigator_search_text(&mut state, &terminal_runtimes, "beta");
+
+ assert!(state.navigator.query.is_empty());
+ }
+
+ #[test]
fn open_rename_active_tab_can_prefill_default_new_tab_name() {
let mut state = state_with_workspaces(&["test"]);
state.workspaces[0].test_add_tab(None);