1use crate::data::core::ValueTypes;
9use crate::ferro_markup_type;
10use crate::metadata::{MarkupType, MarkupTyped};
11use std::rc::Rc;
12
13ferro_markup_type!(interface dyn crate::media::IBrush as "IBrush" {
14 namespace: "FerroUI.Media",
15 handles: [Rc<dyn crate::media::IBrush>, Option<Rc<dyn crate::media::IBrush>>],
16 this: Rc<dyn crate::media::IBrush>,
17 parse: crate::media::Brush::parse,
18 properties: [
19 Opacity: f64 { get: |brush: &Rc<dyn crate::media::IBrush>| brush.opacity() },
20 Transform: Option<Rc<dyn crate::media::ITransform>> {
21 get: |brush: &Rc<dyn crate::media::IBrush>| brush.transform()
22 },
23 TransformOrigin: crate::RelativePoint { get: |brush: &Rc<dyn crate::media::IBrush>| brush.transform_origin() },
24 ],
25});
26
27impl PartialEq for dyn crate::media::ISolidColorBrush {
31 fn eq(&self, other: &Self) -> bool {
32 crate::media::IBrush::equals(self, other as &dyn crate::media::IBrush)
33 }
34}
35
36impl PartialEq for dyn crate::media::IImmutableBrush {
37 fn eq(&self, other: &Self) -> bool {
38 crate::media::IBrush::equals(self, other as &dyn crate::media::IBrush)
39 }
40}
41
42impl PartialEq for dyn crate::media::IImmutableSolidColorBrush {
43 fn eq(&self, other: &Self) -> bool {
44 crate::media::IBrush::equals(self, other as &dyn crate::media::IBrush)
45 }
46}
47
48ferro_markup_type!(interface dyn crate::media::ISolidColorBrush as "ISolidColorBrush" {
49 namespace: "FerroUI.Media",
50 handles: [Rc<dyn crate::media::ISolidColorBrush>, Option<Rc<dyn crate::media::ISolidColorBrush>>],
51 this: Rc<dyn crate::media::ISolidColorBrush>,
52 interfaces: [Rc<dyn crate::media::IBrush>],
53 properties: [
54 Color: crate::media::Color { get: |brush: &Rc<dyn crate::media::ISolidColorBrush>| brush.color() },
55 ],
56});
57
58ferro_markup_type!(interface dyn crate::media::IImmutableBrush as "IImmutableBrush" {
59 namespace: "FerroUI.Media",
60 handles: [Rc<dyn crate::media::IImmutableBrush>, Option<Rc<dyn crate::media::IImmutableBrush>>],
61 interfaces: [Rc<dyn crate::media::IBrush>],
62});
63
64ferro_markup_type!(interface dyn crate::media::IImmutableSolidColorBrush as "IImmutableSolidColorBrush" {
65 namespace: "FerroUI.Media",
66 handles: [
67 Rc<dyn crate::media::IImmutableSolidColorBrush>,
68 Option<Rc<dyn crate::media::IImmutableSolidColorBrush>>,
69 ],
70 interfaces: [
71 Rc<dyn crate::media::ISolidColorBrush>,
72 Rc<dyn crate::media::IImmutableBrush>,
73 Rc<dyn crate::media::IBrush>,
74 ],
75});
76
77ferro_markup_type!(interface dyn crate::media::IImage as "IImage" {
78 namespace: "FerroUI.Media",
79 handles: [Rc<dyn crate::media::IImage>, Option<Rc<dyn crate::media::IImage>>],
80});
81
82ferro_markup_type!(interface dyn crate::media::IImageBrushSource as "IImageBrushSource" {
83 namespace: "FerroUI.Media",
84 handles: [Rc<dyn crate::media::IImageBrushSource>, Option<Rc<dyn crate::media::IImageBrushSource>>],
85});
86
87ferro_markup_type!(interface dyn crate::media::imaging::IBitmap as "IBitmap" {
90 namespace: "FerroUI.Media.Imaging",
91 handles: [Rc<dyn crate::media::imaging::IBitmap>, Option<Rc<dyn crate::media::imaging::IBitmap>>],
92});
93
94ferro_markup_type!(interface dyn crate::media::fonts::IFontCollection as "IFontCollection" {
97 namespace: "FerroUI.Media.Fonts",
98 handles: [Rc<dyn crate::media::fonts::IFontCollection>, Option<Rc<dyn crate::media::fonts::IFontCollection>>],
99 this: Rc<dyn crate::media::fonts::IFontCollection>,
100 properties: [
101 Key: crate::utilities::Uri { get: |fonts: &Rc<dyn crate::media::fonts::IFontCollection>| fonts.key() },
102 Count: i32 { get: |fonts: &Rc<dyn crate::media::fonts::IFontCollection>| fonts.count() as i32 },
103 ],
104});
105
106ferro_markup_type!(interface dyn crate::media::ITransform as "ITransform" {
107 namespace: "FerroUI.Media",
108 handles: [Rc<dyn crate::media::ITransform>, Option<Rc<dyn crate::media::ITransform>>],
109 parse: |s: &str| {
111 crate::media::transformation::TransformOperations::parse(s)
112 .map(|operations| -> Rc<dyn crate::media::ITransform> { operations })
113 },
114});
115
116ferro_markup_type!(interface dyn crate::media::IPen as "IPen" {
117 namespace: "FerroUI.Media",
118 handles: [Rc<dyn crate::media::IPen>, Option<Rc<dyn crate::media::IPen>>],
119});
120
121ferro_markup_type!(interface dyn crate::media::IDashStyle as "IDashStyle" {
122 namespace: "FerroUI.Media",
123 handles: [Rc<dyn crate::media::IDashStyle>, Option<Rc<dyn crate::media::IDashStyle>>],
124});
125
126ferro_markup_type!(interface dyn crate::media::IExperimentalAcrylicMaterial as "IExperimentalAcrylicMaterial" {
127 namespace: "FerroUI.Media",
128 handles: [Rc<dyn crate::media::IExperimentalAcrylicMaterial>, Option<Rc<dyn crate::media::IExperimentalAcrylicMaterial>>],
129});
130
131ferro_markup_type!(interface dyn crate::media::effects::IEffect as "IEffect" {
132 namespace: "FerroUI.Media",
133 handles: [Rc<dyn crate::media::effects::IEffect>, Option<Rc<dyn crate::media::effects::IEffect>>],
134 parse: crate::media::effects::Effect::parse,
135});
136
137ferro_markup_type!(interface dyn crate::styling::IStyle as "IStyle" {
138 namespace: "FerroUI.Styling",
139 handles: [Rc<dyn crate::styling::IStyle>, Option<Rc<dyn crate::styling::IStyle>>],
140});
141
142ferro_markup_type!(interface dyn crate::styling::IStyleHost as "IStyleHost" {
143 namespace: "FerroUI.Styling",
144 handles: [Rc<dyn crate::styling::IStyleHost>, Option<Rc<dyn crate::styling::IStyleHost>>],
145});
146
147ferro_markup_type!(interface dyn crate::styling::ITemplate as "ITemplate" {
148 namespace: "FerroUI.Styling",
149 handles: [Rc<dyn crate::styling::ITemplate>, Option<Rc<dyn crate::styling::ITemplate>>],
150});
151
152ferro_markup_type!(interface dyn crate::controls::IResourceNode as "IResourceNode" {
153 namespace: "FerroUI.Controls",
154 handles: [Rc<dyn crate::controls::IResourceNode>, Option<Rc<dyn crate::controls::IResourceNode>>],
155});
156
157ferro_markup_type!(interface dyn crate::controls::IResourceHost as "IResourceHost" {
158 namespace: "FerroUI.Controls",
159 handles: [Rc<dyn crate::controls::IResourceHost>, Option<Rc<dyn crate::controls::IResourceHost>>],
160});
161
162ferro_markup_type!(interface dyn crate::controls::IResourceProvider as "IResourceProvider" {
163 namespace: "FerroUI.Controls",
164 handles: [Rc<dyn crate::controls::IResourceProvider>, Option<Rc<dyn crate::controls::IResourceProvider>>],
165});
166
167fn resource_dictionary(
170 dictionary: &Rc<dyn crate::controls::IResourceDictionary>,
171) -> Result<crate::Ref<crate::controls::ResourceDictionary>, String> {
172 dictionary
173 .as_object()
174 .and_then(|object| object.to_ref().cast::<crate::controls::ResourceDictionary>())
175 .ok_or_else(|| "The resource dictionary is not a ResourceDictionary.".to_string())
176}
177
178ferro_markup_type!(interface dyn crate::controls::IResourceDictionary as "IResourceDictionary" {
179 namespace: "FerroUI.Controls",
180 handles: [Rc<dyn crate::controls::IResourceDictionary>, Option<Rc<dyn crate::controls::IResourceDictionary>>],
181 this: Rc<dyn crate::controls::IResourceDictionary>,
182 interfaces: [Rc<dyn crate::controls::IResourceProvider>],
183 properties: [
184 Count: i32 { get: |dictionary: &Rc<dyn crate::controls::IResourceDictionary>| dictionary.count() as i32 },
185 MergedDictionaries: crate::collections::FerroList<Rc<dyn crate::controls::IResourceProvider>> {
186 try_get: |dictionary: &Rc<dyn crate::controls::IResourceDictionary>| {
187 resource_dictionary(dictionary).map(|dictionary| dictionary.merged_dictionaries())
188 }
189 },
190 ThemeDictionaries: crate::collections::FerroDictionary<
191 crate::styling::ThemeVariant,
192 Rc<dyn crate::controls::IThemeVariantProvider>,
193 > {
194 try_get: |dictionary: &Rc<dyn crate::controls::IResourceDictionary>| {
195 resource_dictionary(dictionary).map(|dictionary| dictionary.theme_dictionaries())
196 }
197 },
198 ],
199 methods: [
200 try fn Add(Option<crate::BoxedValue>, Option<crate::BoxedValue>) =>
202 |dictionary: &Rc<dyn crate::controls::IResourceDictionary>,
203 key: Option<crate::BoxedValue>,
204 value: Option<crate::BoxedValue>| {
205 let key = super::plain::resource_key(key)?;
206 if dictionary.contains_key(&key) {
207 return Err(format!("An item with the same key has already been added. Key: {key}"));
208 }
209 Ok::<(), String>(dictionary.add(key, value))
210 },
211 ],
212});
213
214ferro_markup_type!(interface dyn crate::controls::IThemeVariantProvider as "IThemeVariantProvider" {
215 namespace: "FerroUI.Controls",
216 handles: [Rc<dyn crate::controls::IThemeVariantProvider>, Option<Rc<dyn crate::controls::IThemeVariantProvider>>],
217 this: Rc<dyn crate::controls::IThemeVariantProvider>,
218 interfaces: [Rc<dyn crate::controls::IResourceProvider>],
219 properties: [
220 Key: Option<crate::styling::ThemeVariant> {
222 get: |provider: &Rc<dyn crate::controls::IThemeVariantProvider>| provider.key(),
223 set: |provider: &Rc<dyn crate::controls::IThemeVariantProvider>, value: Option<crate::styling::ThemeVariant>| {
224 provider.set_key(value)
225 }
226 },
227 ],
228});
229
230ferro_markup_type!(interface dyn crate::controls::IDeferredContent as "IDeferredContent" {
231 namespace: "FerroUI.Controls",
232 handles: [Rc<dyn crate::controls::IDeferredContent>, Option<Rc<dyn crate::controls::IDeferredContent>>],
233});
234
235ferro_markup_type!(interface dyn crate::input::ICommand as "ICommand" {
236 namespace: "System.Windows.Input",
237 handles: [Rc<dyn crate::input::ICommand>, Option<Rc<dyn crate::input::ICommand>>],
238});
239
240ferro_markup_type!(interface dyn crate::data::converters::IValueConverter as "IValueConverter" {
241 namespace: "FerroUI.Data.Converters",
242 handles: [Rc<dyn crate::data::converters::IValueConverter>, Option<Rc<dyn crate::data::converters::IValueConverter>>],
243});
244
245ferro_markup_type!(interface dyn crate::data::converters::IMultiValueConverter as "IMultiValueConverter" {
246 namespace: "FerroUI.Data.Converters",
247 handles: [Rc<dyn crate::data::converters::IMultiValueConverter>, Option<Rc<dyn crate::data::converters::IMultiValueConverter>>],
248});
249
250ferro_markup_type!(interface dyn crate::animation::easings::IEasing as "IEasing" {
251 namespace: "FerroUI.Animation.Easings",
252 handles: [Rc<dyn crate::animation::easings::IEasing>, Option<Rc<dyn crate::animation::easings::IEasing>>],
253});
254
255ferro_markup_type!(interface dyn crate::animation::ITransition as "ITransition" {
256 namespace: "FerroUI.Animation",
257 handles: [Rc<dyn crate::animation::ITransition>, Option<Rc<dyn crate::animation::ITransition>>],
258});
259
260ferro_markup_type!(interface dyn crate::animation::IAnimation as "IAnimation" {
261 namespace: "FerroUI.Animation",
262 handles: [Rc<dyn crate::animation::IAnimation>, Option<Rc<dyn crate::animation::IAnimation>>],
263});
264
265ferro_markup_type!(interface dyn crate::animation::IAnimationSetter as "IAnimationSetter" {
266 namespace: "FerroUI.Animation",
267 handles: [Rc<dyn crate::animation::IAnimationSetter>, Option<Rc<dyn crate::animation::IAnimationSetter>>],
268});
269
270ferro_markup_type!(interface dyn crate::animation::ICustomAnimator as "CustomAnimatorBase" {
273 namespace: "FerroUI.Animation",
274 handles: [Rc<dyn crate::animation::ICustomAnimator>, Option<Rc<dyn crate::animation::ICustomAnimator>>],
275});
276
277ferro_markup_type!(interface dyn crate::animation::IPageTransition as "IPageTransition" {
278 namespace: "FerroUI.Animation",
279 handles: [Rc<dyn crate::animation::IPageTransition>, Option<Rc<dyn crate::animation::IPageTransition>>],
280});
281
282ferro_markup_type!(interface dyn crate::animation::IClock as "IClock" {
283 namespace: "FerroUI.Animation",
284 handles: [Rc<dyn crate::animation::IClock>, Option<Rc<dyn crate::animation::IClock>>],
285});
286
287ferro_markup_type!(interface dyn crate::metadata::IServiceProvider as "IServiceProvider" {
288 namespace: "System",
289 handles: [Rc<dyn crate::metadata::IServiceProvider>, Option<Rc<dyn crate::metadata::IServiceProvider>>],
290});
291
292ferro_markup_type!(interface dyn crate::INamed as "INamed" {
293 namespace: "FerroUI",
294 handles: [Rc<dyn crate::INamed>, Option<Rc<dyn crate::INamed>>],
295 this: Rc<dyn crate::INamed>,
296 properties: [
297 Name: Option<String> { get: |named: &Rc<dyn crate::INamed>| named.name() },
298 ],
299});
300
301ferro_markup_type!(interface dyn crate::controls::INameScope as "INameScope" {
304 this: crate::controls::NameScopeRef,
305 namespace: "FerroUI.Controls",
306 handles: [
307 crate::controls::NameScopeRef,
308 Option<crate::controls::NameScopeRef>,
309 Rc<dyn crate::controls::INameScope>,
310 Option<Rc<dyn crate::controls::INameScope>>,
311 ],
312 properties: [
313 IsCompleted: bool { get: |scope: &crate::controls::NameScopeRef| scope.is_completed() },
314 ],
315 methods: [
316 try fn Register(String, Option<crate::BoxedValue>) =>
318 |scope: &crate::controls::NameScopeRef, name: String, element: Option<crate::BoxedValue>| {
319 match element.as_ref().and_then(|element| ValueTypes::as_object(&**element)) {
320 Some(element) => scope.try_register(&name, element).map_err(|error| error.to_string()),
321 None => Err("Only an object of the object model can be registered in a name scope.".to_string()),
322 }
323 },
324 fn Find(String) -> Option<crate::Ref<crate::FerroObject>> =>
325 |scope: &crate::controls::NameScopeRef, name: String| scope.find(&name),
326 fn Complete() => |scope: &crate::controls::NameScopeRef| scope.complete(),
327 ],
328});
329
330ferro_markup_type!(class dyn crate::styling::SetterBase as "SetterBase" {
334 namespace: "FerroUI.Styling",
335 handles: [Rc<dyn crate::styling::SetterBase>, Option<Rc<dyn crate::styling::SetterBase>>],
336});
337
338ferro_markup_type!(class dyn crate::data::BindingBase as "BindingBase" {
339 namespace: "FerroUI.Data",
340 handles: [Rc<dyn crate::data::BindingBase>, Option<Rc<dyn crate::data::BindingBase>>],
341});
342
343ferro_markup_type!(class dyn crate::media::TextTrimming as "TextTrimming" {
344 namespace: "FerroUI.Media",
345 handles: [Rc<dyn crate::media::TextTrimming>, Option<Rc<dyn crate::media::TextTrimming>>],
346 parse: <dyn crate::media::TextTrimming>::parse,
347 static_properties: [
348 None: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::none },
349 CharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::character_ellipsis },
350 WordEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::word_ellipsis },
351 PrefixCharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::prefix_character_ellipsis },
352 LeadingCharacterEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::leading_character_ellipsis },
353 PathSegmentEllipsis: Rc<dyn crate::media::TextTrimming> { get: <dyn crate::media::TextTrimming>::path_segment_ellipsis },
354 ],
355});
356
357pub(super) const TYPES: &[&MarkupType] = &[
359 <dyn crate::INamed as MarkupTyped>::MARKUP,
360 <dyn crate::media::IBrush as MarkupTyped>::MARKUP,
361 <dyn crate::media::ISolidColorBrush as MarkupTyped>::MARKUP,
362 <dyn crate::media::IImmutableBrush as MarkupTyped>::MARKUP,
363 <dyn crate::media::IImmutableSolidColorBrush as MarkupTyped>::MARKUP,
364 <dyn crate::media::IImage as MarkupTyped>::MARKUP,
365 <dyn crate::media::IImageBrushSource as MarkupTyped>::MARKUP,
366 <dyn crate::media::imaging::IBitmap as MarkupTyped>::MARKUP,
367 <dyn crate::media::ITransform as MarkupTyped>::MARKUP,
368 <dyn crate::media::fonts::IFontCollection as MarkupTyped>::MARKUP,
369 <dyn crate::media::IPen as MarkupTyped>::MARKUP,
370 <dyn crate::media::IDashStyle as MarkupTyped>::MARKUP,
371 <dyn crate::media::IExperimentalAcrylicMaterial as MarkupTyped>::MARKUP,
372 <dyn crate::media::effects::IEffect as MarkupTyped>::MARKUP,
373 <dyn crate::styling::IStyle as MarkupTyped>::MARKUP,
374 <dyn crate::styling::IStyleHost as MarkupTyped>::MARKUP,
375 <dyn crate::styling::ITemplate as MarkupTyped>::MARKUP,
376 <dyn crate::controls::IResourceNode as MarkupTyped>::MARKUP,
377 <dyn crate::controls::IResourceHost as MarkupTyped>::MARKUP,
378 <dyn crate::controls::IResourceProvider as MarkupTyped>::MARKUP,
379 <dyn crate::controls::IResourceDictionary as MarkupTyped>::MARKUP,
380 <dyn crate::controls::IThemeVariantProvider as MarkupTyped>::MARKUP,
381 <dyn crate::controls::IDeferredContent as MarkupTyped>::MARKUP,
382 <dyn crate::input::ICommand as MarkupTyped>::MARKUP,
383 <dyn crate::data::converters::IValueConverter as MarkupTyped>::MARKUP,
384 <dyn crate::data::converters::IMultiValueConverter as MarkupTyped>::MARKUP,
385 <dyn crate::animation::easings::IEasing as MarkupTyped>::MARKUP,
386 <dyn crate::animation::ITransition as MarkupTyped>::MARKUP,
387 <dyn crate::animation::IAnimation as MarkupTyped>::MARKUP,
388 <dyn crate::animation::IAnimationSetter as MarkupTyped>::MARKUP,
389 <dyn crate::animation::ICustomAnimator as MarkupTyped>::MARKUP,
390 <dyn crate::animation::IPageTransition as MarkupTyped>::MARKUP,
391 <dyn crate::animation::IClock as MarkupTyped>::MARKUP,
392 <dyn crate::metadata::IServiceProvider as MarkupTyped>::MARKUP,
393 <dyn crate::controls::INameScope as MarkupTyped>::MARKUP,
394 <dyn crate::styling::SetterBase as MarkupTyped>::MARKUP,
395 <dyn crate::data::BindingBase as MarkupTyped>::MARKUP,
396 <dyn crate::media::TextTrimming as MarkupTyped>::MARKUP,
397];
398
399pub(super) fn register_value_types() {
404 ValueTypes::register_nullable::<Rc<dyn crate::media::IBrush>>();
405 ValueTypes::register_nullable::<Rc<dyn crate::media::ISolidColorBrush>>();
406 ValueTypes::register_nullable::<Rc<dyn crate::media::IImmutableBrush>>();
407 ValueTypes::register_nullable::<Rc<dyn crate::media::IImmutableSolidColorBrush>>();
408 ValueTypes::register_cast::<Rc<dyn crate::controls::IThemeVariantProvider>, Rc<dyn crate::controls::IResourceProvider>>(
410 |provider| provider.clone(),
411 );
412 ValueTypes::register_cast::<Rc<dyn crate::media::ISolidColorBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
414 ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
415 ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::IBrush>>(|b| b.clone());
416 ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::ISolidColorBrush>>(
417 |b| b.clone(),
418 );
419 ValueTypes::register_cast::<Rc<dyn crate::media::IImmutableSolidColorBrush>, Rc<dyn crate::media::IImmutableBrush>>(
420 |b| b.clone(),
421 );
422 ValueTypes::register_nullable::<Rc<dyn crate::media::IImage>>();
423 ValueTypes::register_nullable::<Rc<dyn crate::media::IImageBrushSource>>();
424 ValueTypes::register_nullable::<Rc<dyn crate::media::imaging::IBitmap>>();
425 ValueTypes::register_nullable::<Rc<dyn crate::media::ITransform>>();
426 ValueTypes::register_nullable::<Rc<dyn crate::media::fonts::IFontCollection>>();
427 ValueTypes::register_nullable::<Rc<dyn crate::media::IPen>>();
428 ValueTypes::register_nullable::<Rc<dyn crate::media::IDashStyle>>();
429 ValueTypes::register_nullable::<Rc<dyn crate::media::IExperimentalAcrylicMaterial>>();
430 ValueTypes::register_nullable::<Rc<dyn crate::media::effects::IEffect>>();
431 ValueTypes::register_nullable::<Rc<dyn crate::input::ICommand>>();
432 ValueTypes::register_nullable::<Rc<dyn crate::animation::ITransition>>();
433 ValueTypes::register_nullable::<Rc<dyn crate::animation::IPageTransition>>();
434 ValueTypes::register_nullable::<Rc<dyn crate::animation::IClock>>();
435 ValueTypes::register_nullable::<Rc<dyn crate::media::TextTrimming>>();
436 ValueTypes::register_nullable::<crate::controls::NameScopeRef>();
437 ValueTypes::register_nullable::<Rc<dyn crate::INamed>>();
438 ValueTypes::register_nullable::<Rc<dyn crate::styling::IStyle>>();
439 ValueTypes::register_nullable::<Rc<dyn crate::styling::SetterBase>>();
440 ValueTypes::register_nullable::<Rc<dyn crate::styling::ITemplate>>();
441 ValueTypes::register_nullable::<Rc<dyn crate::controls::IResourceProvider>>();
442 ValueTypes::register_nullable::<Rc<dyn crate::controls::IResourceDictionary>>();
443 ValueTypes::register_nullable::<Rc<dyn crate::controls::IThemeVariantProvider>>();
444 ValueTypes::register_nullable::<Rc<dyn crate::controls::IDeferredContent>>();
445 ValueTypes::register_nullable::<Rc<dyn crate::data::converters::IValueConverter>>();
446 ValueTypes::register_nullable::<Rc<dyn crate::data::converters::IMultiValueConverter>>();
447 ValueTypes::register_nullable::<Rc<dyn crate::animation::easings::IEasing>>();
448 ValueTypes::register_nullable::<Rc<dyn crate::animation::IAnimation>>();
449 ValueTypes::register_nullable::<Rc<dyn crate::animation::IAnimationSetter>>();
450 ValueTypes::register_nullable::<Rc<dyn crate::animation::ICustomAnimator>>();
451 ValueTypes::register_nullable::<Rc<dyn crate::data::BindingBase>>();
452
453}