diff options
author | Aram Drevekenin <aram@poor.dev> | 2022-10-18 16:12:34 +0200 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2022-10-18 16:12:34 +0200 |
commit | 9652525013af44505fd55fbc639b0fe858a6f00a (patch) | |
tree | d59b64f82652fd775adcd01a9d2e6fc3f39cd407 | |
parent | 0711591ad3995d0201f830acb06127952c8d4391 (diff) |
feat(panes): group floating panes
14 files changed, 223 insertions, 240 deletions
diff --git a/zellij-server/src/panes/floating_panes/floating_pane_grid.rs b/zellij-server/src/panes/floating_panes/floating_pane_grid.rs index 31d0d6ff1..f3f348180 100644 --- a/zellij-server/src/panes/floating_panes/floating_pane_grid.rs +++ b/zellij-server/src/panes/floating_panes/floating_pane_grid.rs @@ -767,55 +767,37 @@ impl<'a> FloatingPaneGrid<'a> { pub fn find_room_for_new_pane(&self) -> Option<PaneGeom> { let panes = self.panes.borrow(); let pane_geoms: Vec<PaneGeom> = panes.values().map(|p| p.position_and_size()).collect(); - for offset in 0..MAX_PANES / 5 { - let half_size_middle_geom = half_size_middle_geom(&self.viewport, offset); - let half_size_top_left_geom = half_size_top_left_geom(&self.viewport, offset); - let half_size_top_right_geom = half_size_top_right_geom(&self.viewport, offset); - let half_size_bottom_left_geom = half_size_bottom_left_geom(&self.viewport, offset); - let half_size_bottom_right_geom = half_size_bottom_right_geom(&self.viewport, offset); - if pane_geom_is_big_enough(&half_size_middle_geom) - && pane_geom_is_unoccupied_and_inside_viewport( - &self.viewport, - &half_size_middle_geom, - &pane_geoms, - ) - { - return Some(half_size_middle_geom); - } else if pane_geom_is_big_enough(&half_size_top_left_geom) - && pane_geom_is_unoccupied_and_inside_viewport( - &self.viewport, - &half_size_top_left_geom, - &pane_geoms, - ) - { - return Some(half_size_top_left_geom); - } else if pane_geom_is_big_enough(&half_size_top_right_geom) - && pane_geom_is_unoccupied_and_inside_viewport( - &self.viewport, - &half_size_top_right_geom, - &pane_geoms, - ) - { - return Some(half_size_top_right_geom); - } else if pane_geom_is_big_enough(&half_size_bottom_left_geom) - && pane_geom_is_unoccupied_and_inside_viewport( - &self.viewport, - &half_size_bottom_left_geom, - &pane_geoms, - ) - { - return Some(half_size_bottom_left_geom); - } else if pane_geom_is_big_enough(&half_size_bottom_right_geom) - && pane_geom_is_unoccupied_and_inside_viewport( - &self.viewport, - &half_size_bottom_right_geom, - &pane_geoms, - ) - { - return Some(half_size_bottom_right_geom); - } + + macro_rules! find_unoccupied_offset { + ($get_geom_with_offset:expr, $viewport:expr, $other_geoms:expr) => { + let mut offset = 0; + loop { + let geom_with_current_offset = $get_geom_with_offset(offset); + if pane_geom_is_big_enough(&geom_with_current_offset) + && pane_geom_is_unoccupied_and_inside_viewport( + $viewport, + &geom_with_current_offset, + $other_geoms, + ) + { + return Some(geom_with_current_offset); + } else if !pane_geom_is_inside_viewport($viewport, &geom_with_current_offset) { + break; + } else if offset > MAX_PANES { + // this is mostly to kill the loop no matter what + break; + } else { + offset += 2; + } + } + }; } - None + find_unoccupied_offset!(|offset| half_size_middle_geom(&self.viewport, offset), &self.viewport, &pane_geoms); + find_unoccupied_offset!(|offset| half_size_top_left_geom(&self.viewport, offset), &self.viewport, &pane_geoms); + find_unoccupied_offset!(|offset| half_size_top_right_geom(&self.viewport, offset), &self.viewport, &pane_geoms); + find_unoccupied_offset!(|offset| half_size_bottom_left_geom(&self.viewport, offset), &self.viewport, &pane_geoms); + find_unoccupied_offset!(|offset| half_size_bottom_right_geom(&self.viewport, offset), &self.viewport, &pane_geoms); + return None; } } diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index 15e546f26..3285348ae 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -145,6 +145,7 @@ impl Pane for TerminalPane { fn set_geom(&mut self, position_and_size: PaneGeom) { self.geom = position_and_size; self.reflow_lines(); + self.render_full_viewport(); } fn set_geom_override(&mut self, pane_geom: PaneGeom) { self.geom_override = Some(pane_geom); diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__drag_pane_with_mouse.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__drag_pane_with_mouse.snap index 180b7c50f..bdb531d2e 100644 --- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__drag_pane_with_mouse.snap +++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__drag_pane_with_mouse.snap @@ -1,26 +1,26 @@ --- source: zellij-server/src/tab/./unit/tab_integration_tests.rs +assertion_line: 1252 expression: snapshot - --- 00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ 01 (C): │ │ -02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │ -03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -06 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -07 (C): │ └───────────────────────────────┌ Pane #2 ─────────────────────────────────────────────────┐────────────────────────┘ │ -08 (C): │ │ │ │ -09 (C): │ │ │ │ -10 (C): │ │ │ │ -11 (C): │ │ I am scratch terminal │ │ -12 (C): │ ┌ Pane #5 ─────────────── SCROLL│ │────────── SCROLL: 0/1 ┐ │ -13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEE│ │ -14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEE│ │ -15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEE│ │ -16 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEE│ │ -17 (C): │ └──────────────────────────────────────┘ └──────────────────────────────────────┘ │ -18 (C): │ │ +02 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ │ +03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +04 (C): │ │E┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │ +05 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +06 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +07 (C): │ └─│EEEEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐ │ +08 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ │ +09 (C): │ └─────────────────────────────│ │ │ +10 (C): │ │E│ │ │ +11 (C): │ │E│ I am scratch terminal │ │ +12 (C): │ │E│ │ │ +13 (C): │ │E│ │ │ +14 (C): │ │E│ │ │ +15 (C): │ │E│ │ │ +16 (C): │ └─└──────────────────────────────────────────────────────────┘ │ +17 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +18 (C): │ └──────────────────────────────────────────────────────────┘ │ 19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__five_new_floating_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__five_new_floating_panes.snap index 93fdee064..a2cc23382 100644 --- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__five_new_floating_panes.snap +++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__five_new_floating_panes.snap @@ -1,26 +1,26 @@ --- source: zellij-server/src/tab/./unit/tab_integration_tests.rs +assertion_line: 682 expression: snapshot - --- 00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ 01 (C): │ │ -02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │ -03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -06 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -07 (C): │ └──────────────────────────────────────┘ └──────────────────────────────────────┘ │ -08 (C): │ │ │ │ -09 (C): │ │ I am scratch terminal │ │ -10 (C): │ │ │ │ -11 (C): │ │ │ │ -12 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │ -13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -16 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -17 (C): │ └──────────────────────────────────────┘ └──────────────────────────────────────┘ │ -18 (C): │ │ +02 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ │ +03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +04 (C): │ │E┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │ +05 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────────────┐ │ +06 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ │ +07 (C): │ └─│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│───────────────────────────────── SCROLL: 0/1 ┐ │ +08 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +09 (C): │ └──────────────────────────────────────┘─────────────────────────────────── SCROLL: 0/1 ┐ │ +10 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +11 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +12 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +13 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +14 (C): │ └─│E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +15 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +16 (C): │ └─│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +17 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +18 (C): │ └──────────────────────────────────────────────────────────┘ │ 19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__mark_text_inside_floating_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__mark_text_inside_floating_pane.snap index de6f2ecd1..20e382fba 100644 --- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__mark_text_inside_floating_pane.snap +++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__mark_text_inside_floating_pane.snap @@ -1,26 +1,26 @@ --- source: zellij-server/src/tab/./unit/tab_integration_tests.rs +assertion_line: 1318 expression: snapshot - --- 00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ 01 (C): │ │ -02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │ -03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -06 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -07 (C): │ └───────────────────────────│ │────────────────────────────┘ │ -08 (C): │ │ │ │ -09 (C): │ │ I am scratch terminal │ │ -10 (C): │ │ │ │ -11 (C): │ │ │ │ -12 (C): │ ┌ Pane #5 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │ -13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -16 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -17 (C): │ └──────────────────────────────────────┘ └──────────────────────────────────────┘ │ -18 (C): │ │ +02 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ │ +03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +04 (C): │ │E┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │ +05 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────────────┐ │ +06 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ │ +07 (C): │ └─│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│───────────────────────────────── SCROLL: 0/1 ┐ │ +08 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +09 (C): │ └──────────────────────────────────────┘─────────────────────────────────── SCROLL: 0/1 ┐ │ +10 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +11 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +12 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +13 (C): │ │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +14 (C): │ └─│E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +15 (C): │ │E│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +16 (C): │ └─│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +17 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ +18 (C): │ └──────────────────────────────────────────────────────────┘ │ 19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_floating_pane_focus_down.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_floating_pane_focus_down.snap index c86c5998a..a401ba08a 100644 --- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_floating_pane_focus_down.snap +++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_floating_pane_focus_down.snap @@ -1,26 +1,26 @@ --- source: zellij-server/src/tab/./unit/tab_integration_tests.rs +assertion_line: 1078 expression: snapshot - --- 00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ 01 (C): │ │ -02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │ -03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ -06 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │ |