aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorkangal-bot <kangal@herdr.dev>2026-05-18 20:37:38 +0300
committerGitHub <noreply@github.com>2026-05-18 20:37:38 +0300
commit76ac2da20a4e7266fc9d785147521dea5e033c31 (patch)
tree469ab0fc3b3c05ee8849e652b6a66a6b562f21e7 /src/app
parent57e907977c86c5d2005286d5ed5ca982549a1a8e (diff)
fix: allow zoomed pane focus (#167)
refs #151 Co-authored-by: kangal-bot <kangal-bot@users.noreply.github.com>
Diffstat (limited to 'src/app')
-rw-r--r--src/app/actions.rs41
-rw-r--r--src/app/input/navigate.rs15
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"]);