mod animatable;
mod animated;
mod keyframes;
mod spring;
mod timing;
pub(crate) use animatable::carry_velocity;
pub use animatable::{Animatable, Channels};
pub use animated::{Animate, Animated, AnimatedMarker, IntoAnimated, Plain};
pub(crate) use animated::{ExitTo, Motion};
pub use keyframes::{Keyframes, Repeat};
pub use spring::{SpringConfig, SpringState};
pub use timing::{CustomCurve, TimingFunction};
#[derive(Clone)]
pub struct Transition {
pub duration_ms: f32,
pub timing: TimingFunction,
pub delay_ms: f32,
pub on_complete: Option<std::rc::Rc<dyn Fn()>>,
}
impl std::fmt::Debug for Transition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Transition")
.field("duration_ms", &self.duration_ms)
.field("timing", &self.timing)
.field("delay_ms", &self.delay_ms)
.field("on_complete", &self.on_complete.as_ref().map(|_| "<fn>"))
.finish()
}
}
impl Transition {
pub fn new(duration_ms: impl crate::layout::IntoF32, timing: TimingFunction) -> Self {
Self {
duration_ms: duration_ms.into_f32(),
timing,
delay_ms: 0.0,
on_complete: None,
}
}
pub fn spring(config: SpringConfig) -> Self {
Self {
duration_ms: 1000.0, timing: TimingFunction::Spring(config),
delay_ms: 0.0,
on_complete: None,
}
}
pub fn on_complete(mut self, f: impl Fn() + 'static) -> Self {
self.on_complete = Some(std::rc::Rc::new(f));
self
}
pub fn delay(mut self, delay_ms: impl crate::layout::IntoF32) -> Self {
self.delay_ms = delay_ms.into_f32();
self
}
pub fn duration(mut self, duration_ms: impl crate::layout::IntoF32) -> Self {
self.duration_ms = duration_ms.into_f32();
self
}
pub fn timing(mut self, timing: TimingFunction) -> Self {
self.timing = timing;
self
}
pub fn reverse(self, reverse: Transition) -> TransitionConfig {
TransitionConfig {
forward: self,
reverse: Some(reverse),
}
}
}
impl Default for Transition {
fn default() -> Self {
Self::spring(SpringConfig::DEFAULT)
}
}
#[derive(Clone, Debug)]
pub struct TransitionConfig {
pub forward: Transition,
pub reverse: Option<Transition>,
}
impl From<Transition> for TransitionConfig {
fn from(t: Transition) -> Self {
TransitionConfig {
forward: t,
reverse: None,
}
}
}
impl From<f32> for TransitionConfig {
fn from(duration_ms: f32) -> Self {
Transition::new(duration_ms, TimingFunction::EaseOut).into()
}
}
impl From<i32> for TransitionConfig {
fn from(duration_ms: i32) -> Self {
Transition::new(duration_ms, TimingFunction::EaseOut).into()
}
}
impl From<SpringConfig> for TransitionConfig {
fn from(config: SpringConfig) -> Self {
Transition::spring(config).into()
}
}