diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-10 02:26:25 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-10 02:27:41 +0300 |
| commit | 77fcde0a2736c3927d1bc589bd9b4d0173a9df46 (patch) | |
| tree | 209c704342fb52a7ecbb5fe0cdbc291f7650e720 /src/app/input/modal.rs | |
| parent | 0facd819b4747c7634040b561509137c2608b024 (diff) | |
fix: support paste in modal inputs
refs #302
Diffstat (limited to 'src/app/input/modal.rs')
| -rw-r--r-- | src/app/input/modal.rs | 72 |
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); |
