telar_layout_core/
track.rs1use 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}