ferroui_base/rendering/composition/generated/
composition_tile_brush.rs1use bitflags::bitflags;
8use crate::RelativeRect;
9use crate::media::AlignmentX;
10use crate::media::AlignmentY;
11use crate::media::Stretch;
12use crate::media::TileMode;
13use crate::rendering::composition::server::CompositionProperty;
14use crate::rendering::composition::server::CompositionPropertyOf;
15use crate::rendering::composition::server::ServerPropertyValue;
16use crate::rendering::composition::server::ServerValueChange;
17use crate::rendering::composition::server::props_of;
18use crate::rendering::composition::transport::BatchStreamReader;
19use crate::rendering::composition::transport::BatchStreamWriter;
20use crate::rendering::composition::transport::BatchValue;
21use crate::rendering::composition::transport::BatchValueReader;
22use std::any::Any;
23use std::any::TypeId;
24use std::cell::Cell;
25use std::sync::OnceLock;
26use std::time::Duration;
27use super::ServerCompositionBrushHooks;
28use super::ServerCompositionBrushProps;
29
30bitflags! {
31 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
33 pub struct CompositionTileBrushChangedFields: u8 {
34 const ALIGNMENT_X = 1;
35 const ALIGNMENT_Y = 2;
36 const DESTINATION_RECT = 4;
37 const SOURCE_RECT = 8;
38 const STRETCH = 16;
39 const TILE_MODE = 32;
40 }
41}
42
43impl BatchValue for CompositionTileBrushChangedFields {
44 #[inline]
45 fn write_to(&self, out: &mut Vec<u8>) {
46 self.bits().write_to(out);
47 }
48
49 #[inline]
50 fn read_from(input: &mut BatchValueReader<'_>) -> Self {
51 CompositionTileBrushChangedFields::from_bits_retain(u8::read_from(input))
52 }
53}
54
55pub trait ServerCompositionTileBrushHooks: ServerCompositionBrushHooks {
58 fn deserialize_changes_extra(&self, _reader: &mut BatchStreamReader<'_>) {}
59 fn on_fields_deserialized(&self, _changed: CompositionTileBrushChangedFields) {}
60
61 fn on_alignment_x_changed(&self) {}
62 fn on_alignment_x_changing(&self) {}
63
64 fn on_alignment_y_changed(&self) {}
65 fn on_alignment_y_changing(&self) {}
66
67 fn on_destination_rect_changed(&self) {}
68 fn on_destination_rect_changing(&self) {}
69
70 fn on_source_rect_changed(&self) {}
71 fn on_source_rect_changing(&self) {}
72
73 fn on_stretch_changed(&self) {}
74 fn on_stretch_changing(&self) {}
75
76 fn on_tile_mode_changed(&self) {}
77 fn on_tile_mode_changing(&self) {}
78}
79
80pub struct ServerCompositionTileBrushProps {
82 base: ServerCompositionBrushProps,
83 alignment_x: Cell<AlignmentX>,
84 alignment_y: Cell<AlignmentY>,
85 destination_rect: Cell<RelativeRect>,
86 source_rect: Cell<RelativeRect>,
87 stretch: Cell<Stretch>,
88 tile_mode: Cell<TileMode>,
89}
90
91impl Default for ServerCompositionTileBrushProps {
92 fn default() -> Self {
93 Self::new()
94 }
95}
96
97impl ServerCompositionTileBrushProps {
98 pub fn new() -> Self {
101 Self {
102 base: ServerCompositionBrushProps::new(),
103 alignment_x: Cell::new(Default::default()),
104 alignment_y: Cell::new(Default::default()),
105 destination_rect: Cell::new(Default::default()),
106 source_rect: Cell::new(Default::default()),
107 stretch: Cell::new(Default::default()),
108 tile_mode: Cell::new(Default::default()),
109 }
110 }
111
112 pub fn base(&self) -> &ServerCompositionBrushProps {
114 &self.base
115 }
116
117 pub fn find_props(&self, type_id: TypeId) -> Option<&dyn Any> {
120 if type_id == TypeId::of::<Self>() {
121 return Some(self);
122 }
123 self.base.find_props(type_id)
124 }
125
126 pub fn id_of_alignment_x_property() -> &'static CompositionPropertyOf<AlignmentX> {
128 static PROPERTY: OnceLock<CompositionPropertyOf<AlignmentX>> = OnceLock::new();
129 PROPERTY.get_or_init(|| {
130 CompositionProperty::register::<ServerCompositionTileBrushProps, AlignmentX>(
131 "AlignmentX",
132 "ServerCompositionTileBrush",
133 |obj| props_of::<ServerCompositionTileBrushProps>(obj).alignment_x.get(),
134 |obj, v| props_of::<ServerCompositionTileBrushProps>(obj).alignment_x.set(v),
135 None,
136 None,
137 )
138 })
139 }
140
141 pub fn alignment_x(&self) -> AlignmentX {
143 self.alignment_x.get()
144 }
145
146 pub fn set_alignment_x(&self, host: &dyn ServerCompositionTileBrushHooks, value: AlignmentX) {
147 let old_value = self.alignment_x.get();
148 let mut changed = false;
149 if old_value.differs(&value) {
150 ServerCompositionTileBrushHooks::on_alignment_x_changing(host);
151 changed = true;
152 }
153 host.set_value(
154 Self::id_of_alignment_x_property().base(),
155 ServerValueChange {
156 equal: old_value.default_equals(&value),
157 old_resource: None,
158 new_resource: None,
159 assign: &mut || self.alignment_x.set(value),
160 },
161 );
162 if changed {
163 ServerCompositionTileBrushHooks::on_alignment_x_changed(host);
164 }
165 }
166
167 pub fn id_of_alignment_y_property() -> &'static CompositionPropertyOf<AlignmentY> {
169 static PROPERTY: OnceLock<CompositionPropertyOf<AlignmentY>> = OnceLock::new();
170 PROPERTY.get_or_init(|| {
171 CompositionProperty::register::<ServerCompositionTileBrushProps, AlignmentY>(
172 "AlignmentY",
173 "ServerCompositionTileBrush",
174 |obj| props_of::<ServerCompositionTileBrushProps>(obj).alignment_y.get(),
175 |obj, v| props_of::<ServerCompositionTileBrushProps>(obj).alignment_y.set(v),
176 None,
177 None,
178 )
179 })
180 }
181
182 pub fn alignment_y(&self) -> AlignmentY {
184 self.alignment_y.get()
185 }
186
187 pub fn set_alignment_y(&self, host: &dyn ServerCompositionTileBrushHooks, value: AlignmentY) {
188 let old_value = self.alignment_y.get();
189 let mut changed = false;
190 if old_value.differs(&value) {
191 ServerCompositionTileBrushHooks::on_alignment_y_changing(host);
192 changed = true;
193 }
194 host.set_value(
195 Self::id_of_alignment_y_property().base(),
196 ServerValueChange {
197 equal: old_value.default_equals(&value),
198 old_resource: None,
199 new_resource: None,
200 assign: &mut || self.alignment_y.set(value),
201 },
202 );
203 if changed {
204 ServerCompositionTileBrushHooks::on_alignment_y_changed(host);
205 }
206 }
207
208 pub fn id_of_destination_rect_property() -> &'static CompositionPropertyOf<RelativeRect> {
210 static PROPERTY: OnceLock<CompositionPropertyOf<RelativeRect>> = OnceLock::new();
211 PROPERTY.get_or_init(|| {
212 CompositionProperty::register::<ServerCompositionTileBrushProps, RelativeRect>(
213 "DestinationRect",
214 "ServerCompositionTileBrush",
215 |obj| props_of::<ServerCompositionTileBrushProps>(obj).destination_rect.get(),
216 |obj, v| props_of::<ServerCompositionTileBrushProps>(obj).destination_rect.set(v),
217 None,
218 None,
219 )
220 })
221 }
222
223 pub fn destination_rect(&self) -> RelativeRect {
225 self.destination_rect.get()
226 }
227
228 pub fn set_destination_rect(&self, host: &dyn ServerCompositionTileBrushHooks, value: RelativeRect) {
229 let old_value = self.destination_rect.get();
230 let mut changed = false;
231 if old_value.differs(&value) {
232 ServerCompositionTileBrushHooks::on_destination_rect_changing(host);
233 changed = true;
234 }
235 host.set_value(
236 Self::id_of_destination_rect_property().base(),
237 ServerValueChange {
238 equal: old_value.default_equals(&value),
239 old_resource: None,
240 new_resource: None,
241 assign: &mut || self.destination_rect.set(value),
242 },
243 );
244 if changed {
245 ServerCompositionTileBrushHooks::on_destination_rect_changed(host);
246 }
247 }
248
249 pub fn id_of_source_rect_property() -> &'static CompositionPropertyOf<RelativeRect> {
251 static PROPERTY: OnceLock<CompositionPropertyOf<RelativeRect>> = OnceLock::new();
252 PROPERTY.get_or_init(|| {
253 CompositionProperty::register::<ServerCompositionTileBrushProps, RelativeRect>(
254 "SourceRect",
255 "ServerCompositionTileBrush",
256 |obj| props_of::<ServerCompositionTileBrushProps>(obj).source_rect.get(),
257 |obj, v| props_of::<ServerCompositionTileBrushProps>(obj).source_rect.set(v),
258 None,
259 None,
260 )
261 })
262 }
263
264 pub fn source_rect(&self) -> RelativeRect {
266 self.source_rect.get()
267 }
268
269 pub fn set_source_rect(&self, host: &dyn ServerCompositionTileBrushHooks, value: RelativeRect) {
270 let old_value = self.source_rect.get();
271 let mut changed = false;
272 if old_value.differs(&value) {
273 ServerCompositionTileBrushHooks::on_source_rect_changing(host);
274 changed = true;
275 }
276 host.set_value(
277 Self::id_of_source_rect_property().base(),
278 ServerValueChange {
279 equal: old_value.default_equals(&value),
280 old_resource: None,
281 new_resource: None,
282 assign: &mut || self.source_rect.set(value),
283 },
284 );
285 if changed {
286 ServerCompositionTileBrushHooks::on_source_rect_changed(host);
287 }
288 }
289
290 pub fn id_of_stretch_property() -> &'static CompositionPropertyOf<Stretch> {
292 static PROPERTY: OnceLock<CompositionPropertyOf<Stretch>> = OnceLock::new();
293 PROPERTY.get_or_init(|| {
294 CompositionProperty::register::<ServerCompositionTileBrushProps, Stretch>(
295 "Stretch",
296 "ServerCompositionTileBrush",
297 |obj| props_of::<ServerCompositionTileBrushProps>(obj).stretch.get(),
298 |obj, v| props_of::<ServerCompositionTileBrushProps>(obj).stretch.set(v),
299 None,
300 None,
301 )
302 })
303 }
304
305 pub fn stretch(&self) -> Stretch {
307 self.stretch.get()
308 }
309
310 pub fn set_stretch(&self, host: &dyn ServerCompositionTileBrushHooks, value: Stretch) {
311 let old_value = self.stretch.get();
312 let mut changed = false;
313 if old_value.differs(&value) {
314 ServerCompositionTileBrushHooks::on_stretch_changing(host);
315 changed = true;
316 }
317 host.set_value(
318 Self::id_of_stretch_property().base(),
319 ServerValueChange {
320 equal: old_value.default_equals(&value),
321 old_resource: None,
322 new_resource: None,
323 assign: &mut || self.stretch.set(value),
324 },
325 );
326 if changed {
327 ServerCompositionTileBrushHooks::on_stretch_changed(host);
328 }
329 }
330
331 pub fn id_of_tile_mode_property() -> &'static CompositionPropertyOf<TileMode> {
333 static PROPERTY: OnceLock<CompositionPropertyOf<TileMode>> = OnceLock::new();
334 PROPERTY.get_or_init(|| {
335 CompositionProperty::register::<ServerCompositionTileBrushProps, TileMode>(
336 "TileMode",
337 "ServerCompositionTileBrush",
338 |obj| props_of::<ServerCompositionTileBrushProps>(obj).tile_mode.get(),
339 |obj, v| props_of::<ServerCompositionTileBrushProps>(obj).tile_mode.set(v),
340 None,
341 None,
342 )
343 })
344 }
345
346 pub fn tile_mode(&self) -> TileMode {
348 self.tile_mode.get()
349 }
350
351 pub fn set_tile_mode(&self, host: &dyn ServerCompositionTileBrushHooks, value: TileMode) {
352 let old_value = self.tile_mode.get();
353 let mut changed = false;
354 if old_value.differs(&value) {
355 ServerCompositionTileBrushHooks::on_tile_mode_changing(host);
356 changed = true;
357 }
358 host.set_value(
359 Self::id_of_tile_mode_property().base(),
360 ServerValueChange {
361 equal: old_value.default_equals(&value),
362 old_resource: None,
363 new_resource: None,
364 assign: &mut || self.tile_mode.set(value),
365 },
366 );
367 if changed {
368 ServerCompositionTileBrushHooks::on_tile_mode_changed(host);
369 }
370 }
371
372 pub fn deserialize_changes_core(
375 &self,
376 host: &dyn ServerCompositionTileBrushHooks,
377 reader: &mut BatchStreamReader<'_>,
378 committed_at: Duration,
379 ) {
380 self.base.deserialize_changes_core(host, reader, committed_at);
381 ServerCompositionTileBrushHooks::deserialize_changes_extra(host, reader);
382 let changed = reader.read::<CompositionTileBrushChangedFields>();
383 if changed.contains(CompositionTileBrushChangedFields::ALIGNMENT_X) {
384 let value = reader.read::<AlignmentX>();
385 self.set_alignment_x(host, value);
386 }
387 if changed.contains(CompositionTileBrushChangedFields::ALIGNMENT_Y) {
388 let value = reader.read::<AlignmentY>();
389 self.set_alignment_y(host, value);
390 }
391 if changed.contains(CompositionTileBrushChangedFields::DESTINATION_RECT) {
392 let value = reader.read::<RelativeRect>();
393 self.set_destination_rect(host, value);
394 }
395 if changed.contains(CompositionTileBrushChangedFields::SOURCE_RECT) {
396 let value = reader.read::<RelativeRect>();
397 self.set_source_rect(host, value);
398 }
399 if changed.contains(CompositionTileBrushChangedFields::STRETCH) {
400 let value = reader.read::<Stretch>();
401 self.set_stretch(host, value);
402 }
403 if changed.contains(CompositionTileBrushChangedFields::TILE_MODE) {
404 let value = reader.read::<TileMode>();
405 self.set_tile_mode(host, value);
406 }
407 ServerCompositionTileBrushHooks::on_fields_deserialized(host, changed);
408 }
409
410 pub fn serialize_all_changes(
413 writer: &mut BatchStreamWriter<'_>,
414 alignment_x: AlignmentX,
415 alignment_y: AlignmentY,
416 destination_rect: RelativeRect,
417 source_rect: RelativeRect,
418 stretch: Stretch,
419 tile_mode: TileMode,
420 ) {
421 writer.write(CompositionTileBrushChangedFields::ALIGNMENT_X | CompositionTileBrushChangedFields::ALIGNMENT_Y | CompositionTileBrushChangedFields::DESTINATION_RECT | CompositionTileBrushChangedFields::SOURCE_RECT | CompositionTileBrushChangedFields::STRETCH | CompositionTileBrushChangedFields::TILE_MODE);
422 writer.write(alignment_x);
423 writer.write(alignment_y);
424 writer.write(destination_rect);
425 writer.write(source_rect);
426 writer.write(stretch);
427 writer.write(tile_mode);
428 }
429}