rat_widget/layout/layout_grid.rs
1use crate::layout::GenericLayout;
2use ratatui::layout::{Layout, Rect};
3
4///
5/// Calculates a full grid of rects from the horizontal and vertical components.
6///
7/// ```
8/// use ratatui::layout::{Constraint, Layout, Rect};
9/// use rat_widget::layout::layout_grid;
10///
11/// let area = Rect::new(0,0,100,100);
12///
13/// let layout = layout_grid::<3, 5>(area,
14/// Layout::horizontal([
15/// Constraint::Length(5),
16/// Constraint::Fill(1),
17/// Constraint::Length(5)
18/// ]),
19/// Layout::vertical([
20/// Constraint::Length(1),
21/// Constraint::Length(3),
22/// Constraint::Fill(1),
23/// Constraint::Length(3),
24/// Constraint::Length(1),
25/// ])
26/// );
27///
28/// // middle column, second block
29/// let a_1_2 = layout.widget(layout.try_index_of((1,2)).expect("fine"));
30/// ```
31#[allow(clippy::needless_range_loop)]
32pub fn layout_grid<const X: usize, const Y: usize>(
33 area: Rect,
34 horizontal: Layout,
35 vertical: Layout,
36) -> GenericLayout<(usize, usize)> {
37 let mut gen_layout = GenericLayout::new();
38 gen_layout.set_area(area);
39 gen_layout.set_page_size(area.as_size());
40
41 let hori = horizontal.areas::<X>(Rect::new(area.x, 0, area.width, 0));
42 let vert = vertical.areas::<Y>(Rect::new(0, area.y, 0, area.height));
43
44 for x in 0..X {
45 for y in 0..Y {
46 let grid_area = Rect::new(hori[x].x, vert[y].y, hori[x].width, vert[y].height);
47 gen_layout.add((x, y), grid_area, None, Rect::default());
48 }
49 }
50
51 gen_layout
52}