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}