summaryrefslogtreecommitdiffstats
path: root/zellij-server/src/panes/floating_panes/floating_pane_grid.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2022-10-18 16:44:05 +0200
committerGitHub <noreply@github.com>2022-10-18 16:44:05 +0200
commitabc710e12407e38916070321042798ac126157dc (patch)
tree07ea168e6d1e0b20d582d92ca34c8afe9067df4b /zellij-server/src/panes/floating_panes/floating_pane_grid.rs
parentd5332996560314029507b2e48b244ad8304cb3e8 (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.rs98
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;
}
}