1use super::{AxisInfo, SizeRules};
9use crate::dir::Directional;
10use crate::geom::{Offset, Rect, Size};
11use crate::theme::{FrameStyle, SizeCx};
12use kas_macros::impl_scope;
13use std::fmt::Debug;
14
15#[derive(Clone, Default, Debug)]
17pub struct PackStorage {
18 pub size: Size,
20}
21
22#[derive(Clone, Default, Debug)]
24pub struct FrameStorage {
25 pub size: Size,
27 pub offset: Offset,
29 pub rect: Rect,
35}
36impl FrameStorage {
37 pub fn child_axis(&self, mut axis: AxisInfo) -> AxisInfo {
39 axis.sub_other(self.size.extract(axis.flipped()));
40 axis
41 }
42
43 pub fn size_rules(
45 &mut self,
46 sizer: SizeCx,
47 axis: AxisInfo,
48 child_rules: SizeRules,
49 style: FrameStyle,
50 ) -> SizeRules {
51 let frame_rules = sizer.frame(style, axis);
52 let (rules, offset, size) = frame_rules.surround(child_rules);
53 self.offset.set_component(axis, offset);
54 self.size.set_component(axis, size);
55 rules
56 }
57}
58
59pub trait RowStorage: Clone + Debug + sealed::Sealed {
72 fn set_dim(&mut self, cols: usize);
74
75 fn rules(&mut self) -> &mut [SizeRules] {
77 self.widths_and_rules().1
78 }
79
80 fn widths(&mut self) -> &mut [i32] {
86 self.widths_and_rules().0
87 }
88
89 fn widths_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]);
91}
92
93#[derive(Clone, Debug)]
97pub struct FixedRowStorage<const C: usize> {
98 rules: [SizeRules; C],
99 widths: [i32; C],
100}
101
102impl<const C: usize> Default for FixedRowStorage<C> {
103 fn default() -> Self {
104 FixedRowStorage {
105 rules: [SizeRules::default(); C],
106 widths: [0; C],
107 }
108 }
109}
110
111impl<const C: usize> RowStorage for FixedRowStorage<C> {
112 fn set_dim(&mut self, cols: usize) {
113 assert_eq!(self.rules.as_ref().len(), cols);
114 assert_eq!(self.widths.as_ref().len(), cols);
115 }
116
117 fn widths_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]) {
118 (self.widths.as_mut(), self.rules.as_mut())
119 }
120}
121
122#[derive(Clone, Debug, Default)]
124pub struct DynRowStorage {
125 rules: Vec<SizeRules>,
126 widths: Vec<i32>,
127}
128
129impl RowStorage for DynRowStorage {
130 fn set_dim(&mut self, cols: usize) {
131 self.rules.resize(cols, SizeRules::EMPTY);
132 self.widths.resize(cols, 0);
133 }
134
135 fn widths_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]) {
136 (&mut self.widths, &mut self.rules)
137 }
138}
139
140pub trait RowTemp: AsMut<[i32]> + Default + Debug + sealed::Sealed {
145 fn set_len(&mut self, len: usize);
146}
147
148impl RowTemp for Vec<i32> {
149 fn set_len(&mut self, len: usize) {
150 self.resize(len, 0);
151 }
152}
153
154impl<const L: usize> RowTemp for [i32; L]
155where
156 [i32; L]: Default,
157{
158 fn set_len(&mut self, len: usize) {
159 assert_eq!(self.len(), len);
160 }
161}
162
163pub trait GridStorage: sealed::Sealed + Clone + std::fmt::Debug {
176 fn set_dims(&mut self, cols: usize, rows: usize);
178
179 fn width_rules(&mut self) -> &mut [SizeRules] {
181 self.widths_and_rules().1
182 }
183
184 fn height_rules(&mut self) -> &mut [SizeRules] {
186 self.heights_and_rules().1
187 }
188
189 fn widths(&mut self) -> &mut [i32] {
195 self.widths_and_rules().0
196 }
197
198 fn heights(&mut self) -> &mut [i32] {
204 self.heights_and_rules().0
205 }
206
207 fn widths_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]);
209
210 fn heights_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]);
212}
213
214impl_scope! {
215 #[impl_default]
219 #[derive(Clone, Debug)]
220 pub struct FixedGridStorage<const C: usize, const R: usize> {
221 width_rules: [SizeRules; C] = [SizeRules::default(); C],
222 height_rules: [SizeRules; R] = [SizeRules::default(); R],
223 widths: [i32; C] = [0; C],
224 heights: [i32; R] = [0; R],
225 }
226
227 impl GridStorage for Self {
228 fn set_dims(&mut self, cols: usize, rows: usize) {
229 assert_eq!(self.width_rules.as_ref().len(), cols);
230 assert_eq!(self.height_rules.as_ref().len(), rows);
231 assert_eq!(self.widths.len(), cols);
232 assert_eq!(self.heights.len(), rows);
233 }
234
235 fn widths_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]) {
236 (
237 self.widths.as_mut(),
238 self.width_rules.as_mut(),
239 )
240 }
241 fn heights_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]) {
242 (
243 self.heights.as_mut(),
244 self.height_rules.as_mut(),
245 )
246 }
247 }
248}
249
250#[derive(Clone, Debug, Default)]
252pub struct DynGridStorage {
253 width_rules: Vec<SizeRules>,
254 height_rules: Vec<SizeRules>,
255 widths: Vec<i32>,
256 heights: Vec<i32>,
257}
258
259impl GridStorage for DynGridStorage {
260 fn set_dims(&mut self, cols: usize, rows: usize) {
261 self.width_rules.resize(cols, SizeRules::EMPTY);
262 self.height_rules.resize(rows, SizeRules::EMPTY);
263 self.widths.resize(cols, 0);
264 self.heights.resize(rows, 0);
265 }
266
267 fn widths_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]) {
268 (self.widths.as_mut(), self.width_rules.as_mut())
269 }
270 fn heights_and_rules(&mut self) -> (&mut [i32], &mut [SizeRules]) {
271 (self.heights.as_mut(), self.height_rules.as_mut())
272 }
273}
274
275mod sealed {
276 pub trait Sealed {}
277 impl<const C: usize> Sealed for super::FixedRowStorage<C> {}
278 impl Sealed for super::DynRowStorage {}
279 impl Sealed for Vec<i32> {}
280 impl<const L: usize> Sealed for [i32; L] {}
281 impl<const C: usize, const R: usize> Sealed for super::FixedGridStorage<C, R> {}
282 impl Sealed for super::DynGridStorage {}
283}