summaryrefslogtreecommitdiffstats
path: root/zellij-server/src/panes/tiled_panes/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-server/src/panes/tiled_panes/mod.rs')
-rw-r--r--zellij-server/src/panes/tiled_panes/mod.rs100
1 files changed, 94 insertions, 6 deletions
diff --git a/zellij-server/src/panes/tiled_panes/mod.rs b/zellij-server/src/panes/tiled_panes/mod.rs
index 468303b79..1f9582976 100644
--- a/zellij-server/src/panes/tiled_panes/mod.rs
+++ b/zellij-server/src/panes/tiled_panes/mod.rs
@@ -105,13 +105,58 @@ impl TiledPanes {
os_api,
}
}
- pub fn add_pane_with_existing_geom(&mut self, pane_id: PaneId, pane: Box<dyn Pane>) {
+ pub fn add_pane_with_existing_geom(&mut self, pane_id: PaneId, mut pane: Box<dyn Pane>) {
+ if self.draw_pane_frames {
+ pane.set_content_offset(Offset::frame(1));
+ }
self.panes.insert(pane_id, pane);
}
+ pub fn replace_active_pane(
+ &mut self,
+ pane: Box<dyn Pane>,
+ client_id: ClientId,
+ ) -> Option<Box<dyn Pane>> {
+ let pane_id = pane.pid();
+ // remove the currently active pane
+ let previously_active_pane = self
+ .active_panes
+ .get(&client_id)
+ .copied()
+ .and_then(|active_pane_id| self.replace_pane(active_pane_id, pane));
+
+ // move clients from the previously active pane to the new pane we just inserted
+ if let Some(previously_active_pane) = previously_active_pane.as_ref() {
+ let previously_active_pane_id = previously_active_pane.pid();
+ self.move_clients_between_panes(previously_active_pane_id, pane_id);
+ }
+ previously_active_pane
+ }
+ pub fn replace_pane(
+ &mut self,
+ pane_id: PaneId,
+ mut with_pane: Box<dyn Pane>,
+ ) -> Option<Box<dyn Pane>> {
+ let with_pane_id = with_pane.pid();
+ if self.draw_pane_frames {
+ with_pane.set_content_offset(Offset::frame(1));
+ }
+ let removed_pane = self.panes.remove(&pane_id).map(|removed_pane| {
+ let with_pane_id = with_pane.pid();
+ let removed_pane_geom = removed_pane.current_geom();
+ with_pane.set_geom(removed_pane_geom);
+ self.panes.insert(with_pane_id, with_pane);
+ removed_pane
+ });
+
+ // move clients from the previously active pane to the new pane we just inserted
+ self.move_clients_between_panes(pane_id, with_pane_id);
+ removed_pane
+ }
pub fn insert_pane(&mut self, pane_id: PaneId, mut pane: Box<dyn Pane>) {
let cursor_height_width_ratio = self.cursor_height_width_ratio();
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -133,6 +178,7 @@ impl TiledPanes {
let cursor_height_width_ratio = self.cursor_height_width_ratio();
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -166,6 +212,7 @@ impl TiledPanes {
pub fn relayout(&mut self, direction: Direction) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -399,12 +446,13 @@ impl TiledPanes {
{
let mut display_area = self.display_area.borrow_mut();
let mut viewport = self.viewport.borrow_mut();
- let panes = self
- .panes
- .iter_mut()
- .filter(|(pid, _)| !self.panes_to_hide.contains(pid));
let Size { rows, cols } = new_screen_size;
- let mut pane_grid = TiledPaneGrid::new(panes, *display_area, *viewport);
+ let mut pane_grid = TiledPaneGrid::new(
+ &mut self.panes,
+ &self.panes_to_hide,
+ *display_area,
+ *viewport,
+ );
if pane_grid.layout(Direction::Horizontal, cols).is_ok() {
let column_difference = cols as isize - display_area.cols as isize;
// FIXME: Should the viewport be an Offset?
@@ -427,6 +475,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -440,6 +489,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -453,6 +503,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -466,6 +517,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -479,6 +531,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -492,6 +545,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -507,6 +561,7 @@ impl TiledPanes {
let active_pane_id = self.get_active_pane_id(client_id).unwrap();
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -522,6 +577,7 @@ impl TiledPanes {
let active_pane_id = self.get_active_pane_id(client_id).unwrap();
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -547,6 +603,7 @@ impl TiledPanes {
Some(active_pane_id) => {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -587,6 +644,7 @@ impl TiledPanes {
Some(active_pane_id) => {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -627,6 +685,7 @@ impl TiledPanes {
Some(active_pane_id) => {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -667,6 +726,7 @@ impl TiledPanes {
Some(active_pane_id) => {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -706,6 +766,7 @@ impl TiledPanes {
let active_pane_id = self.get_active_pane_id(client_id).unwrap();
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -736,6 +797,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -770,6 +832,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -804,6 +867,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -838,6 +902,7 @@ impl TiledPanes {
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
let pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -877,6 +942,7 @@ impl TiledPanes {
match self
.panes
.iter()
+ .filter(|(p_id, _)| !self.panes_to_hide.contains(p_id))
.find(|(p_id, p)| **p_id != pane_id && p.selectable())
.map(|(p_id, _p)| p_id)
{
@@ -890,9 +956,13 @@ impl TiledPanes {
None => self.active_panes.clear(),
}
}
+ pub fn extract_pane(&mut self, pane_id: PaneId) -> Option<Box<dyn Pane>> {
+ self.panes.remove(&pane_id)
+ }
pub fn remove_pane(&mut self, pane_id: PaneId) -> Option<Box<dyn Pane>> {
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
+ &self.panes_to_hide,
*self.display_area.borrow(),
*self.viewport.borrow(),
);
@@ -1015,6 +1085,24 @@ impl TiledPanes {
pub fn panes_to_hide_count(&self) -> usize {
self.panes_to_hide.len()
}
+ pub fn add_to_hidden_panels(&mut self, pid: PaneId) {
+ self.panes_to_hide.insert(pid);
+ }
+ pub fn remove_from_hidden_panels(&mut self, pid: PaneId) {
+ self.panes_to_hide.remove(&pid);
+ }
+ fn move_clients_between_panes(&mut self, from_pane_id: PaneId, to_pane_id: PaneId) {
+ let clients_in_pane: Vec<ClientId> = self
+ .active_panes
+ .iter()
+ .filter(|(_cid, pid)| **pid == from_pane_id)
+ .map(|(cid, _pid)| *cid)
+ .collect();
+ for client_id in clients_in_pane {
+ self.active_panes.remove(&client_id);
+ self.active_panes.insert(client_id, to_pane_id);
+ }
+ }
}
#[allow(clippy::borrowed_box)]