ferroui_base/animation/transitions/
transform_operations_transition.rs1use 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 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}