use crate::{
animation::Easing,
animation_timing::{
DEFAULT_DURATION_MS, MOOOK_DURATION_MS, PORT_HOLE_DURATION_MS, SHUTTER_DURATION_MS,
},
screen_transition::{ScreenTransitionEffect, ScreenTransitionSpec},
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TransitionPreset {
None,
WindowPush,
WindowPop,
WindowPushRound,
WindowPopRound,
ShutterUp,
ShutterDown,
ShutterLeft,
ShutterRight,
RoundFlipToLauncher,
RoundFlipFromLauncher,
PortHoleUp,
PortHoleDown,
PortHoleLeft,
PortHoleRight,
ModalPresent,
ModalDismiss,
TimelineSlide,
TimelinePeekIn,
TimelinePeekOut,
TimelinePinExpand,
TimelineScrubSettle,
Fade,
}
impl TransitionPreset {
pub const fn spec(self) -> ScreenTransitionSpec {
match self {
Self::None => ScreenTransitionSpec::none(),
Self::WindowPush => ScreenTransitionSpec::push_moook(MOOOK_DURATION_MS),
Self::WindowPop => ScreenTransitionSpec::pop_moook(MOOOK_DURATION_MS),
Self::WindowPushRound => ScreenTransitionSpec::port_hole_left(PORT_HOLE_DURATION_MS),
Self::WindowPopRound => ScreenTransitionSpec::port_hole_right(PORT_HOLE_DURATION_MS),
Self::ShutterUp => ScreenTransitionSpec::shutter_up(SHUTTER_DURATION_MS),
Self::ShutterDown => ScreenTransitionSpec::shutter_down(SHUTTER_DURATION_MS),
Self::ShutterLeft => ScreenTransitionSpec::shutter_left(SHUTTER_DURATION_MS),
Self::ShutterRight => ScreenTransitionSpec::shutter_right(SHUTTER_DURATION_MS),
Self::RoundFlipToLauncher => {
ScreenTransitionSpec::round_flip_right(PORT_HOLE_DURATION_MS)
}
Self::RoundFlipFromLauncher => {
ScreenTransitionSpec::round_flip_left(PORT_HOLE_DURATION_MS)
}
Self::PortHoleUp => ScreenTransitionSpec::port_hole_up(PORT_HOLE_DURATION_MS),
Self::PortHoleDown => ScreenTransitionSpec::port_hole_down(PORT_HOLE_DURATION_MS),
Self::PortHoleLeft => ScreenTransitionSpec::port_hole_left(PORT_HOLE_DURATION_MS),
Self::PortHoleRight => ScreenTransitionSpec::port_hole_right(PORT_HOLE_DURATION_MS),
Self::ModalPresent => ScreenTransitionSpec::modal_slide_up(DEFAULT_DURATION_MS),
Self::ModalDismiss => ScreenTransitionSpec::modal_slide_down(DEFAULT_DURATION_MS),
Self::TimelineSlide => {
ScreenTransitionSpec::slide_left(DEFAULT_DURATION_MS).with_easing(Easing::EaseInOut)
}
Self::TimelinePeekIn => ScreenTransitionSpec::slide_right(MOOOK_DURATION_MS / 2)
.with_easing(Easing::OutBack),
Self::TimelinePeekOut => {
ScreenTransitionSpec::slide_left(MOOOK_DURATION_MS / 2).with_easing(Easing::InSine)
}
Self::TimelinePinExpand => ScreenTransitionSpec::modal_slide_up(MOOOK_DURATION_MS / 2)
.with_easing(Easing::OutCubic),
Self::TimelineScrubSettle => ScreenTransitionSpec::slide_left(DEFAULT_DURATION_MS / 2)
.with_easing(Easing::OutBounce),
Self::Fade => ScreenTransitionSpec::fade(DEFAULT_DURATION_MS),
}
}
pub const fn effect(self) -> ScreenTransitionEffect {
self.spec().effect
}
}
impl From<TransitionPreset> for ScreenTransitionSpec {
fn from(value: TransitionPreset) -> Self {
value.spec()
}
}