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 minmax(min: TemplateTrack, max: TemplateTrack) -> Self {
25        let min_fn = match min {
26            TemplateTrack::Single(tsf) => tsf.min,
27            _ => panic!("minmax min cannot be a repeat track"),
28        };
29        let max_fn = match max {
30            TemplateTrack::Single(tsf) => tsf.max,
31            _ => panic!("minmax max cannot be a repeat track"),
32        };
33        TemplateTrack::Single(style_helpers::minmax(min_fn, max_fn))
34    }
35
36    pub fn repeat(count: u16, track: TemplateTrack) -> Self {
37        TemplateTrack::Repeat(RepetitionCount::Count(count), track.unwrap_single())
38    }
39
40    pub fn fill(track: TemplateTrack) -> Self {
41        TemplateTrack::Repeat(RepetitionCount::AutoFill, track.unwrap_single())
42    }
43
44    pub fn fit(track: TemplateTrack) -> Self {
45        TemplateTrack::Repeat(RepetitionCount::AutoFit, track.unwrap_single())
46    }
47
48    fn unwrap_single(self) -> TrackSizingFunction {
49        match self {
50            TemplateTrack::Single(tsf) => tsf,
51            _ => panic!("repeat tracks cannot be nested"),
52        }
53    }
54
55    pub(crate) fn into_template_component(self) -> GridTemplateComponent<String> {
56        match self {
57            TemplateTrack::Single(tsf) => GridTemplateComponent::Single(tsf),
58            TemplateTrack::Repeat(count, tsf) => {
59                GridTemplateComponent::Repeat(GridTemplateRepetition {
60                    count,
61                    tracks: vec![tsf],
62                    line_names: Vec::new(),
63                })
64            }
65        }
66    }
67}