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}