ratatui_toolkit/primitives/split_layout/methods/remove_pane.rs
1use crate::primitives::split_layout::enums::layout_node::LayoutNode;
2use crate::primitives::split_layout::PaneId;
3use crate::primitives::split_layout::SplitLayout;
4
5impl SplitLayout {
6 /// Removes a pane and collapses its parent split.
7 ///
8 /// # Arguments
9 /// - `pane_id`: The pane to remove.
10 ///
11 /// # Returns
12 /// `true` when a pane is removed and the split collapses.
13 ///
14 /// # Errors
15 /// - None.
16 ///
17 /// # Panics
18 /// - Does not panic.
19 ///
20 /// # Safety
21 /// - No safety requirements.
22 ///
23 /// # Performance
24 /// - O(n) to locate the pane.
25 ///
26 /// # Example
27 /// ```rust
28 /// use ratatui_toolkit::primitives::split_layout::SplitLayout;
29 ///
30 /// let mut layout = SplitLayout::new(0);
31 /// let pane_id = layout.split_pane_vertically(0).unwrap();
32 /// let _ = layout.remove_pane(pane_id);
33 /// ```
34 pub fn remove_pane(&mut self, pane_id: PaneId) -> bool {
35 let Some((parent_index, is_first)) = self.find_parent_split(pane_id) else {
36 return false;
37 };
38 let Some(LayoutNode::Split { first, second, .. }) = self.nodes.get(parent_index) else {
39 return false;
40 };
41 let sibling_index = if is_first { *second } else { *first };
42 let Some(sibling_node) = self.nodes.get(sibling_index).cloned() else {
43 return false;
44 };
45
46 self.nodes[parent_index] = sibling_node;
47 true
48 }
49}