Skip to main content

ferroui_base/animation/transitions/
transform_operations_transition.rs

1use crate::animation::animators::TransformOperationsAnimator;
2use crate::animation::{Transition, TransitionBase, TransitionObservableBase};
3use crate::ferro_transition_class;
4use crate::media::transformation::TransformOperations;
5use crate::media::ITransform;
6use crate::reactive::IObservable;
7use std::rc::Rc;
8
9ferro_transition_class!(
10    /// Transition class that handles transform properties whose values are
11    /// transform operation lists. Any other transform is treated as the
12    /// identity.
13    TransformOperationsTransition: Option<Rc<dyn ITransform>>
14);
15
16type TransformValue = Option<Rc<dyn ITransform>>;
17
18impl Transition<TransformValue> for TransformOperationsTransition {
19    fn do_transition(
20        this: &Self,
21        progress: Rc<dyn IObservable<f64>>,
22        old_value: TransformValue,
23        new_value: TransformValue,
24    ) -> Rc<dyn IObservable<TransformValue>> {
25        let old_transform = TransformOperationsAnimator::ensure_operations(&old_value);
26        let new_transform = TransformOperationsAnimator::ensure_operations(&new_value);
27
28        TransitionObservableBase::new(progress, this.easing(), move |progress| {
29            let value: Rc<dyn ITransform> = TransformOperations::interpolate(&old_transform, &new_transform, progress);
30            Some(value)
31        })
32    }
33}