aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Linford <tlinford@users.noreply.github.com>2021-11-13 21:51:53 +0100
committerGitHub <noreply@github.com>2021-11-13 21:51:53 +0100
commit44852cd6b24d7a63c192bbab8fb91e0db6916971 (patch)
tree903d3f4803ce6b786c855e690bd801d2435f4c9f
parentdocs(changelog): tab multi-users (diff)
downloadsl0ppij-44852cd6b24d7a63c192bbab8fb91e0db6916971.tar.gz
sl0ppij-44852cd6b24d7a63c192bbab8fb91e0db6916971.tar.xz
sl0ppij-44852cd6b24d7a63c192bbab8fb91e0db6916971.zip
refactor(tab): close_pane returns closed pane (#853)
* refactor(tab): close_pane returns closed pane Prepare for break pane command by making close_pane return the closed pane. Also split the function up to hopefully be more readable. * more refactoring
-rw-r--r--zellij-server/src/tab.rs76
1 files changed, 40 insertions, 36 deletions
diff --git a/zellij-server/src/tab.rs b/zellij-server/src/tab.rs
index 933dd9ad..8de92607 100644
--- a/zellij-server/src/tab.rs
+++ b/zellij-server/src/tab.rs
@@ -2984,7 +2984,7 @@ impl Tab {
}
}
}
- pub fn close_pane(&mut self, id: PaneId) {
+ pub fn close_pane(&mut self, id: PaneId) -> Option<Box<dyn Pane>> {
if self.fullscreen_is_active {
self.unset_fullscreen();
}
@@ -2993,49 +2993,53 @@ impl Tab {
if let (Some(freed_width), Some(freed_height)) =
(freed_space.cols.as_percent(), freed_space.rows.as_percent())
{
- if let Some(panes) = self.panes_to_the_left_between_aligning_borders(id) {
- for pane_id in panes.iter() {
- self.increase_pane_width(pane_id, freed_width);
- }
- self.panes.remove(&id);
+ if let Some((panes, direction)) = self.find_panes_to_grow(id) {
+ self.grow_panes(&panes, direction, (freed_width, freed_height));
+ let pane = self.panes.remove(&id);
self.move_clients_out_of_pane(id);
- self.relayout_tab(Direction::Horizontal);
- return;
- }
- if let Some(panes) = self.panes_to_the_right_between_aligning_borders(id) {
- for pane_id in panes.iter() {
- self.increase_pane_width(pane_id, freed_width);
- }
- self.panes.remove(&id);
- self.move_clients_out_of_pane(id);
- self.relayout_tab(Direction::Horizontal);
- return;
- }
- if let Some(panes) = self.panes_above_between_aligning_borders(id) {
- for pane_id in panes.iter() {
- self.increase_pane_height(pane_id, freed_height);
- }
- self.panes.remove(&id);
- self.move_clients_out_of_pane(id);
- self.relayout_tab(Direction::Vertical);
- return;
- }
- if let Some(panes) = self.panes_below_between_aligning_borders(id) {
- for pane_id in panes.iter() {
- self.increase_pane_height(pane_id, freed_height);
- }
- self.panes.remove(&id);
- self.move_clients_out_of_pane(id);
- self.relayout_tab(Direction::Vertical);
- return;
+ self.relayout_tab(direction);
+ return pane;
}
}
// if we reached here, this is either the last pane or there's some sort of
// configuration error (eg. we're trying to close a pane surrounded by fixed panes)
- self.panes.remove(&id);
+ let pane = self.panes.remove(&id);
self.active_panes.clear();
self.resize_whole_tab(self.display_area);
+ return pane;
+ }
+ None
+ }
+ fn find_panes_to_grow(&self, id: PaneId) -> Option<(Vec<PaneId>, Direction)> {
+ if let Some(panes) = self
+ .panes_to_the_left_between_aligning_borders(id)
+ .or_else(|| self.panes_to_the_right_between_aligning_borders(id))
+ {
+ return Some((panes, Direction::Horizontal));
+ }
+
+ if let Some(panes) = self
+ .panes_above_between_aligning_borders(id)
+ .or_else(|| self.panes_below_between_aligning_borders(id))
+ {
+ return Some((panes, Direction::Vertical));
}
+
+ None
+ }
+ fn grow_panes(&mut self, panes: &[PaneId], direction: Direction, (width, height): (f64, f64)) {
+ match direction {
+ Direction::Horizontal => {
+ for pane_id in panes.iter() {
+ self.increase_pane_width(pane_id, width);
+ }
+ }
+ Direction::Vertical => {
+ for pane_id in panes.iter() {
+ self.increase_pane_height(pane_id, height);
+ }
+ }
+ };
}
pub fn close_focused_pane(&mut self, client_id: ClientId) {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {