use std::time::Duration;
use super::{
apply_value,
AnimDirection,
AnimatedValue,
Ease,
Function,
};
#[derive(Clone, PartialEq)]
pub struct AnimNum {
origin: f32,
destination: f32,
time: Duration,
ease: Ease,
function: Function,
value: f32,
}
impl AnimNum {
pub fn new(origin: f32, destination: f32) -> Self {
Self {
origin,
destination,
time: Duration::default(),
ease: Ease::default(),
function: Function::default(),
value: origin,
}
}
pub fn time(mut self, time: u64) -> Self {
self.time = Duration::from_millis(time);
self
}
pub fn duration(mut self, duration: Duration) -> Self {
self.time = duration;
self
}
pub fn ease(mut self, ease: Ease) -> Self {
self.ease = ease;
self
}
pub fn function(mut self, function: Function) -> Self {
self.function = function;
self
}
pub fn read(&self) -> f32 {
self.value
}
}
impl From<&AnimNum> for f32 {
fn from(value: &AnimNum) -> Self {
value.read()
}
}
impl AnimatedValue for AnimNum {
fn prepare(&mut self, direction: AnimDirection) {
match direction {
AnimDirection::Forward => self.value = self.origin,
AnimDirection::Reverse => {
self.value = self.destination;
}
}
}
fn is_finished(&self, index: u128, direction: AnimDirection) -> bool {
match direction {
AnimDirection::Forward => {
index > self.time.as_millis() && self.value == self.destination
}
AnimDirection::Reverse => index > self.time.as_millis() && self.value == self.origin,
}
}
fn advance(&mut self, index: u128, direction: AnimDirection) {
let (origin, destination) = match direction {
AnimDirection::Forward => (self.origin, self.destination),
AnimDirection::Reverse => (self.destination, self.origin),
};
self.value = apply_value(
origin,
destination,
index.min(self.time.as_millis()),
self.time,
self.ease,
self.function,
);
}
fn finish(&mut self, direction: AnimDirection) {
self.advance(self.time.as_millis(), direction);
}
}