ratatui_toolkit/primitives/split_layout/
mod.rs

1//! Multi-split layout primitive.
2//!
3//! Provides a tree of resizable splits that yields pane rectangles for rendering.
4//!
5//! # Example
6//! ```rust
7//! use ratatui_toolkit::primitives::split_layout::SplitLayout;
8//!
9//! let mut layout = SplitLayout::new(0);
10//! let _ = layout.split_pane_vertically(0);
11//! ```
12
13pub mod constructors;
14pub mod enums;
15pub mod methods;
16pub mod pane_layout;
17
18mod constants;
19mod pane_id;
20
21pub use enums::split_axis::SplitAxis;
22pub use pane_id::PaneId;
23pub use pane_layout::PaneLayout;
24
25use ratatui::layout::Rect;
26
27use crate::primitives::split_layout::enums::layout_node::LayoutNode;
28
29/// A layout tree for arranging multiple resizable panes.
30///
31/// Split layouts start with a single pane and can be subdivided into
32/// horizontal or vertical splits. Each split stores a percentage for the
33/// first pane, enabling resizing of the divider.
34///
35/// # Example
36/// ```rust
37/// use ratatui_toolkit::primitives::split_layout::SplitLayout;
38///
39/// let mut layout = SplitLayout::new(1);
40/// let _ = layout.split_pane_horizontally(1);
41/// ```
42#[derive(Debug, Clone)]
43pub struct SplitLayout {
44    root_index: usize,
45    nodes: Vec<LayoutNode>,
46    next_pane_id: PaneId,
47}
48
49/// Metadata describing a split divider within a layout.
50#[derive(Debug, Clone, Copy, PartialEq, Eq)]
51pub struct SplitDividerLayout {
52    split_index: usize,
53    axis: SplitAxis,
54    area: Rect,
55    ratio: u16,
56}
57
58impl SplitDividerLayout {
59    /// Index of the split node within the layout tree.
60    pub fn split_index(&self) -> usize {
61        self.split_index
62    }
63
64    /// Axis for the split divider.
65    pub fn axis(&self) -> SplitAxis {
66        self.axis
67    }
68
69    /// Area covered by the split node.
70    pub fn area(&self) -> Rect {
71        self.area
72    }
73
74    /// Ratio (percentage) assigned to the first child of the split.
75    pub fn ratio(&self) -> u16 {
76        self.ratio
77    }
78}