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}