ferroui_base/animation/
i_page_transition.rs1use crate::animation::AnimationTask;
2use crate::threading::{
3 CancellationToken, Dispatcher, DispatcherPriority, DispatcherTask, FerroSynchronizationContext,
4};
5use std::future::Future;
6use crate::{Ref, Visual};
7
8pub trait IPageTransition: 'static {
10 fn start(
22 &self,
23 from: Option<&Ref<Visual>>,
24 to: Option<&Ref<Visual>>,
25 forward: bool,
26 cancellation_token: CancellationToken,
27 ) -> DispatcherTask<()>;
28
29 fn as_progress_page_transition(&self) -> Option<&dyn crate::animation::IProgressPageTransition> {
31 None
32 }
33
34 fn as_page_slide(&self) -> Option<&crate::animation::PageSlide> {
36 None
37 }
38
39 fn as_composite_page_transition(&self) -> Option<&crate::animation::CompositePageTransition> {
41 None
42 }
43}
44
45impl PartialEq for dyn IPageTransition {
46 #[inline]
47 fn eq(&self, other: &Self) -> bool {
48 std::ptr::addr_eq(self as *const dyn IPageTransition, other as *const dyn IPageTransition)
49 }
50}
51
52pub(crate) fn continuation_context() -> std::sync::Arc<FerroSynchronizationContext> {
56 FerroSynchronizationContext::current().unwrap_or_else(|| {
57 FerroSynchronizationContext::with_dispatcher(&Dispatcher::current_dispatcher(), DispatcherPriority::NORMAL)
58 })
59}
60
61pub(crate) fn start_async(future: impl Future<Output = ()> + 'static) -> DispatcherTask<()> {
64 continuation_context().to_task_scheduler().start_local(future)
65}
66
67pub(crate) async fn when_all(tasks: Vec<AnimationTask>) {
70 if let Err(error) = AnimationTask::when_all(tasks).await {
71 panic!("{error}");
72 }
73}