Skip to main content

telar_layout_core/
track.rs

1use taffy::{
2    GridTemplateComponent, GridTemplateRepetition, RepetitionCount, TrackSizingFunction,
3    style_helpers,
4};
5
6pub enum TemplateTrack {
7    Single(TrackSizingFunction),
8    Repeat(RepetitionCount, TrackSizingFunction),
9}
10
11impl TemplateTrack {
12    pub fn fr(flex: f32) -> Self {
13        TemplateTrack::Single(style_helpers::fr(flex))
14    }
15
16    pub fn px(px: f32) -> Self {
17        TemplateTrack::Single(style_helpers::length(px))
18    }
19
20    pub fn auto() -> Self {
21        TemplateTrack::Single(style_helpers::auto())
22    }
23
24    pub fn min_content() -> Self {
25        TemplateTrack::Single(style_helpers::min_content())
26    }
27
28    pub fn max_content() -> Self {
29        TemplateTrack::Single(style_helpers::max_content())
30    }
31
32    pub fn minmax(min: TemplateTrack, max: TemplateTrack) -> Self {
33        let min_fn = match min {
34            TemplateTrack::Single(tsf) => tsf.min,
35            _ => panic!("minmax min cannot be a repeat track"),
36        };
37        let max_fn = match max {
38            TemplateTrack::Single(tsf) => tsf.max,
39            _ => panic!("minmax max cannot be a repeat track"),
40        };
41        TemplateTrack::Single(style_helpers::minmax(min_fn, max_fn))
42    }
43
44    pub fn repeat(count: u16, track: TemplateTrack) -> Self {
45        TemplateTrack::Repeat(RepetitionCount::Count(count), track.unwrap_single())
46    }
47
48    pub fn fill(track: TemplateTrack) -> Self {
49        TemplateTrack::Repeat(RepetitionCount::AutoFill, track.unwrap_single())
50    }
51
52    pub fn fit(track: TemplateTrack) -> Self {
53        TemplateTrack::Repeat(RepetitionCount::AutoFit, track.unwrap_single())
54    }
55
56    fn unwrap_single(self) -> TrackSizingFunction {
57        match self {
58            TemplateTrack::Single(tsf) => tsf,
59            _ => panic!("repeat tracks cannot be nested"),
60        }
61    }
62
63    pub(crate) fn into_template_component(self) -> GridTemplateComponent<String> {
64        match self {
65            TemplateTrack::Single(tsf) => GridTemplateComponent::Single(tsf),
66            TemplateTrack::Repeat(count, tsf) => {
67                GridTemplateComponent::Repeat(GridTemplateRepetition {
68                    count,
69                    tracks: vec![tsf],
70                    line_names: Vec::new(),
71                })
72            }
73        }
74    }
75}