diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-05 21:59:10 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-05 22:06:02 +0300 |
| commit | 556b16b2df7ea2c3e9b8ad13db4ad7370c1ad838 (patch) | |
| tree | 0a6f61701f2c8992c6cd1ee6d61171ef92a92533 /src/app/input/navigate.rs | |
| parent | ae3c88ab8c64931740d89623f688f7d3f408da5e (diff) | |
feat: add pane navigation controls
refs #421
refs #330
related discussions:
https://github.com/ogulcancelik/herdr/discussions/422
https://github.com/ogulcancelik/herdr/discussions/438
https://github.com/ogulcancelik/herdr/discussions/442
Diffstat (limited to 'src/app/input/navigate.rs')
| -rw-r--r-- | src/app/input/navigate.rs | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs index 2ac86aeb..7f803825 100644 --- a/src/app/input/navigate.rs +++ b/src/app/input/navigate.rs @@ -499,6 +499,10 @@ pub(crate) enum NavigateAction { FocusPaneDown, FocusPaneUp, FocusPaneRight, + SwapPaneLeft, + SwapPaneDown, + SwapPaneUp, + SwapPaneRight, SplitVertical, SplitHorizontal, ClosePane, @@ -601,6 +605,10 @@ fn action_for_key( (&kb.focus_pane_down, NavigateAction::FocusPaneDown), (&kb.focus_pane_up, NavigateAction::FocusPaneUp), (&kb.focus_pane_right, NavigateAction::FocusPaneRight), + (&kb.swap_pane_left, NavigateAction::SwapPaneLeft), + (&kb.swap_pane_down, NavigateAction::SwapPaneDown), + (&kb.swap_pane_up, NavigateAction::SwapPaneUp), + (&kb.swap_pane_right, NavigateAction::SwapPaneRight), (&kb.last_pane, NavigateAction::LastPane), (&kb.cycle_pane_next, NavigateAction::CyclePaneNext), (&kb.cycle_pane_previous, NavigateAction::CyclePanePrevious), @@ -778,6 +786,22 @@ pub(super) fn execute_navigate_action_in_context( NavigateAction::FocusPaneDown => state.navigate_pane(NavDirection::Down), NavigateAction::FocusPaneUp => state.navigate_pane(NavDirection::Up), NavigateAction::FocusPaneRight => state.navigate_pane(NavDirection::Right), + NavigateAction::SwapPaneLeft => { + state.swap_pane(NavDirection::Left); + leave_navigate_mode(state); + } + NavigateAction::SwapPaneDown => { + state.swap_pane(NavDirection::Down); + leave_navigate_mode(state); + } + NavigateAction::SwapPaneUp => { + state.swap_pane(NavDirection::Up); + leave_navigate_mode(state); + } + NavigateAction::SwapPaneRight => { + state.swap_pane(NavDirection::Right); + leave_navigate_mode(state); + } NavigateAction::SplitVertical => { state.split_pane(terminal_runtimes, Direction::Horizontal); leave_navigate_mode(state); @@ -1501,6 +1525,19 @@ navigate_pane_right = "ctrl+l" } #[test] + fn terminal_direct_swap_pane_shortcut_maps_to_navigation_action() { + let mut state = state_with_workspaces(&["test"]); + state.keybinds.swap_pane_right = crate::config::ActionKeybinds::direct("alt+shift+l"); + + let action = terminal_direct_navigation_action( + &state, + TerminalKey::new(KeyCode::Char('l'), KeyModifiers::ALT | KeyModifiers::SHIFT), + ); + + assert_eq!(action, Some(NavigateAction::SwapPaneRight)); + } + + #[test] fn terminal_direct_last_pane_shortcut_maps_to_navigation_action() { let mut state = state_with_workspaces(&["test"]); state.keybinds.last_pane = crate::config::ActionKeybinds::direct("alt+l"); @@ -1788,11 +1825,11 @@ last_pane = "prefix+tab" #[test] fn modified_navigate_local_key_can_be_bound_as_prefix_rhs() { let mut state = state_with_workspaces(&["test"]); - state.keybinds.toggle_sidebar = crate::config::ActionKeybinds::prefix("shift+h"); + state.keybinds.toggle_sidebar = crate::config::ActionKeybinds::prefix("shift+u"); handle_navigate_key( &mut state, - KeyEvent::new(KeyCode::Char('H'), KeyModifiers::SHIFT), + KeyEvent::new(KeyCode::Char('U'), KeyModifiers::SHIFT), ); assert!(state.sidebar_collapsed); |
