ferroui_base/rendering/composition/generated/
composition_simple_pen.rs1use 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 #[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
60pub 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
85pub 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}