taffy/compute/grid/types/
grid_track.rs1use crate::{
3 prelude::TaffyZero,
4 style::{LengthPercentage, MaxTrackSizingFunction, MinTrackSizingFunction},
5 util::sys::f32_min,
6 CompactLength,
7};
8
9#[derive(Copy, Clone, Debug, PartialEq)]
11pub(in super::super) enum GridTrackKind {
12 Track,
14 Gutter, }
17
18#[derive(Debug, Clone)]
22pub(in super::super) struct GridTrack {
23 #[allow(dead_code)] pub kind: GridTrackKind,
26
27 pub is_collapsed: bool,
30
31 pub min_track_sizing_function: MinTrackSizingFunction,
33
34 pub max_track_sizing_function: MaxTrackSizingFunction,
36
37 pub offset: f32,
39
40 pub base_size: f32,
42
43 pub growth_limit: f32,
46
47 pub content_alignment_adjustment: f32,
50
51 pub item_incurred_increase: f32,
53 pub base_size_planned_increase: f32,
55 pub growth_limit_planned_increase: f32,
57 pub infinitely_growable: bool,
60}
61
62impl GridTrack {
63 fn new_with_kind(
65 kind: GridTrackKind,
66 min_track_sizing_function: MinTrackSizingFunction,
67 max_track_sizing_function: MaxTrackSizingFunction,
68 ) -> GridTrack {
69 GridTrack {
70 kind,
71 is_collapsed: false,
72 min_track_sizing_function,
73 max_track_sizing_function,
74 offset: 0.0,
75 base_size: 0.0,
76 growth_limit: 0.0,
77 content_alignment_adjustment: 0.0,
78 item_incurred_increase: 0.0,
79 base_size_planned_increase: 0.0,
80 growth_limit_planned_increase: 0.0,
81 infinitely_growable: false,
82 }
83 }
84
85 pub fn new(
87 min_track_sizing_function: MinTrackSizingFunction,
88 max_track_sizing_function: MaxTrackSizingFunction,
89 ) -> GridTrack {
90 Self::new_with_kind(GridTrackKind::Track, min_track_sizing_function, max_track_sizing_function)
91 }
92
93 pub fn gutter(size: LengthPercentage) -> GridTrack {
95 Self::new_with_kind(
96 GridTrackKind::Gutter,
97 MinTrackSizingFunction::from(size),
98 MaxTrackSizingFunction::from(size),
99 )
100 }
101
102 pub fn collapse(&mut self) {
105 self.is_collapsed = true;
106 self.min_track_sizing_function = MinTrackSizingFunction::ZERO;
107 self.max_track_sizing_function = MaxTrackSizingFunction::ZERO;
108 }
109
110 #[inline(always)]
111 pub fn is_flexible(&self) -> bool {
113 self.max_track_sizing_function.is_fr()
114 }
115
116 #[inline(always)]
117 pub fn uses_percentage(&self) -> bool {
119 self.min_track_sizing_function.uses_percentage() || self.max_track_sizing_function.uses_percentage()
120 }
121
122 #[inline(always)]
123 pub fn has_intrinsic_sizing_function(&self) -> bool {
125 self.min_track_sizing_function.is_intrinsic() || self.max_track_sizing_function.is_intrinsic()
126 }
127
128 #[inline]
129 pub fn fit_content_limit(&self, axis_available_grid_space: Option<f32>) -> f32 {
131 match self.max_track_sizing_function.0.tag() {
132 CompactLength::FIT_CONTENT_PX_TAG => self.max_track_sizing_function.0.value(),
133 CompactLength::FIT_CONTENT_PERCENT_TAG => match axis_available_grid_space {
134 Some(space) => space * self.max_track_sizing_function.0.value(),
135 None => f32::INFINITY,
136 },
137 _ => f32::INFINITY,
138 }
139 }
140
141 #[inline]
142 pub fn fit_content_limited_growth_limit(&self, axis_available_grid_space: Option<f32>) -> f32 {
144 f32_min(self.growth_limit, self.fit_content_limit(axis_available_grid_space))
145 }
146
147 #[inline]
148 pub fn flex_factor(&self) -> f32 {
150 if self.max_track_sizing_function.is_fr() {
151 self.max_track_sizing_function.0.value()
152 } else {
153 0.0
154 }
155 }
156}