use crate::prelude::Transform;
#[derive(Clone)]
pub struct TransitionConfig {
pub exit_start: Transform, pub exit_end: Transform,
pub enter_start: Transform, pub enter_end: Transform, }
#[derive(PartialEq, Clone)]
pub enum TransitionVariant {
SlideLeft,
SlideRight,
SlideUp,
SlideDown,
Fade,
ScaleUp,
ScaleDown,
FlipHorizontal,
FlipVertical,
RotateLeft,
RotateRight,
SlideUpFade,
SlideDownFade,
ScaleUpFade,
BounceIn,
BounceOut,
ScaleDownFade,
RotateLeftFade,
RotateRightFade,
FlipHorizontalFade,
FlipVerticalFade,
ZoomIn,
ZoomOut,
SlideDiagonalUpLeft,
SlideDiagonalUpRight,
SlideDiagonalDownLeft,
SlideDiagonalDownRight,
SpiralIn,
SpiralOut,
ElasticIn,
ElasticOut,
SwingIn,
SwingOut,
SlideLeftFade,
SlideRightFade,
ScaleRotateFade,
SlideFadeRotate,
ScaleFadeFlip,
RotateScaleSlide,
}
fn slide_horizontal(exit_x: f32, enter_x: f32) -> TransitionConfig {
let identity = Transform::identity();
TransitionConfig {
exit_start: identity,
exit_end: Transform::new(exit_x, 0.0, 1.0, 0.0),
enter_start: Transform::new(enter_x, 0.0, 1.0, 0.0),
enter_end: identity,
}
}
fn slide_vertical(exit_y: f32, enter_y: f32) -> TransitionConfig {
let identity = Transform::identity();
TransitionConfig {
exit_start: identity,
exit_end: Transform::new(0.0, exit_y, 1.0, 0.0),
enter_start: Transform::new(0.0, enter_y, 1.0, 0.0),
enter_end: identity,
}
}
fn scale_transition(exit_scale: f32, enter_scale: f32) -> TransitionConfig {
let identity = Transform::identity();
TransitionConfig {
exit_start: identity,
exit_end: Transform::new(0.0, 0.0, exit_scale, 0.0),
enter_start: Transform::new(0.0, 0.0, enter_scale, 0.0),
enter_end: identity,
}
}
fn rotate_transition(exit_rotation: f32, enter_rotation: f32) -> TransitionConfig {
let identity = Transform::identity();
TransitionConfig {
exit_start: identity,
exit_end: Transform::new(0.0, 0.0, 1.0, exit_rotation),
enter_start: Transform::new(0.0, 0.0, 1.0, enter_rotation),
enter_end: identity,
}
}
fn slide_diagonal(exit_x: f32, exit_y: f32, enter_x: f32, enter_y: f32) -> TransitionConfig {
let identity = Transform::identity();
TransitionConfig {
exit_start: identity,
exit_end: Transform::new(exit_x, exit_y, 1.0, 0.0),
enter_start: Transform::new(enter_x, enter_y, 1.0, 0.0),
enter_end: identity,
}
}
impl TransitionVariant {
pub fn get_config(&self) -> TransitionConfig {
let identity = Transform::identity();
match self {
TransitionVariant::SlideLeft => slide_horizontal(-100.0, 100.0),
TransitionVariant::SlideRight => slide_horizontal(100.0, -100.0),
TransitionVariant::SlideUp => slide_vertical(-100.0, 100.0),
TransitionVariant::SlideDown => slide_vertical(100.0, -100.0),
TransitionVariant::Fade => TransitionConfig {
exit_start: identity,
exit_end: Transform::new(0.0, 0.0, 1.0, 0.0),
enter_start: Transform::new(0.0, 0.0, 1.0, 0.0),
enter_end: identity,
},
TransitionVariant::ScaleUp => scale_transition(0.0, 0.0),
TransitionVariant::ScaleDown => scale_transition(2.0, 2.0),
TransitionVariant::ZoomIn => scale_transition(1.0, 0.0),
TransitionVariant::ZoomOut => scale_transition(2.0, 0.0),
TransitionVariant::FlipHorizontal => rotate_transition(180.0, -180.0),
TransitionVariant::FlipVertical => rotate_transition(180.0, -180.0),
TransitionVariant::RotateLeft => rotate_transition(90.0, -90.0),
TransitionVariant::RotateRight => rotate_transition(-90.0, 90.0),
TransitionVariant::SlideUpFade => slide_vertical(-100.0, 100.0),
TransitionVariant::SlideDownFade => slide_vertical(100.0, -100.0),
TransitionVariant::SlideLeftFade => slide_horizontal(-100.0, 100.0),
TransitionVariant::SlideRightFade => slide_horizontal(100.0, -100.0),
TransitionVariant::ScaleUpFade => scale_transition(0.0, 0.0),
TransitionVariant::ScaleDownFade => scale_transition(2.0, 2.0),
TransitionVariant::RotateLeftFade => rotate_transition(90.0, -90.0),
TransitionVariant::RotateRightFade => rotate_transition(-90.0, 90.0),
TransitionVariant::FlipHorizontalFade => rotate_transition(180.0, -180.0),
TransitionVariant::FlipVerticalFade => rotate_transition(180.0, -180.0),
TransitionVariant::SlideDiagonalUpLeft => slide_diagonal(-100.0, -100.0, 100.0, 100.0),
TransitionVariant::SlideDiagonalUpRight => slide_diagonal(100.0, -100.0, -100.0, 100.0),
TransitionVariant::SlideDiagonalDownLeft => {
slide_diagonal(-100.0, 100.0, 100.0, -100.0)
}
TransitionVariant::SlideDiagonalDownRight => {
slide_diagonal(100.0, 100.0, -100.0, -100.0)
}
TransitionVariant::BounceIn => slide_vertical(0.0, 100.0),
TransitionVariant::BounceOut => slide_vertical(100.0, 0.0),
TransitionVariant::ElasticIn => slide_vertical(0.0, 100.0),
TransitionVariant::ElasticOut => slide_vertical(100.0, 0.0),
TransitionVariant::SwingIn => slide_vertical(0.0, 100.0),
TransitionVariant::SwingOut => slide_vertical(100.0, 0.0),
TransitionVariant::SpiralIn => scale_transition(1.0, 0.0),
TransitionVariant::SpiralOut => scale_transition(2.0, 0.0),
TransitionVariant::ScaleRotateFade => scale_transition(1.0, 0.0),
TransitionVariant::SlideFadeRotate => slide_vertical(0.0, 0.0),
TransitionVariant::ScaleFadeFlip => scale_transition(1.0, 0.0),
TransitionVariant::RotateScaleSlide => rotate_transition(0.0, 0.0),
}
}
}