vtui_core/
layout.rs

1use crate::canvas::LogicalRect;
2
3#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
4pub enum Flow {
5    Horizontal,
6    #[default]
7    Vertical,
8}
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq)]
11pub enum Measure {
12    Exact(i32),
13}
14
15impl Default for Measure {
16    fn default() -> Self {
17        Measure::Exact(30)
18    }
19}
20
21#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
22pub(crate) struct Layer(i32);
23
24#[derive(Clone, Copy, Debug, PartialEq, Eq)]
25struct Variable {
26    start: i32,
27    size: i32,
28}
29
30pub(crate) fn compute_split(
31    flow: Flow,
32    area: LogicalRect,
33    measures: &[Measure],
34) -> Vec<LogicalRect> {
35    match flow {
36        Flow::Horizontal => split_measures(area.x, measures)
37            .map(|v| LogicalRect {
38                x: v.start,
39                y: area.y,
40                width: v.size,
41                height: area.height,
42            })
43            .collect(),
44        Flow::Vertical => split_measures(area.y, measures)
45            .map(|v| LogicalRect {
46                x: area.x,
47                y: v.start,
48                width: area.width,
49                height: v.size,
50            })
51            .collect(),
52    }
53}
54
55fn split_measures(start: i32, measures: &[Measure]) -> impl Iterator<Item = Variable> {
56    let mut cursor = start;
57
58    measures.iter().map(move |Measure::Exact(size)| {
59        let v = Variable {
60            start: cursor,
61            size: *size,
62        };
63        cursor += *size;
64        v
65    })
66}