ferroui_base/rendering/composition/generated/
composition_rounded_rectangle_geometry.rs1use bitflags::bitflags;
8use crate::Vector;
9use crate::rendering::composition::animations::AnimationInstanceFactory;
10use crate::rendering::composition::animations::ICompositionAnimation;
11use crate::rendering::composition::expressions::ExpressionVariant;
12use crate::rendering::composition::server::CompositionProperty;
13use crate::rendering::composition::server::CompositionPropertyOf;
14use crate::rendering::composition::server::ServerPropertyValue;
15use crate::rendering::composition::server::props_of;
16use crate::rendering::composition::transport::BatchStreamReader;
17use crate::rendering::composition::transport::BatchStreamWriter;
18use crate::rendering::composition::transport::BatchValue;
19use crate::rendering::composition::transport::BatchValueReader;
20use std::any::Any;
21use std::any::TypeId;
22use std::cell::Cell;
23use std::sync::OnceLock;
24use std::time::Duration;
25use super::CompositionGeometryHooks;
26use super::CompositionGeometryProps;
27use super::ServerCompositionGeometryHooks;
28use super::ServerCompositionGeometryProps;
29
30bitflags! {
31 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
33 pub struct CompositionRoundedRectangleGeometryChangedFields: u8 {
34 const CORNER_RADIUS = 1;
35 const CORNER_RADIUS_ANIMATED = 2;
36 const OFFSET = 4;
37 const OFFSET_ANIMATED = 8;
38 const SIZE = 16;
39 const SIZE_ANIMATED = 32;
40 }
41}
42
43impl BatchValue for CompositionRoundedRectangleGeometryChangedFields {
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 CompositionRoundedRectangleGeometryChangedFields::from_bits_retain(u8::read_from(input))
52 }
53}
54
55pub trait CompositionRoundedRectangleGeometryHooks: CompositionGeometryHooks {
58 fn initialize_defaults_extra(&self) {}
59
60 fn validate_corner_radius_change(&self, _old_value: Vector, _new_value: Vector) {}
61 fn on_corner_radius_changed(&self) {}
62 fn on_corner_radius_changing(&self) {}
63
64 fn validate_offset_change(&self, _old_value: Vector, _new_value: Vector) {}
65 fn on_offset_changed(&self) {}
66 fn on_offset_changing(&self) {}
67
68 fn validate_size_change(&self, _old_value: Vector, _new_value: Vector) {}
69 fn on_size_changed(&self) {}
70 fn on_size_changing(&self) {}
71}
72
73pub struct CompositionRoundedRectangleGeometryProps {
75 base: CompositionGeometryProps,
76 changed_fields_of_composition_rounded_rectangle_geometry: Cell<CompositionRoundedRectangleGeometryChangedFields>,
77 corner_radius: Cell<Vector>,
78 offset: Cell<Vector>,
79 size: Cell<Vector>,
80}
81
82impl Default for CompositionRoundedRectangleGeometryProps {
83 fn default() -> Self {
84 Self::new()
85 }
86}
87
88impl CompositionRoundedRectangleGeometryProps {
89 pub fn new() -> Self {
93 Self {
94 base: CompositionGeometryProps::new(),
95 changed_fields_of_composition_rounded_rectangle_geometry: Cell::new(CompositionRoundedRectangleGeometryChangedFields::empty()),
96 corner_radius: Cell::new(Default::default()),
97 offset: Cell::new(Default::default()),
98 size: Cell::new(Default::default()),
99 }
100 }
101
102 pub fn base(&self) -> &CompositionGeometryProps {
104 &self.base
105 }
106
107 pub fn initialize_defaults(&self, host: &dyn CompositionRoundedRectangleGeometryHooks) {
110 self.base.initialize_defaults(host);
111 self.initialize_own_defaults(host);
112 }
113
114 pub fn initialize_own_defaults(&self, host: &dyn CompositionRoundedRectangleGeometryHooks) {
116 CompositionRoundedRectangleGeometryHooks::initialize_defaults_extra(host);
117 }
118
119 pub fn corner_radius(&self) -> Vector {
121 self.corner_radius.get()
122 }
123
124 pub fn set_corner_radius(&self, host: &dyn CompositionRoundedRectangleGeometryHooks, value: Vector) {
126 let mut changed = false;
127 let old_value = self.corner_radius.get();
128 if old_value.differs(&value) {
129 CompositionRoundedRectangleGeometryHooks::validate_corner_radius_change(host, old_value, value);
130 CompositionRoundedRectangleGeometryHooks::on_corner_radius_changing(host);
131 changed = true;
132 self.corner_radius.set(value);
134 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS);
136 host.register_for_serialization();
137 host.pending_animations().remove(ServerCompositionRoundedRectangleGeometryProps::id_of_corner_radius_property().base());
139 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() & !CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS_ANIMATED);
140 if let Some(animation) = host.implicit_animation("CornerRadius") {
142 if let Some(a) = animation.as_composition_animation() {
144 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS_ANIMATED);
145 host.pending_animations().set(
146 ServerCompositionRoundedRectangleGeometryProps::id_of_corner_radius_property().base(),
147 a.create_instance(host.server(), Some(ExpressionVariant::create(value))),
148 );
149 }
150 host.start_animation_group(&animation, "CornerRadius", ExpressionVariant::create(value));
152 }
153 }
154 self.corner_radius.set(value);
155 if changed {
156 CompositionRoundedRectangleGeometryHooks::on_corner_radius_changed(host);
157 }
158 }
159
160 pub fn offset(&self) -> Vector {
162 self.offset.get()
163 }
164
165 pub fn set_offset(&self, host: &dyn CompositionRoundedRectangleGeometryHooks, value: Vector) {
167 let mut changed = false;
168 let old_value = self.offset.get();
169 if old_value.differs(&value) {
170 CompositionRoundedRectangleGeometryHooks::validate_offset_change(host, old_value, value);
171 CompositionRoundedRectangleGeometryHooks::on_offset_changing(host);
172 changed = true;
173 self.offset.set(value);
175 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::OFFSET);
177 host.register_for_serialization();
178 host.pending_animations().remove(ServerCompositionRoundedRectangleGeometryProps::id_of_offset_property().base());
180 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() & !CompositionRoundedRectangleGeometryChangedFields::OFFSET_ANIMATED);
181 if let Some(animation) = host.implicit_animation("Offset") {
183 if let Some(a) = animation.as_composition_animation() {
185 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::OFFSET_ANIMATED);
186 host.pending_animations().set(
187 ServerCompositionRoundedRectangleGeometryProps::id_of_offset_property().base(),
188 a.create_instance(host.server(), Some(ExpressionVariant::create(value))),
189 );
190 }
191 host.start_animation_group(&animation, "Offset", ExpressionVariant::create(value));
193 }
194 }
195 self.offset.set(value);
196 if changed {
197 CompositionRoundedRectangleGeometryHooks::on_offset_changed(host);
198 }
199 }
200
201 pub fn size(&self) -> Vector {
203 self.size.get()
204 }
205
206 pub fn set_size(&self, host: &dyn CompositionRoundedRectangleGeometryHooks, value: Vector) {
208 let mut changed = false;
209 let old_value = self.size.get();
210 if old_value.differs(&value) {
211 CompositionRoundedRectangleGeometryHooks::validate_size_change(host, old_value, value);
212 CompositionRoundedRectangleGeometryHooks::on_size_changing(host);
213 changed = true;
214 self.size.set(value);
216 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::SIZE);
218 host.register_for_serialization();
219 host.pending_animations().remove(ServerCompositionRoundedRectangleGeometryProps::id_of_size_property().base());
221 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() & !CompositionRoundedRectangleGeometryChangedFields::SIZE_ANIMATED);
222 if let Some(animation) = host.implicit_animation("Size") {
224 if let Some(a) = animation.as_composition_animation() {
226 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::SIZE_ANIMATED);
227 host.pending_animations().set(
228 ServerCompositionRoundedRectangleGeometryProps::id_of_size_property().base(),
229 a.create_instance(host.server(), Some(ExpressionVariant::create(value))),
230 );
231 }
232 host.start_animation_group(&animation, "Size", ExpressionVariant::create(value));
234 }
235 }
236 self.size.set(value);
237 if changed {
238 CompositionRoundedRectangleGeometryHooks::on_size_changed(host);
239 }
240 }
241
242 pub fn start_animation(
246 &self,
247 host: &dyn CompositionRoundedRectangleGeometryHooks,
248 property_name: &str,
249 animation: &dyn ICompositionAnimation,
250 final_value: Option<ExpressionVariant>,
251 ) -> bool {
252 if property_name == "CornerRadius" {
253 let server = animation.create_instance(host.server(), final_value);
254 host.pending_animations().set(ServerCompositionRoundedRectangleGeometryProps::id_of_corner_radius_property().base(), server);
255 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS_ANIMATED);
256 host.register_for_serialization();
257 return true;
258 }
259 if property_name == "Offset" {
260 let server = animation.create_instance(host.server(), final_value);
261 host.pending_animations().set(ServerCompositionRoundedRectangleGeometryProps::id_of_offset_property().base(), server);
262 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::OFFSET_ANIMATED);
263 host.register_for_serialization();
264 return true;
265 }
266 if property_name == "Size" {
267 let server = animation.create_instance(host.server(), final_value);
268 host.pending_animations().set(ServerCompositionRoundedRectangleGeometryProps::id_of_size_property().base(), server);
269 self.changed_fields_of_composition_rounded_rectangle_geometry.set(self.changed_fields_of_composition_rounded_rectangle_geometry.get() | CompositionRoundedRectangleGeometryChangedFields::SIZE_ANIMATED);
270 host.register_for_serialization();
271 return true;
272 }
273 self.base.start_animation(host, property_name, animation, final_value)
274 }
275
276 pub fn serialize_changes_core(&self, host: &dyn CompositionRoundedRectangleGeometryHooks, writer: &mut BatchStreamWriter<'_>) {
279 self.base.serialize_changes_core(host, writer);
280 let changed = self.changed_fields_of_composition_rounded_rectangle_geometry.get();
281 writer.write(changed);
282 if changed.contains(CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS_ANIMATED) {
283 writer.write_value(host.pending_animations().get_and_remove(ServerCompositionRoundedRectangleGeometryProps::id_of_corner_radius_property().base()));
284 } else if changed.contains(CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS) {
285 writer.write(self.corner_radius.get());
286 }
287 if changed.contains(CompositionRoundedRectangleGeometryChangedFields::OFFSET_ANIMATED) {
288 writer.write_value(host.pending_animations().get_and_remove(ServerCompositionRoundedRectangleGeometryProps::id_of_offset_property().base()));
289 } else if changed.contains(CompositionRoundedRectangleGeometryChangedFields::OFFSET) {
290 writer.write(self.offset.get());
291 }
292 if changed.contains(CompositionRoundedRectangleGeometryChangedFields::SIZE_ANIMATED) {
293 writer.write_value(host.pending_animations().get_and_remove(ServerCompositionRoundedRectangleGeometryProps::id_of_size_property().base()));
294 } else if changed.contains(CompositionRoundedRectangleGeometryChangedFields::SIZE) {
295 writer.write(self.size.get());
296 }
297 self.changed_fields_of_composition_rounded_rectangle_geometry.set(CompositionRoundedRectangleGeometryChangedFields::empty());
298 }
299}
300
301pub trait ServerCompositionRoundedRectangleGeometryHooks: ServerCompositionGeometryHooks {
304 fn deserialize_changes_extra(&self, _reader: &mut BatchStreamReader<'_>) {}
305 fn on_fields_deserialized(&self, _changed: CompositionRoundedRectangleGeometryChangedFields) {}
306}
307
308pub struct ServerCompositionRoundedRectangleGeometryProps {
310 base: ServerCompositionGeometryProps,
311 corner_radius: Cell<Vector>,
312 offset: Cell<Vector>,
313 size: Cell<Vector>,
314}
315
316impl Default for ServerCompositionRoundedRectangleGeometryProps {
317 fn default() -> Self {
318 Self::new()
319 }
320}
321
322impl ServerCompositionRoundedRectangleGeometryProps {
323 pub fn new() -> Self {
326 Self {
327 base: ServerCompositionGeometryProps::new(),
328 corner_radius: Cell::new(Default::default()),
329 offset: Cell::new(Default::default()),
330 size: Cell::new(Default::default()),
331 }
332 }
333
334 pub fn base(&self) -> &ServerCompositionGeometryProps {
336 &self.base
337 }
338
339 pub fn find_props(&self, type_id: TypeId) -> Option<&dyn Any> {
342 if type_id == TypeId::of::<Self>() {
343 return Some(self);
344 }
345 self.base.find_props(type_id)
346 }
347
348 pub fn id_of_corner_radius_property() -> &'static CompositionPropertyOf<Vector> {
350 static PROPERTY: OnceLock<CompositionPropertyOf<Vector>> = OnceLock::new();
351 PROPERTY.get_or_init(|| {
352 CompositionProperty::register::<ServerCompositionRoundedRectangleGeometryProps, Vector>(
353 "CornerRadius",
354 "ServerCompositionRoundedRectangleGeometry",
355 |obj| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).corner_radius.get(),
356 |obj, v| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).corner_radius.set(v),
357 Some(|obj| ExpressionVariant::create(props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).corner_radius.get())),
358 Some(|obj, v: ExpressionVariant| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).corner_radius.set(v.cast_or_default::<Vector>())),
359 )
360 })
361 }
362
363 pub fn corner_radius(&self) -> Vector {
365 self.corner_radius.get()
366 }
367
368 pub fn set_corner_radius(&self, host: &dyn ServerCompositionRoundedRectangleGeometryHooks, value: Vector) {
369 self.corner_radius.set(value);
370 host.remove_animation_for_property(Self::id_of_corner_radius_property().base());
371 }
372
373 pub fn id_of_offset_property() -> &'static CompositionPropertyOf<Vector> {
375 static PROPERTY: OnceLock<CompositionPropertyOf<Vector>> = OnceLock::new();
376 PROPERTY.get_or_init(|| {
377 CompositionProperty::register::<ServerCompositionRoundedRectangleGeometryProps, Vector>(
378 "Offset",
379 "ServerCompositionRoundedRectangleGeometry",
380 |obj| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).offset.get(),
381 |obj, v| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).offset.set(v),
382 Some(|obj| ExpressionVariant::create(props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).offset.get())),
383 Some(|obj, v: ExpressionVariant| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).offset.set(v.cast_or_default::<Vector>())),
384 )
385 })
386 }
387
388 pub fn offset(&self) -> Vector {
390 self.offset.get()
391 }
392
393 pub fn set_offset(&self, host: &dyn ServerCompositionRoundedRectangleGeometryHooks, value: Vector) {
394 self.offset.set(value);
395 host.remove_animation_for_property(Self::id_of_offset_property().base());
396 }
397
398 pub fn id_of_size_property() -> &'static CompositionPropertyOf<Vector> {
400 static PROPERTY: OnceLock<CompositionPropertyOf<Vector>> = OnceLock::new();
401 PROPERTY.get_or_init(|| {
402 CompositionProperty::register::<ServerCompositionRoundedRectangleGeometryProps, Vector>(
403 "Size",
404 "ServerCompositionRoundedRectangleGeometry",
405 |obj| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).size.get(),
406 |obj, v| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).size.set(v),
407 Some(|obj| ExpressionVariant::create(props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).size.get())),
408 Some(|obj, v: ExpressionVariant| props_of::<ServerCompositionRoundedRectangleGeometryProps>(obj).size.set(v.cast_or_default::<Vector>())),
409 )
410 })
411 }
412
413 pub fn size(&self) -> Vector {
415 self.size.get()
416 }
417
418 pub fn set_size(&self, host: &dyn ServerCompositionRoundedRectangleGeometryHooks, value: Vector) {
419 self.size.set(value);
420 host.remove_animation_for_property(Self::id_of_size_property().base());
421 }
422
423 pub fn deserialize_changes_core(
426 &self,
427 host: &dyn ServerCompositionRoundedRectangleGeometryHooks,
428 reader: &mut BatchStreamReader<'_>,
429 committed_at: Duration,
430 ) {
431 self.base.deserialize_changes_core(host, reader, committed_at);
432 ServerCompositionRoundedRectangleGeometryHooks::deserialize_changes_extra(host, reader);
433 let changed = reader.read::<CompositionRoundedRectangleGeometryChangedFields>();
434 if changed.contains(CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS_ANIMATED) {
435 let Some(animation) = reader.read_value::<AnimationInstanceFactory>().map(AnimationInstanceFactory::create) else {
436 panic!("a batch starts an animation of `CornerRadius` without an animation instance");
437 };
438 host.set_animated_value(
439 Self::id_of_corner_radius_property().base(),
440 ExpressionVariant::create(self.corner_radius.get()),
441 committed_at,
442 animation,
443 );
444 } else if changed.contains(CompositionRoundedRectangleGeometryChangedFields::CORNER_RADIUS) {
445 let value = reader.read::<Vector>();
446 self.set_corner_radius(host, value);
447 }
448 if changed.contains(CompositionRoundedRectangleGeometryChangedFields::OFFSET_ANIMATED) {
449 let Some(animation) = reader.read_value::<AnimationInstanceFactory>().map(AnimationInstanceFactory::create) else {
450 panic!("a batch starts an animation of `Offset` without an animation instance");
451 };
452 host.set_animated_value(
453 Self::id_of_offset_property().base(),
454 ExpressionVariant::create(self.offset.get()),
455 committed_at,
456 animation,
457 );
458 } else if changed.contains(CompositionRoundedRectangleGeometryChangedFields::OFFSET) {
459 let value = reader.read::<Vector>();
460 self.set_offset(host, value);
461 }
462 if changed.contains(CompositionRoundedRectangleGeometryChangedFields::SIZE_ANIMATED) {
463 let Some(animation) = reader.read_value::<AnimationInstanceFactory>().map(AnimationInstanceFactory::create) else {
464 panic!("a batch starts an animation of `Size` without an animation instance");
465 };
466 host.set_animated_value(
467 Self::id_of_size_property().base(),
468 ExpressionVariant::create(self.size.get()),
469 committed_at,
470 animation,
471 );
472 } else if changed.contains(CompositionRoundedRectangleGeometryChangedFields::SIZE) {
473 let value = reader.read::<Vector>();
474 self.set_size(host, value);
475 }
476 ServerCompositionRoundedRectangleGeometryHooks::on_fields_deserialized(host, changed);
477 }
478
479 pub fn get_composition_property(name: &str) -> Option<&'static CompositionProperty> {
482 if name == "CornerRadius" {
483 return Some(Self::id_of_corner_radius_property().base());
484 }
485 if name == "Offset" {
486 return Some(Self::id_of_offset_property().base());
487 }
488 if name == "Size" {
489 return Some(Self::id_of_size_property().base());
490 }
491 ServerCompositionGeometryProps::get_composition_property(name)
492 }
493}