use std::time::Duration;
use super::easing::EasingStyle;
#[derive(Clone, Debug)]
pub struct AnimatorConfig {
pub duration: Duration,
pub position_animation: PositionAnimation,
pub size_animation: SizeAnimation,
pub interrupt_policy: InterruptPolicy,
pub frame_pacing: FramePacing,
pub jank_threshold_ms: f64,
}
impl Default for AnimatorConfig {
fn default() -> Self {
Self {
duration: Duration::from_millis(250),
position_animation: PositionAnimation::EaseInOut,
size_animation: SizeAnimation::Linear,
interrupt_policy: InterruptPolicy::RetargetFromCurrent,
frame_pacing: FramePacing::DwmFlush,
jank_threshold_ms: 25.0,
}
}
}
#[derive(Clone, Debug, PartialEq, Default)]
pub enum PositionAnimation {
Linear,
#[default]
EaseInOut,
EaseOutCubic,
EaseOutExpo,
EaseElastic,
Custom(EasingStyle),
}
#[derive(Clone, Debug, PartialEq, Default)]
pub enum SizeAnimation {
#[default]
Linear,
EaseInOut,
DisabledIfUnchanged,
}
#[derive(Clone, Debug, PartialEq, Default)]
pub enum InterruptPolicy {
#[default]
RetargetFromCurrent,
QueueAfterCurrent,
DropNew,
}
#[derive(Clone, Debug, PartialEq, Default)]
pub enum FramePacing {
#[default]
DwmFlush,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_config_has_sensible_values() {
let c = AnimatorConfig::default();
assert_eq!(c.duration, Duration::from_millis(250));
assert_eq!(c.position_animation, PositionAnimation::EaseInOut);
assert_eq!(c.size_animation, SizeAnimation::Linear);
assert_eq!(c.interrupt_policy, InterruptPolicy::RetargetFromCurrent);
assert_eq!(c.frame_pacing, FramePacing::DwmFlush);
assert!(c.jank_threshold_ms > 0.0);
}
#[test]
fn config_is_clone() {
let c = AnimatorConfig::default();
let _c2 = c.clone();
}
}