Skip to main content

ferroui_base/rendering/composition/generated/
composition_simple_pen.rs

1// @generated by scripts/generate_composition.py — do not edit
2
3//! `CompositionSimplePen` (server only).
4//!
5//! Schema attributes: internal.
6
7use bitflags::bitflags;
8use crate::media::IBrush;
9use crate::media::PenLineCap;
10use crate::media::PenLineJoin;
11use crate::media::immutable::ImmutableDashStyle;
12use crate::rendering::composition::expressions::ExpressionVariant;
13use crate::rendering::composition::server::AsServerRenderResource;
14use crate::rendering::composition::server::CompositionProperty;
15use crate::rendering::composition::server::CompositionPropertyOf;
16use crate::rendering::composition::server::IServerPropertyHost;
17use crate::rendering::composition::server::ServerPropertyValue;
18use crate::rendering::composition::server::ServerResourceRef;
19use crate::rendering::composition::server::ServerValueChange;
20use crate::rendering::composition::server::props_of;
21use crate::rendering::composition::server::read_resource;
22use crate::rendering::composition::transport::BatchResource;
23use crate::rendering::composition::transport::BatchStreamReader;
24use crate::rendering::composition::transport::BatchStreamWriter;
25use crate::rendering::composition::transport::BatchValue;
26use crate::rendering::composition::transport::BatchValueReader;
27use std::any::Any;
28use std::any::TypeId;
29use std::cell::Cell;
30use std::cell::RefCell;
31use std::sync::Arc;
32use std::sync::OnceLock;
33use std::time::Duration;
34
35bitflags! {
36    /// The fields of `CompositionSimplePen` that changed since its last serialization.
37    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
38    pub struct CompositionSimplePenChangedFields: u8 {
39        const BRUSH = 1;
40        const DASH_STYLE = 2;
41        const LINE_CAP = 4;
42        const LINE_JOIN = 8;
43        const MITER_LIMIT = 16;
44        const THICKNESS = 32;
45    }
46}
47
48impl BatchValue for CompositionSimplePenChangedFields {
49    #[inline]
50    fn write_to(&self, out: &mut Vec<u8>) {
51        self.bits().write_to(out);
52    }
53
54    #[inline]
55    fn read_from(input: &mut BatchValueReader<'_>) -> Self {
56        CompositionSimplePenChangedFields::from_bits_retain(u8::read_from(input))
57    }
58}
59
60/// The partial methods of `ServerCompositionSimplePen`: implemented by the class that embeds
61/// [`ServerCompositionSimplePenProps`]. Every hook defaults to doing nothing.
62pub trait ServerCompositionSimplePenHooks: IServerPropertyHost {
63    fn deserialize_changes_extra(&self, _reader: &mut BatchStreamReader<'_>) {}
64    fn on_fields_deserialized(&self, _changed: CompositionSimplePenChangedFields) {}
65
66    fn on_brush_changed(&self) {}
67    fn on_brush_changing(&self) {}
68
69    fn on_dash_style_changed(&self) {}
70    fn on_dash_style_changing(&self) {}
71
72    fn on_line_cap_changed(&self) {}
73    fn on_line_cap_changing(&self) {}
74
75    fn on_line_join_changed(&self) {}
76    fn on_line_join_changing(&self) {}
77
78    fn on_miter_limit_changed(&self) {}
79    fn on_miter_limit_changing(&self) {}
80
81    fn on_thickness_changed(&self) {}
82    fn on_thickness_changing(&self) {}
83}
84
85/// The server-side properties of `ServerCompositionSimplePen`.
86pub struct ServerCompositionSimplePenProps {
87    brush: RefCell<Option<ServerResourceRef<dyn IBrush>>>,
88    dash_style: RefCell<Option<Arc<ImmutableDashStyle>>>,
89    line_cap: Cell<PenLineCap>,
90    line_join: Cell<PenLineJoin>,
91    miter_limit: Cell<f64>,
92    thickness: Cell<f64>,
93}
94
95impl Default for ServerCompositionSimplePenProps {
96    fn default() -> Self {
97        Self::new()
98    }
99}
100
101impl ServerCompositionSimplePenProps {
102    /// Creates the properties with every field at the default of its type; the
103    /// values of the UI thread arrive with the first batch.
104    pub fn new() -> Self {
105        Self {
106            brush: RefCell::new(None),
107            dash_style: RefCell::new(None),
108            line_cap: Cell::new(Default::default()),
109            line_join: Cell::new(Default::default()),
110            miter_limit: Cell::new(Default::default()),
111            thickness: Cell::new(Default::default()),
112        }
113    }
114
115    /// This block or the block of a base class, by type: what
116    /// `IServerObject::get_props` of the embedding class returns.
117    pub fn find_props(&self, type_id: TypeId) -> Option<&dyn Any> {
118        if type_id == TypeId::of::<Self>() {
119            return Some(self);
120        }
121        None
122    }
123
124    /// The composition property of `Brush`.
125    pub fn id_of_brush_property() -> &'static CompositionPropertyOf<Option<ServerResourceRef<dyn IBrush>>> {
126        static PROPERTY: OnceLock<CompositionPropertyOf<Option<ServerResourceRef<dyn IBrush>>>> = OnceLock::new();
127        PROPERTY.get_or_init(|| {
128            CompositionProperty::register::<ServerCompositionSimplePenProps, Option<ServerResourceRef<dyn IBrush>>>(
129                "Brush",
130                "ServerCompositionSimplePen",
131                |obj| props_of::<ServerCompositionSimplePenProps>(obj).brush.borrow().clone(),
132                |obj, v| *props_of::<ServerCompositionSimplePenProps>(obj).brush.borrow_mut() = v,
133                None,
134                None,
135            )
136        })
137    }
138
139    /// `Brush`.
140    pub fn brush(&self) -> Option<ServerResourceRef<dyn IBrush>> {
141        self.brush.borrow().clone()
142    }
143
144    pub fn set_brush(&self, host: &dyn ServerCompositionSimplePenHooks, value: Option<ServerResourceRef<dyn IBrush>>) {
145        let old_value = self.brush.borrow().clone();
146        let mut changed = false;
147        if old_value.differs(&value) {
148            ServerCompositionSimplePenHooks::on_brush_changing(host);
149            changed = true;
150        }
151        host.set_value(
152            Self::id_of_brush_property().base(),
153            ServerValueChange {
154                equal: old_value.default_equals(&value),
155                old_resource: old_value.as_server_render_resource(),
156                new_resource: value.as_server_render_resource(),
157                assign: &mut || *self.brush.borrow_mut() = value.clone(),
158            },
159        );
160        if changed {
161            ServerCompositionSimplePenHooks::on_brush_changed(host);
162        }
163    }
164
165    /// The composition property of `DashStyle`.
166    pub fn id_of_dash_style_property() -> &'static CompositionPropertyOf<Option<Arc<ImmutableDashStyle>>> {
167        static PROPERTY: OnceLock<CompositionPropertyOf<Option<Arc<ImmutableDashStyle>>>> = OnceLock::new();
168        PROPERTY.get_or_init(|| {
169            CompositionProperty::register::<ServerCompositionSimplePenProps, Option<Arc<ImmutableDashStyle>>>(
170                "DashStyle",
171                "ServerCompositionSimplePen",
172                |obj| props_of::<ServerCompositionSimplePenProps>(obj).dash_style.borrow().clone(),
173                |obj, v| *props_of::<ServerCompositionSimplePenProps>(obj).dash_style.borrow_mut() = v,
174                None,
175                None,
176            )
177        })
178    }
179
180    /// `DashStyle`.
181    pub fn dash_style(&self) -> Option<Arc<ImmutableDashStyle>> {
182        self.dash_style.borrow().clone()
183    }
184
185    pub fn set_dash_style(&self, host: &dyn ServerCompositionSimplePenHooks, value: Option<Arc<ImmutableDashStyle>>) {
186        let old_value = self.dash_style.borrow().clone();
187        let mut changed = false;
188        if old_value.differs(&value) {
189            ServerCompositionSimplePenHooks::on_dash_style_changing(host);
190            changed = true;
191        }
192        host.set_value(
193            Self::id_of_dash_style_property().base(),
194            ServerValueChange {
195                equal: old_value.default_equals(&value),
196                old_resource: None,
197                new_resource: None,
198                assign: &mut || *self.dash_style.borrow_mut() = value.clone(),
199            },
200        );
201        if changed {
202            ServerCompositionSimplePenHooks::on_dash_style_changed(host);
203        }
204    }
205
206    /// The composition property of `LineCap`.
207    pub fn id_of_line_cap_property() -> &'static CompositionPropertyOf<PenLineCap> {
208        static PROPERTY: OnceLock<CompositionPropertyOf<PenLineCap>> = OnceLock::new();
209        PROPERTY.get_or_init(|| {
210            CompositionProperty::register::<ServerCompositionSimplePenProps, PenLineCap>(
211                "LineCap",
212                "ServerCompositionSimplePen",
213                |obj| props_of::<ServerCompositionSimplePenProps>(obj).line_cap.get(),
214                |obj, v| props_of::<ServerCompositionSimplePenProps>(obj).line_cap.set(v),
215                None,
216                None,
217            )
218        })
219    }
220
221    /// `LineCap`.
222    pub fn line_cap(&self) -> PenLineCap {
223        self.line_cap.get()
224    }
225
226    pub fn set_line_cap(&self, host: &dyn ServerCompositionSimplePenHooks, value: PenLineCap) {
227        let old_value = self.line_cap.get();
228        let mut changed = false;
229        if old_value.differs(&value) {
230            ServerCompositionSimplePenHooks::on_line_cap_changing(host);
231            changed = true;
232        }
233        host.set_value(
234            Self::id_of_line_cap_property().base(),
235            ServerValueChange {
236                equal: old_value.default_equals(&value),
237                old_resource: None,
238                new_resource: None,
239                assign: &mut || self.line_cap.set(value),
240            },
241        );
242        if changed {
243            ServerCompositionSimplePenHooks::on_line_cap_changed(host);
244        }
245    }
246
247    /// The composition property of `LineJoin`.
248    pub fn id_of_line_join_property() -> &'static CompositionPropertyOf<PenLineJoin> {
249        static PROPERTY: OnceLock<CompositionPropertyOf<PenLineJoin>> = OnceLock::new();
250        PROPERTY.get_or_init(|| {
251            CompositionProperty::register::<ServerCompositionSimplePenProps, PenLineJoin>(
252                "LineJoin",
253                "ServerCompositionSimplePen",
254                |obj| props_of::<ServerCompositionSimplePenProps>(obj).line_join.get(),
255                |obj, v| props_of::<ServerCompositionSimplePenProps>(obj).line_join.set(v),
256                None,
257                None,
258            )
259        })
260    }
261
262    /// `LineJoin`.
263    pub fn line_join(&self) -> PenLineJoin {
264        self.line_join.get()
265    }
266
267    pub fn set_line_join(&self, host: &dyn ServerCompositionSimplePenHooks, value: PenLineJoin) {
268        let old_value = self.line_join.get();
269        let mut changed = false;
270        if old_value.differs(&value) {
271            ServerCompositionSimplePenHooks::on_line_join_changing(host);
272            changed = true;
273        }
274        host.set_value(
275            Self::id_of_line_join_property().base(),
276            ServerValueChange {
277                equal: old_value.default_equals(&value),
278                old_resource: None,
279                new_resource: None,
280                assign: &mut || self.line_join.set(value),
281            },
282        );
283        if changed {
284            ServerCompositionSimplePenHooks::on_line_join_changed(host);
285        }
286    }
287
288    /// The composition property of `MiterLimit`.
289    pub fn id_of_miter_limit_property() -> &'static CompositionPropertyOf<f64> {
290        static PROPERTY: OnceLock<CompositionPropertyOf<f64>> = OnceLock::new();
291        PROPERTY.get_or_init(|| {
292            CompositionProperty::register::<ServerCompositionSimplePenProps, f64>(
293                "MiterLimit",
294                "ServerCompositionSimplePen",
295                |obj| props_of::<ServerCompositionSimplePenProps>(obj).miter_limit.get(),
296                |obj, v| props_of::<ServerCompositionSimplePenProps>(obj).miter_limit.set(v),
297                Some(|obj| ExpressionVariant::create(props_of::<ServerCompositionSimplePenProps>(obj).miter_limit.get())),
298                None,
299            )
300        })
301    }
302
303    /// `MiterLimit`.
304    pub fn miter_limit(&self) -> f64 {
305        self.miter_limit.get()
306    }
307
308    pub fn set_miter_limit(&self, host: &dyn ServerCompositionSimplePenHooks, value: f64) {
309        let old_value = self.miter_limit.get();
310        let mut changed = false;
311        if old_value.differs(&value) {
312            ServerCompositionSimplePenHooks::on_miter_limit_changing(host);
313            changed = true;
314        }
315        host.set_value(
316            Self::id_of_miter_limit_property().base(),
317            ServerValueChange {
318                equal: old_value.default_equals(&value),
319                old_resource: None,
320                new_resource: None,
321                assign: &mut || self.miter_limit.set(value),
322            },
323        );
324        if changed {
325            ServerCompositionSimplePenHooks::on_miter_limit_changed(host);
326        }
327    }
328
329    /// The composition property of `Thickness`.
330    pub fn id_of_thickness_property() -> &'static CompositionPropertyOf<f64> {
331        static PROPERTY: OnceLock<CompositionPropertyOf<f64>> = OnceLock::new();
332        PROPERTY.get_or_init(|| {
333            CompositionProperty::register::<ServerCompositionSimplePenProps, f64>(
334                "Thickness",
335                "ServerCompositionSimplePen",
336                |obj| props_of::<ServerCompositionSimplePenProps>(obj).thickness.get(),
337                |obj, v| props_of::<ServerCompositionSimplePenProps>(obj).thickness.set(v),
338                Some(|obj| ExpressionVariant::create(props_of::<ServerCompositionSimplePenProps>(obj).thickness.get())),
339                None,
340            )
341        })
342    }
343
344    /// `Thickness`.
345    pub fn thickness(&self) -> f64 {
346        self.thickness.get()
347    }
348
349    pub fn set_thickness(&self, host: &dyn ServerCompositionSimplePenHooks, value: f64) {
350        let old_value = self.thickness.get();
351        let mut changed = false;
352        if old_value.differs(&value) {
353            ServerCompositionSimplePenHooks::on_thickness_changing(host);
354            changed = true;
355        }
356        host.set_value(
357            Self::id_of_thickness_property().base(),
358            ServerValueChange {
359                equal: old_value.default_equals(&value),
360                old_resource: None,
361                new_resource: None,
362                assign: &mut || self.thickness.set(value),
363            },
364        );
365        if changed {
366            ServerCompositionSimplePenHooks::on_thickness_changed(host);
367        }
368    }
369
370    /// Reads the changes of the object: the base class first, then the
371    /// changed-fields mask and the changed members of this class.
372    pub fn deserialize_changes_core(
373        &self,
374        host: &dyn ServerCompositionSimplePenHooks,
375        reader: &mut BatchStreamReader<'_>,
376        _committed_at: Duration,
377    ) {
378        let compositor = host.server_compositor();
379        ServerCompositionSimplePenHooks::deserialize_changes_extra(host, reader);
380        let changed = reader.read::<CompositionSimplePenChangedFields>();
381        if changed.contains(CompositionSimplePenChangedFields::BRUSH) {
382            let value = read_resource(reader, compositor.as_ref(), |o| o.as_brush());
383            self.set_brush(host, value);
384        }
385        if changed.contains(CompositionSimplePenChangedFields::DASH_STYLE) {
386            let value = reader.read_value::<Arc<ImmutableDashStyle>>();
387            self.set_dash_style(host, value);
388        }
389        if changed.contains(CompositionSimplePenChangedFields::LINE_CAP) {
390            let value = reader.read::<PenLineCap>();
391            self.set_line_cap(host, value);
392        }
393        if changed.contains(CompositionSimplePenChangedFields::LINE_JOIN) {
394            let value = reader.read::<PenLineJoin>();
395            self.set_line_join(host, value);
396        }
397        if changed.contains(CompositionSimplePenChangedFields::MITER_LIMIT) {
398            let value = reader.read::<f64>();
399            self.set_miter_limit(host, value);
400        }
401        if changed.contains(CompositionSimplePenChangedFields::THICKNESS) {
402            let value = reader.read::<f64>();
403            self.set_thickness(host, value);
404        }
405        ServerCompositionSimplePenHooks::on_fields_deserialized(host, changed);
406    }
407
408    /// Writes every property of the class, in the form
409    /// [`deserialize_changes_core`](Self::deserialize_changes_core) reads.
410    pub fn serialize_all_changes(
411        writer: &mut BatchStreamWriter<'_>,
412        brush: Option<BatchResource<dyn IBrush>>,
413        dash_style: Option<Arc<ImmutableDashStyle>>,
414        line_cap: PenLineCap,
415        line_join: PenLineJoin,
416        miter_limit: f64,
417        thickness: f64,
418    ) {
419        writer.write(CompositionSimplePenChangedFields::BRUSH | CompositionSimplePenChangedFields::DASH_STYLE | CompositionSimplePenChangedFields::LINE_CAP | CompositionSimplePenChangedFields::LINE_JOIN | CompositionSimplePenChangedFields::MITER_LIMIT | CompositionSimplePenChangedFields::THICKNESS);
420        writer.write_resource(brush);
421        writer.write_value(dash_style);
422        writer.write(line_cap);
423        writer.write(line_join);
424        writer.write(miter_limit);
425        writer.write(thickness);
426    }
427}