diff options
| author | kangal-bot <kangal@herdr.dev> | 2026-05-18 20:37:38 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-18 20:37:38 +0300 |
| commit | 76ac2da20a4e7266fc9d785147521dea5e033c31 (patch) | |
| tree | 469ab0fc3b3c05ee8849e652b6a66a6b562f21e7 | |
| parent | 57e907977c86c5d2005286d5ed5ca982549a1a8e (diff) | |
fix: allow zoomed pane focus (#167)
refs #151
Co-authored-by: kangal-bot <kangal-bot@users.noreply.github.com>
| -rw-r--r-- | src/app/actions.rs | 41 | ||||
| -rw-r--r-- | src/app/input/navigate.rs | 15 |
2 files changed, 52 insertions, 4 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index f8ae511f..139f7cd4 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -534,12 +534,23 @@ impl AppState { impl AppState { pub fn navigate_pane(&mut self, direction: NavDirection) { - let panes = &self.view.pane_infos; + let Some(ws_idx) = self.active else { + return; + }; + let Some(tab) = self.workspaces.get(ws_idx).and_then(|ws| ws.active_tab()) else { + return; + }; + let panes = if tab.zoomed { + tab.layout.panes(self.view.terminal_area) + } else { + self.view.pane_infos.clone() + }; + if let Some(focused) = panes.iter().find(|p| p.is_focused) { - if let Some(target) = find_in_direction(focused, direction, panes) { + if let Some(target) = find_in_direction(focused, direction, &panes) { if let Some(tab) = self - .active - .and_then(|i| self.workspaces.get_mut(i)) + .workspaces + .get_mut(ws_idx) .and_then(|ws| ws.active_tab_mut()) { tab.layout.focus_pane(target); @@ -1741,6 +1752,28 @@ mod tests { } #[test] + fn navigate_pane_changes_focus_while_zoomed() { + let mut state = app_with_workspaces(&["test"]); + let root = state.workspaces[0].tabs[0].root_pane; + let right = state.workspaces[0].test_split(Direction::Horizontal); + state.workspaces[0].layout.focus_pane(root); + state.workspaces[0].zoomed = true; + crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 100, 20)); + + assert_eq!(state.view.pane_infos.len(), 1); + assert_eq!(state.view.pane_infos[0].id, root); + + state.navigate_pane(NavDirection::Right); + crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 100, 20)); + + assert!(state.workspaces[0].zoomed); + assert_eq!(state.workspaces[0].focused_pane_id(), Some(right)); + assert_eq!(state.view.pane_infos.len(), 1); + assert_eq!(state.view.pane_infos[0].id, right); + assert!(state.view.pane_infos[0].inner_rect.x > state.view.pane_infos[0].rect.x); + } + + #[test] fn close_pane_removes_from_workspace() { let mut state = app_with_workspaces(&["test"]); state.workspaces[0].test_split(Direction::Horizontal); diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs index 29a71c2e..e2e0993e 100644 --- a/src/app/input/navigate.rs +++ b/src/app/input/navigate.rs @@ -1209,6 +1209,21 @@ mod tests { } #[test] + fn focus_pane_action_keeps_zoomed_when_changing_focus() { + let mut state = state_with_workspaces(&["test"]); + let root = state.workspaces[0].tabs[0].root_pane; + let right = state.workspaces[0].test_split(Direction::Horizontal); + state.workspaces[0].layout.focus_pane(root); + state.workspaces[0].zoomed = true; + crate::ui::compute_view(&mut state, ratatui::layout::Rect::new(0, 0, 100, 20)); + + execute_navigate_action(&mut state, NavigateAction::FocusPaneRight); + + assert!(state.workspaces[0].zoomed); + assert_eq!(state.workspaces[0].focused_pane_id(), Some(right)); + } + + #[test] fn question_mark_opens_keybind_help_from_navigate() { let mut state = state_with_workspaces(&["test"]); |
