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}