Skip to main content

ferroui_base/markup_types/
animation.rs

1//! Markup metadata of the easings and page transitions of this crate: plain
2//! classes, held through `Rc`. An easing is an [`Easing`] (the abstract
3//! class of the managed original) and an easing contract; a page transition
4//! is a page transition contract.
5
6use crate::animation::easings::*;
7use crate::animation::{
8    CompositePageTransition, CrossFade, FillMode, IPageTransition, PageSlide, Rotate3DTransition, SlideAxis, TimeSpan,
9};
10use crate::data::core::ValueTypes;
11use crate::ferro_markup_type;
12use crate::metadata::{MarkupType, MarkupTyped};
13use crate::{Ref, animation::KeySpline};
14use std::rc::Rc;
15
16// The classes with state are reference types: an instance equals itself.
17macro_rules! identity_eq {
18    ($($type_:ty),*) => {
19        $(impl PartialEq for $type_ {
20            fn eq(&self, other: &Self) -> bool {
21                std::ptr::eq(self, other)
22            }
23        })*
24    };
25}
26identity_eq!(SplineEasing, SpringEasing, CrossFade, PageSlide, CompositePageTransition, Rotate3DTransition);
27
28// FerroUI.Animation.Easings
29
30ferro_markup_type!(class BackEaseIn {
31    namespace: "FerroUI.Animation.Easings",
32    handles: [Rc<BackEaseIn>, Option<Rc<BackEaseIn>>],
33    this: Rc<BackEaseIn>,
34    base: Easing,
35    interfaces: [Rc<dyn IEasing>],
36    constructors: [() => || Rc::new(BackEaseIn::new())],
37});
38
39ferro_markup_type!(class BackEaseInOut {
40    namespace: "FerroUI.Animation.Easings",
41    handles: [Rc<BackEaseInOut>, Option<Rc<BackEaseInOut>>],
42    this: Rc<BackEaseInOut>,
43    base: Easing,
44    interfaces: [Rc<dyn IEasing>],
45    constructors: [() => || Rc::new(BackEaseInOut::new())],
46});
47
48ferro_markup_type!(class BackEaseOut {
49    namespace: "FerroUI.Animation.Easings",
50    handles: [Rc<BackEaseOut>, Option<Rc<BackEaseOut>>],
51    this: Rc<BackEaseOut>,
52    base: Easing,
53    interfaces: [Rc<dyn IEasing>],
54    constructors: [() => || Rc::new(BackEaseOut::new())],
55});
56
57ferro_markup_type!(class BounceEaseIn {
58    namespace: "FerroUI.Animation.Easings",
59    handles: [Rc<BounceEaseIn>, Option<Rc<BounceEaseIn>>],
60    this: Rc<BounceEaseIn>,
61    base: Easing,
62    interfaces: [Rc<dyn IEasing>],
63    constructors: [() => || Rc::new(BounceEaseIn::new())],
64});
65
66ferro_markup_type!(class BounceEaseInOut {
67    namespace: "FerroUI.Animation.Easings",
68    handles: [Rc<BounceEaseInOut>, Option<Rc<BounceEaseInOut>>],
69    this: Rc<BounceEaseInOut>,
70    base: Easing,
71    interfaces: [Rc<dyn IEasing>],
72    constructors: [() => || Rc::new(BounceEaseInOut::new())],
73});
74
75ferro_markup_type!(class BounceEaseOut {
76    namespace: "FerroUI.Animation.Easings",
77    handles: [Rc<BounceEaseOut>, Option<Rc<BounceEaseOut>>],
78    this: Rc<BounceEaseOut>,
79    base: Easing,
80    interfaces: [Rc<dyn IEasing>],
81    constructors: [() => || Rc::new(BounceEaseOut::new())],
82});
83
84ferro_markup_type!(class CircularEaseIn {
85    namespace: "FerroUI.Animation.Easings",
86    handles: [Rc<CircularEaseIn>, Option<Rc<CircularEaseIn>>],
87    this: Rc<CircularEaseIn>,
88    base: Easing,
89    interfaces: [Rc<dyn IEasing>],
90    constructors: [() => || Rc::new(CircularEaseIn::new())],
91});
92
93ferro_markup_type!(class CircularEaseInOut {
94    namespace: "FerroUI.Animation.Easings",
95    handles: [Rc<CircularEaseInOut>, Option<Rc<CircularEaseInOut>>],
96    this: Rc<CircularEaseInOut>,
97    base: Easing,
98    interfaces: [Rc<dyn IEasing>],
99    constructors: [() => || Rc::new(CircularEaseInOut::new())],
100});
101
102ferro_markup_type!(class CircularEaseOut {
103    namespace: "FerroUI.Animation.Easings",
104    handles: [Rc<CircularEaseOut>, Option<Rc<CircularEaseOut>>],
105    this: Rc<CircularEaseOut>,
106    base: Easing,
107    interfaces: [Rc<dyn IEasing>],
108    constructors: [() => || Rc::new(CircularEaseOut::new())],
109});
110
111ferro_markup_type!(class CubicEaseIn {
112    namespace: "FerroUI.Animation.Easings",
113    handles: [Rc<CubicEaseIn>, Option<Rc<CubicEaseIn>>],
114    this: Rc<CubicEaseIn>,
115    base: Easing,
116    interfaces: [Rc<dyn IEasing>],
117    constructors: [() => || Rc::new(CubicEaseIn::new())],
118});
119
120ferro_markup_type!(class CubicEaseInOut {
121    namespace: "FerroUI.Animation.Easings",
122    handles: [Rc<CubicEaseInOut>, Option<Rc<CubicEaseInOut>>],
123    this: Rc<CubicEaseInOut>,
124    base: Easing,
125    interfaces: [Rc<dyn IEasing>],
126    constructors: [() => || Rc::new(CubicEaseInOut::new())],
127});
128
129ferro_markup_type!(class CubicEaseOut {
130    namespace: "FerroUI.Animation.Easings",
131    handles: [Rc<CubicEaseOut>, Option<Rc<CubicEaseOut>>],
132    this: Rc<CubicEaseOut>,
133    base: Easing,
134    interfaces: [Rc<dyn IEasing>],
135    constructors: [() => || Rc::new(CubicEaseOut::new())],
136});
137
138ferro_markup_type!(class ElasticEaseIn {
139    namespace: "FerroUI.Animation.Easings",
140    handles: [Rc<ElasticEaseIn>, Option<Rc<ElasticEaseIn>>],
141    this: Rc<ElasticEaseIn>,
142    base: Easing,
143    interfaces: [Rc<dyn IEasing>],
144    constructors: [() => || Rc::new(ElasticEaseIn::new())],
145});
146
147ferro_markup_type!(class ElasticEaseInOut {
148    namespace: "FerroUI.Animation.Easings",
149    handles: [Rc<ElasticEaseInOut>, Option<Rc<ElasticEaseInOut>>],
150    this: Rc<ElasticEaseInOut>,
151    base: Easing,
152    interfaces: [Rc<dyn IEasing>],
153    constructors: [() => || Rc::new(ElasticEaseInOut::new())],
154});
155
156ferro_markup_type!(class ElasticEaseOut {
157    namespace: "FerroUI.Animation.Easings",
158    handles: [Rc<ElasticEaseOut>, Option<Rc<ElasticEaseOut>>],
159    this: Rc<ElasticEaseOut>,
160    base: Easing,
161    interfaces: [Rc<dyn IEasing>],
162    constructors: [() => || Rc::new(ElasticEaseOut::new())],
163});
164
165ferro_markup_type!(class ExponentialEaseIn {
166    namespace: "FerroUI.Animation.Easings",
167    handles: [Rc<ExponentialEaseIn>, Option<Rc<ExponentialEaseIn>>],
168    this: Rc<ExponentialEaseIn>,
169    base: Easing,
170    interfaces: [Rc<dyn IEasing>],
171    constructors: [() => || Rc::new(ExponentialEaseIn::new())],
172});
173
174ferro_markup_type!(class ExponentialEaseInOut {
175    namespace: "FerroUI.Animation.Easings",
176    handles: [Rc<ExponentialEaseInOut>, Option<Rc<ExponentialEaseInOut>>],
177    this: Rc<ExponentialEaseInOut>,
178    base: Easing,
179    interfaces: [Rc<dyn IEasing>],
180    constructors: [() => || Rc::new(ExponentialEaseInOut::new())],
181});
182
183ferro_markup_type!(class ExponentialEaseOut {
184    namespace: "FerroUI.Animation.Easings",
185    handles: [Rc<ExponentialEaseOut>, Option<Rc<ExponentialEaseOut>>],
186    this: Rc<ExponentialEaseOut>,
187    base: Easing,
188    interfaces: [Rc<dyn IEasing>],
189    constructors: [() => || Rc::new(ExponentialEaseOut::new())],
190});
191
192ferro_markup_type!(class LinearEasing {
193    namespace: "FerroUI.Animation.Easings",
194    handles: [Rc<LinearEasing>, Option<Rc<LinearEasing>>],
195    this: Rc<LinearEasing>,
196    base: Easing,
197    interfaces: [Rc<dyn IEasing>],
198    constructors: [() => || Rc::new(LinearEasing::new())],
199});
200
201ferro_markup_type!(class QuadraticEaseIn {
202    namespace: "FerroUI.Animation.Easings",
203    handles: [Rc<QuadraticEaseIn>, Option<Rc<QuadraticEaseIn>>],
204    this: Rc<QuadraticEaseIn>,
205    base: Easing,
206    interfaces: [Rc<dyn IEasing>],
207    constructors: [() => || Rc::new(QuadraticEaseIn::new())],
208});
209
210ferro_markup_type!(class QuadraticEaseInOut {
211    namespace: "FerroUI.Animation.Easings",
212    handles: [Rc<QuadraticEaseInOut>, Option<Rc<QuadraticEaseInOut>>],
213    this: Rc<QuadraticEaseInOut>,
214    base: Easing,
215    interfaces: [Rc<dyn IEasing>],
216    constructors: [() => || Rc::new(QuadraticEaseInOut::new())],
217});
218
219ferro_markup_type!(class QuadraticEaseOut {
220    namespace: "FerroUI.Animation.Easings",
221    handles: [Rc<QuadraticEaseOut>, Option<Rc<QuadraticEaseOut>>],
222    this: Rc<QuadraticEaseOut>,
223    base: Easing,
224    interfaces: [Rc<dyn IEasing>],
225    constructors: [() => || Rc::new(QuadraticEaseOut::new())],
226});
227
228ferro_markup_type!(class QuarticEaseIn {
229    namespace: "FerroUI.Animation.Easings",
230    handles: [Rc<QuarticEaseIn>, Option<Rc<QuarticEaseIn>>],
231    this: Rc<QuarticEaseIn>,
232    base: Easing,
233    interfaces: [Rc<dyn IEasing>],
234    constructors: [() => || Rc::new(QuarticEaseIn::new())],
235});
236
237ferro_markup_type!(class QuarticEaseInOut {
238    namespace: "FerroUI.Animation.Easings",
239    handles: [Rc<QuarticEaseInOut>, Option<Rc<QuarticEaseInOut>>],
240    this: Rc<QuarticEaseInOut>,
241    base: Easing,
242    interfaces: [Rc<dyn IEasing>],
243    constructors: [() => || Rc::new(QuarticEaseInOut::new())],
244});
245
246ferro_markup_type!(class QuarticEaseOut {
247    namespace: "FerroUI.Animation.Easings",
248    handles: [Rc<QuarticEaseOut>, Option<Rc<QuarticEaseOut>>],
249    this: Rc<QuarticEaseOut>,
250    base: Easing,
251    interfaces: [Rc<dyn IEasing>],
252    constructors: [() => || Rc::new(QuarticEaseOut::new())],
253});
254
255ferro_markup_type!(class QuinticEaseIn {
256    namespace: "FerroUI.Animation.Easings",
257    handles: [Rc<QuinticEaseIn>, Option<Rc<QuinticEaseIn>>],
258    this: Rc<QuinticEaseIn>,
259    base: Easing,
260    interfaces: [Rc<dyn IEasing>],
261    constructors: [() => || Rc::new(QuinticEaseIn::new())],
262});
263
264ferro_markup_type!(class QuinticEaseInOut {
265    namespace: "FerroUI.Animation.Easings",
266    handles: [Rc<QuinticEaseInOut>, Option<Rc<QuinticEaseInOut>>],
267    this: Rc<QuinticEaseInOut>,
268    base: Easing,
269    interfaces: [Rc<dyn IEasing>],
270    constructors: [() => || Rc::new(QuinticEaseInOut::new())],
271});
272
273ferro_markup_type!(class QuinticEaseOut {
274    namespace: "FerroUI.Animation.Easings",
275    handles: [Rc<QuinticEaseOut>, Option<Rc<QuinticEaseOut>>],
276    this: Rc<QuinticEaseOut>,
277    base: Easing,
278    interfaces: [Rc<dyn IEasing>],
279    constructors: [() => || Rc::new(QuinticEaseOut::new())],
280});
281
282ferro_markup_type!(class SineEaseIn {
283    namespace: "FerroUI.Animation.Easings",
284    handles: [Rc<SineEaseIn>, Option<Rc<SineEaseIn>>],
285    this: Rc<SineEaseIn>,
286    base: Easing,
287    interfaces: [Rc<dyn IEasing>],
288    constructors: [() => || Rc::new(SineEaseIn::new())],
289});
290
291ferro_markup_type!(class SineEaseInOut {
292    namespace: "FerroUI.Animation.Easings",
293    handles: [Rc<SineEaseInOut>, Option<Rc<SineEaseInOut>>],
294    this: Rc<SineEaseInOut>,
295    base: Easing,
296    interfaces: [Rc<dyn IEasing>],
297    constructors: [() => || Rc::new(SineEaseInOut::new())],
298});
299
300ferro_markup_type!(class SineEaseOut {
301    namespace: "FerroUI.Animation.Easings",
302    handles: [Rc<SineEaseOut>, Option<Rc<SineEaseOut>>],
303    this: Rc<SineEaseOut>,
304    base: Easing,
305    interfaces: [Rc<dyn IEasing>],
306    constructors: [() => || Rc::new(SineEaseOut::new())],
307});
308
309ferro_markup_type!(class SplineEasing {
310    namespace: "FerroUI.Animation.Easings",
311    handles: [Rc<SplineEasing>, Option<Rc<SplineEasing>>],
312    this: Rc<SplineEasing>,
313    base: Easing,
314    interfaces: [Rc<dyn IEasing>],
315    constructors: [
316        () => || Rc::new(SplineEasing::new()),
317        (f64, f64, f64, f64) => |x1: f64, y1: f64, x2: f64, y2: f64| Rc::new(SplineEasing::with_points(x1, y1, x2, y2)),
318        (Ref<KeySpline>) => |key_spline: Ref<KeySpline>| Rc::new(SplineEasing::with_key_spline(key_spline)),
319    ],
320    properties: [
321        X1: f64 { get: |e: &Rc<SplineEasing>| e.x1(), set: |e: &Rc<SplineEasing>, value: f64| e.set_x1(value) },
322        Y1: f64 { get: |e: &Rc<SplineEasing>| e.y1(), set: |e: &Rc<SplineEasing>, value: f64| e.set_y1(value) },
323        X2: f64 { get: |e: &Rc<SplineEasing>| e.x2(), set: |e: &Rc<SplineEasing>, value: f64| e.set_x2(value) },
324        Y2: f64 { get: |e: &Rc<SplineEasing>| e.y2(), set: |e: &Rc<SplineEasing>, value: f64| e.set_y2(value) },
325    ],
326});
327
328ferro_markup_type!(class SpringEasing {
329    namespace: "FerroUI.Animation.Easings",
330    handles: [Rc<SpringEasing>, Option<Rc<SpringEasing>>],
331    this: Rc<SpringEasing>,
332    base: Easing,
333    interfaces: [Rc<dyn IEasing>],
334    constructors: [
335        () => || Rc::new(SpringEasing::new()),
336        (f64, f64, f64, f64) => |mass: f64, stiffness: f64, damping: f64, initial_velocity: f64| {
337            Rc::new(SpringEasing::with_values(mass, stiffness, damping, initial_velocity))
338        },
339    ],
340    properties: [
341        Mass: f64 { get: |e: &Rc<SpringEasing>| e.mass(), set: |e: &Rc<SpringEasing>, value: f64| e.set_mass(value) },
342        Stiffness: f64 {
343            get: |e: &Rc<SpringEasing>| e.stiffness(),
344            set: |e: &Rc<SpringEasing>, value: f64| e.set_stiffness(value)
345        },
346        Damping: f64 {
347            get: |e: &Rc<SpringEasing>| e.damping(),
348            set: |e: &Rc<SpringEasing>, value: f64| e.set_damping(value)
349        },
350        InitialVelocity: f64 {
351            get: |e: &Rc<SpringEasing>| e.initial_velocity(),
352            set: |e: &Rc<SpringEasing>, value: f64| e.set_initial_velocity(value)
353        },
354    ],
355});
356
357// FerroUI.Animation
358
359ferro_markup_type!(class CrossFade {
360    namespace: "FerroUI.Animation",
361    handles: [Rc<CrossFade>, Option<Rc<CrossFade>>],
362    this: Rc<CrossFade>,
363    interfaces: [Rc<dyn IPageTransition>],
364    constructors: [
365        () => || Rc::new(CrossFade::new()),
366        (TimeSpan) => |duration: TimeSpan| Rc::new(CrossFade::with_duration(duration)),
367    ],
368    properties: [
369        Duration: TimeSpan {
370            get: |t: &Rc<CrossFade>| t.duration(),
371            set: |t: &Rc<CrossFade>, value: TimeSpan| t.set_duration(value)
372        },
373        FadeInEasing: Easing {
374            get: |t: &Rc<CrossFade>| t.fade_in_easing(),
375            set: |t: &Rc<CrossFade>, value: Easing| t.set_fade_in_easing(value)
376        },
377        FadeOutEasing: Easing {
378            get: |t: &Rc<CrossFade>| t.fade_out_easing(),
379            set: |t: &Rc<CrossFade>, value: Easing| t.set_fade_out_easing(value)
380        },
381        FillMode: FillMode {
382            get: |t: &Rc<CrossFade>| t.fill_mode(),
383            set: |t: &Rc<CrossFade>, value: FillMode| t.set_fill_mode(value)
384        },
385    ],
386});
387
388ferro_markup_type!(class PageSlide {
389    namespace: "FerroUI.Animation",
390    handles: [Rc<PageSlide>, Option<Rc<PageSlide>>],
391    this: Rc<PageSlide>,
392    interfaces: [Rc<dyn IPageTransition>],
393    constructors: [
394        () => || Rc::new(PageSlide::new()),
395        (TimeSpan, SlideAxis) => |duration: TimeSpan, orientation: SlideAxis| {
396            Rc::new(PageSlide::with_duration(duration, orientation))
397        },
398    ],
399    properties: [
400        Duration: TimeSpan {
401            get: |t: &Rc<PageSlide>| t.duration(),
402            set: |t: &Rc<PageSlide>, value: TimeSpan| t.set_duration(value)
403        },
404        Orientation: SlideAxis {
405            get: |t: &Rc<PageSlide>| t.orientation(),
406            set: |t: &Rc<PageSlide>, value: SlideAxis| t.set_orientation(value)
407        },
408        SlideInEasing: Easing {
409            get: |t: &Rc<PageSlide>| t.slide_in_easing(),
410            set: |t: &Rc<PageSlide>, value: Easing| t.set_slide_in_easing(value)
411        },
412        SlideOutEasing: Easing {
413            get: |t: &Rc<PageSlide>| t.slide_out_easing(),
414            set: |t: &Rc<PageSlide>, value: Easing| t.set_slide_out_easing(value)
415        },
416        FillMode: FillMode {
417            get: |t: &Rc<PageSlide>| t.fill_mode(),
418            set: |t: &Rc<PageSlide>, value: FillMode| t.set_fill_mode(value)
419        },
420    ],
421});
422
423// The managed class derives from `PageSlide`; here it holds one, so the members of the
424// slide are declared on it.
425ferro_markup_type!(class Rotate3DTransition {
426    namespace: "FerroUI.Animation",
427    handles: [Rc<Rotate3DTransition>, Option<Rc<Rotate3DTransition>>],
428    this: Rc<Rotate3DTransition>,
429    interfaces: [Rc<dyn IPageTransition>],
430    constructors: [
431        () => || Rc::new(Rotate3DTransition::new()),
432        (TimeSpan, SlideAxis, Option<f64>) => |duration: TimeSpan, orientation: SlideAxis, depth: Option<f64>| {
433            Rc::new(Rotate3DTransition::with_duration(duration, orientation, depth))
434        },
435    ],
436    properties: [
437        Depth: Option<f64> {
438            get: |t: &Rc<Rotate3DTransition>| t.depth(),
439            set: |t: &Rc<Rotate3DTransition>, value: Option<f64>| t.set_depth(value)
440        },
441        Duration: TimeSpan {
442            get: |t: &Rc<Rotate3DTransition>| t.duration(),
443            set: |t: &Rc<Rotate3DTransition>, value: TimeSpan| t.set_duration(value)
444        },
445        Orientation: SlideAxis {
446            get: |t: &Rc<Rotate3DTransition>| t.orientation(),
447            set: |t: &Rc<Rotate3DTransition>, value: SlideAxis| t.set_orientation(value)
448        },
449        SlideInEasing: Easing {
450            get: |t: &Rc<Rotate3DTransition>| t.slide_in_easing(),
451            set: |t: &Rc<Rotate3DTransition>, value: Easing| t.set_slide_in_easing(value)
452        },
453        SlideOutEasing: Easing {
454            get: |t: &Rc<Rotate3DTransition>| t.slide_out_easing(),
455            set: |t: &Rc<Rotate3DTransition>, value: Easing| t.set_slide_out_easing(value)
456        },
457        FillMode: FillMode {
458            get: |t: &Rc<Rotate3DTransition>| t.fill_mode(),
459            set: |t: &Rc<Rotate3DTransition>, value: FillMode| t.set_fill_mode(value)
460        },
461    ],
462});
463
464// `PageTransitions` (the content property of the managed class, a plain list) is not
465// declared: the port keeps the transitions in a plain vector, which is not a collection
466// handle markup can add to. The transitions are added with `Add`.
467ferro_markup_type!(class CompositePageTransition {
468    namespace: "FerroUI.Animation",
469    handles: [Rc<CompositePageTransition>, Option<Rc<CompositePageTransition>>],
470    this: Rc<CompositePageTransition>,
471    interfaces: [Rc<dyn IPageTransition>],
472    constructors: [() => || Rc::new(CompositePageTransition::new())],
473    methods: [
474        fn Add(Rc<dyn IPageTransition>) =>
475            |t: &Rc<CompositePageTransition>, transition: Rc<dyn IPageTransition>| t.add(transition),
476    ],
477});
478
479/// The types declared in this file.
480pub(super) const TYPES: &[&MarkupType] = &[
481    <BackEaseIn as MarkupTyped>::MARKUP,
482    <BackEaseInOut as MarkupTyped>::MARKUP,
483    <BackEaseOut as MarkupTyped>::MARKUP,
484    <BounceEaseIn as MarkupTyped>::MARKUP,
485    <BounceEaseInOut as MarkupTyped>::MARKUP,
486    <BounceEaseOut as MarkupTyped>::MARKUP,
487    <CircularEaseIn as MarkupTyped>::MARKUP,
488    <CircularEaseInOut as MarkupTyped>::MARKUP,
489    <CircularEaseOut as MarkupTyped>::MARKUP,
490    <CubicEaseIn as MarkupTyped>::MARKUP,
491    <CubicEaseInOut as MarkupTyped>::MARKUP,
492    <CubicEaseOut as MarkupTyped>::MARKUP,
493    <ElasticEaseIn as MarkupTyped>::MARKUP,
494    <ElasticEaseInOut as MarkupTyped>::MARKUP,
495    <ElasticEaseOut as MarkupTyped>::MARKUP,
496    <ExponentialEaseIn as MarkupTyped>::MARKUP,
497    <ExponentialEaseInOut as MarkupTyped>::MARKUP,
498    <ExponentialEaseOut as MarkupTyped>::MARKUP,
499    <LinearEasing as MarkupTyped>::MARKUP,
500    <QuadraticEaseIn as MarkupTyped>::MARKUP,
501    <QuadraticEaseInOut as MarkupTyped>::MARKUP,
502    <QuadraticEaseOut as MarkupTyped>::MARKUP,
503    <QuarticEaseIn as MarkupTyped>::MARKUP,
504    <QuarticEaseInOut as MarkupTyped>::MARKUP,
505    <QuarticEaseOut as MarkupTyped>::MARKUP,
506    <QuinticEaseIn as MarkupTyped>::MARKUP,
507    <QuinticEaseInOut as MarkupTyped>::MARKUP,
508    <QuinticEaseOut as MarkupTyped>::MARKUP,
509    <SineEaseIn as MarkupTyped>::MARKUP,
510    <SineEaseInOut as MarkupTyped>::MARKUP,
511    <SineEaseOut as MarkupTyped>::MARKUP,
512    <SplineEasing as MarkupTyped>::MARKUP,
513    <SpringEasing as MarkupTyped>::MARKUP,
514    <CrossFade as MarkupTyped>::MARKUP,
515    <PageSlide as MarkupTyped>::MARKUP,
516    <Rotate3DTransition as MarkupTyped>::MARKUP,
517    <CompositePageTransition as MarkupTyped>::MARKUP,
518];
519
520/// Registers what the untyped value conversions need to know about the types
521/// declared in this file: the nullable handles, and the casts of each easing
522/// to the easing class and contract and of each page transition to its
523/// contract.
524pub(super) fn register_value_types() {
525    // The easing class is the handle of an easing contract.
526    ValueTypes::register_cast::<Easing, Rc<dyn IEasing>>(|easing| easing.as_rc().clone());
527    ValueTypes::register_cast::<Rc<dyn IEasing>, Easing>(|easing| Easing::from_rc(easing.clone()));
528    ValueTypes::register_nullable::<Rc<BackEaseIn>>();
529    ValueTypes::register_cast::<Rc<BackEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
530    ValueTypes::register_cast::<Rc<BackEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
531    ValueTypes::register_nullable::<Rc<BackEaseInOut>>();
532    ValueTypes::register_cast::<Rc<BackEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
533    ValueTypes::register_cast::<Rc<BackEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
534    ValueTypes::register_nullable::<Rc<BackEaseOut>>();
535    ValueTypes::register_cast::<Rc<BackEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
536    ValueTypes::register_cast::<Rc<BackEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
537    ValueTypes::register_nullable::<Rc<BounceEaseIn>>();
538    ValueTypes::register_cast::<Rc<BounceEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
539    ValueTypes::register_cast::<Rc<BounceEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
540    ValueTypes::register_nullable::<Rc<BounceEaseInOut>>();
541    ValueTypes::register_cast::<Rc<BounceEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
542    ValueTypes::register_cast::<Rc<BounceEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
543    ValueTypes::register_nullable::<Rc<BounceEaseOut>>();
544    ValueTypes::register_cast::<Rc<BounceEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
545    ValueTypes::register_cast::<Rc<BounceEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
546    ValueTypes::register_nullable::<Rc<CircularEaseIn>>();
547    ValueTypes::register_cast::<Rc<CircularEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
548    ValueTypes::register_cast::<Rc<CircularEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
549    ValueTypes::register_nullable::<Rc<CircularEaseInOut>>();
550    ValueTypes::register_cast::<Rc<CircularEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
551    ValueTypes::register_cast::<Rc<CircularEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
552    ValueTypes::register_nullable::<Rc<CircularEaseOut>>();
553    ValueTypes::register_cast::<Rc<CircularEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
554    ValueTypes::register_cast::<Rc<CircularEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
555    ValueTypes::register_nullable::<Rc<CubicEaseIn>>();
556    ValueTypes::register_cast::<Rc<CubicEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
557    ValueTypes::register_cast::<Rc<CubicEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
558    ValueTypes::register_nullable::<Rc<CubicEaseInOut>>();
559    ValueTypes::register_cast::<Rc<CubicEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
560    ValueTypes::register_cast::<Rc<CubicEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
561    ValueTypes::register_nullable::<Rc<CubicEaseOut>>();
562    ValueTypes::register_cast::<Rc<CubicEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
563    ValueTypes::register_cast::<Rc<CubicEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
564    ValueTypes::register_nullable::<Rc<ElasticEaseIn>>();
565    ValueTypes::register_cast::<Rc<ElasticEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
566    ValueTypes::register_cast::<Rc<ElasticEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
567    ValueTypes::register_nullable::<Rc<ElasticEaseInOut>>();
568    ValueTypes::register_cast::<Rc<ElasticEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
569    ValueTypes::register_cast::<Rc<ElasticEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
570    ValueTypes::register_nullable::<Rc<ElasticEaseOut>>();
571    ValueTypes::register_cast::<Rc<ElasticEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
572    ValueTypes::register_cast::<Rc<ElasticEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
573    ValueTypes::register_nullable::<Rc<ExponentialEaseIn>>();
574    ValueTypes::register_cast::<Rc<ExponentialEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
575    ValueTypes::register_cast::<Rc<ExponentialEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
576    ValueTypes::register_nullable::<Rc<ExponentialEaseInOut>>();
577    ValueTypes::register_cast::<Rc<ExponentialEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
578    ValueTypes::register_cast::<Rc<ExponentialEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
579    ValueTypes::register_nullable::<Rc<ExponentialEaseOut>>();
580    ValueTypes::register_cast::<Rc<ExponentialEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
581    ValueTypes::register_cast::<Rc<ExponentialEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
582    ValueTypes::register_nullable::<Rc<LinearEasing>>();
583    ValueTypes::register_cast::<Rc<LinearEasing>, Easing>(|easing| Easing::from_rc(easing.clone()));
584    ValueTypes::register_cast::<Rc<LinearEasing>, Rc<dyn IEasing>>(|easing| easing.clone());
585    ValueTypes::register_nullable::<Rc<QuadraticEaseIn>>();
586    ValueTypes::register_cast::<Rc<QuadraticEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
587    ValueTypes::register_cast::<Rc<QuadraticEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
588    ValueTypes::register_nullable::<Rc<QuadraticEaseInOut>>();
589    ValueTypes::register_cast::<Rc<QuadraticEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
590    ValueTypes::register_cast::<Rc<QuadraticEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
591    ValueTypes::register_nullable::<Rc<QuadraticEaseOut>>();
592    ValueTypes::register_cast::<Rc<QuadraticEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
593    ValueTypes::register_cast::<Rc<QuadraticEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
594    ValueTypes::register_nullable::<Rc<QuarticEaseIn>>();
595    ValueTypes::register_cast::<Rc<QuarticEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
596    ValueTypes::register_cast::<Rc<QuarticEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
597    ValueTypes::register_nullable::<Rc<QuarticEaseInOut>>();
598    ValueTypes::register_cast::<Rc<QuarticEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
599    ValueTypes::register_cast::<Rc<QuarticEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
600    ValueTypes::register_nullable::<Rc<QuarticEaseOut>>();
601    ValueTypes::register_cast::<Rc<QuarticEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
602    ValueTypes::register_cast::<Rc<QuarticEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
603    ValueTypes::register_nullable::<Rc<QuinticEaseIn>>();
604    ValueTypes::register_cast::<Rc<QuinticEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
605    ValueTypes::register_cast::<Rc<QuinticEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
606    ValueTypes::register_nullable::<Rc<QuinticEaseInOut>>();
607    ValueTypes::register_cast::<Rc<QuinticEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
608    ValueTypes::register_cast::<Rc<QuinticEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
609    ValueTypes::register_nullable::<Rc<QuinticEaseOut>>();
610    ValueTypes::register_cast::<Rc<QuinticEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
611    ValueTypes::register_cast::<Rc<QuinticEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
612    ValueTypes::register_nullable::<Rc<SineEaseIn>>();
613    ValueTypes::register_cast::<Rc<SineEaseIn>, Easing>(|easing| Easing::from_rc(easing.clone()));
614    ValueTypes::register_cast::<Rc<SineEaseIn>, Rc<dyn IEasing>>(|easing| easing.clone());
615    ValueTypes::register_nullable::<Rc<SineEaseInOut>>();
616    ValueTypes::register_cast::<Rc<SineEaseInOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
617    ValueTypes::register_cast::<Rc<SineEaseInOut>, Rc<dyn IEasing>>(|easing| easing.clone());
618    ValueTypes::register_nullable::<Rc<SineEaseOut>>();
619    ValueTypes::register_cast::<Rc<SineEaseOut>, Easing>(|easing| Easing::from_rc(easing.clone()));
620    ValueTypes::register_cast::<Rc<SineEaseOut>, Rc<dyn IEasing>>(|easing| easing.clone());
621    ValueTypes::register_nullable::<Rc<SplineEasing>>();
622    ValueTypes::register_cast::<Rc<SplineEasing>, Easing>(|easing| Easing::from_rc(easing.clone()));
623    ValueTypes::register_cast::<Rc<SplineEasing>, Rc<dyn IEasing>>(|easing| easing.clone());
624    ValueTypes::register_nullable::<Rc<SpringEasing>>();
625    ValueTypes::register_cast::<Rc<SpringEasing>, Easing>(|easing| Easing::from_rc(easing.clone()));
626    ValueTypes::register_cast::<Rc<SpringEasing>, Rc<dyn IEasing>>(|easing| easing.clone());
627    ValueTypes::register_nullable::<Rc<CrossFade>>();
628    ValueTypes::register_cast::<Rc<CrossFade>, Rc<dyn IPageTransition>>(|transition| transition.clone());
629    ValueTypes::register_nullable::<Rc<PageSlide>>();
630    ValueTypes::register_cast::<Rc<PageSlide>, Rc<dyn IPageTransition>>(|transition| transition.clone());
631    ValueTypes::register_nullable::<Rc<Rotate3DTransition>>();
632    ValueTypes::register_cast::<Rc<Rotate3DTransition>, Rc<dyn IPageTransition>>(|transition| transition.clone());
633    ValueTypes::register_nullable::<Rc<CompositePageTransition>>();
634    ValueTypes::register_cast::<Rc<CompositePageTransition>, Rc<dyn IPageTransition>>(|transition| transition.clone());
635}