rat_widget/layout/
layout_grid.rs

1use crate::layout::GenericLayout;
2use ratatui::layout::{Constraint, 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_as_grid;
10///
11/// let area = Rect::new(0,0,100,100);
12///
13/// let layout = layout_as_grid(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/// ```
31pub fn layout_as_grid(
32    area: Rect,
33    horizontal: Layout,
34    vertical: Layout,
35) -> GenericLayout<(usize, usize)> {
36    let mut gen_layout = GenericLayout::new();
37    gen_layout.set_area(area);
38    gen_layout.set_page_size(area.as_size());
39
40    let hori = horizontal.split(Rect::new(area.x, 0, area.width, 0));
41    let vert = vertical.split(Rect::new(0, area.y, 0, area.height));
42
43    for x in 0..hori.len() {
44        for y in 0..vert.len() {
45            let grid_area = Rect::new(hori[x].x, vert[y].y, hori[x].width, vert[y].height);
46            gen_layout.add((x, y), grid_area, None, Rect::default());
47        }
48    }
49
50    gen_layout
51}
52
53/// Create a basic grid of areas using the given Constraints.
54pub fn simple_grid<const X: usize, const Y: usize>(
55    area: Rect,
56    horizontal: [Constraint; X],
57    vertical: [Constraint; Y],
58) -> [[Rect; Y]; X] {
59    let mut layout = [[Rect::default(); Y]; X];
60
61    let hori = Layout::horizontal(horizontal).split(Rect::new(area.x, 0, area.width, 0));
62    let vert = Layout::vertical(vertical).split(Rect::new(0, area.y, 0, area.height));
63
64    for x in 0..X {
65        for y in 0..Y {
66            let grid_area = Rect::new(hori[x].x, vert[y].y, hori[x].width, vert[y].height);
67            layout[x][y] = grid_area;
68        }
69    }
70
71    layout
72}