diff options
author | Aram Drevekenin <aram@poor.dev> | 2022-10-18 16:44:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-18 16:44:05 +0200 |
commit | abc710e12407e38916070321042798ac126157dc (patch) | |
tree | 07ea168e6d1e0b20d582d92ca34c8afe9067df4b /zellij-server/src/panes/floating_panes/floating_pane_grid.rs | |
parent | d5332996560314029507b2e48b244ad8304cb3e8 (diff) |
feat(panes): change floating window positions (#1810)
* feat(panes): group floating panes
* style(fmt): rustfmt
Diffstat (limited to 'zellij-server/src/panes/floating_panes/floating_pane_grid.rs')
-rw-r--r-- | zellij-server/src/panes/floating_panes/floating_pane_grid.rs | 98 |
1 files changed, 50 insertions, 48 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..83724887f 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,57 @@ 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; } } |