use super::*;
impl Animator {
pub fn new() -> Self {
Self {
from: Vec::new(),
to: Vec::new(),
current: Vec::new(),
tween: Tween::create(0.0, 1.0, 0.0),
duration: DEFAULT_ANIMATION_DURATION,
delay: 0.0,
initial: None,
}
}
pub fn duration(&self) -> f64 {
self.get_duration()
}
pub fn set_duration(&mut self, duration: f64) -> &mut Self {
*self.get_mut_duration() = duration.max(0.0);
self
}
pub fn delay(&self) -> f64 {
self.get_delay()
}
pub fn set_delay(&mut self, delay: f64) -> &mut Self {
let value: f64 = delay.max(0.0);
*self.get_mut_delay() = value;
self.get_mut_tween()
.set_delay(value / MILLISECONDS_PER_SECOND);
self
}
pub fn easing(&self) -> Easing {
self.get_tween().get_easing()
}
pub fn set_easing(&mut self, easing: Easing) -> &mut Self {
self.get_mut_tween().set_easing(easing);
self
}
pub fn is_running(&self) -> bool {
!self.get_tween().is_finished()
}
pub fn pause(&mut self) -> &mut Self {
self.get_mut_tween().pause();
self
}
pub fn resume(&mut self) -> &mut Self {
self.get_mut_tween().resume();
self
}
pub fn reset(&mut self) -> &mut Self {
self.get_mut_tween().reset();
let from: Vec<Vec<f64>> = self.get_from().clone();
self.set_current(from);
self
}
pub fn remember_initial(&mut self, option: &ChartOption) -> &mut Self {
self.set_initial(Some(option.clone()));
self
}
pub fn begin(&mut self, option: &ChartOption) -> &mut Self {
let target: Vec<Vec<f64>> = collect_values(option);
if self.get_duration() <= 0.0 {
self.set_current(target.clone());
self.set_to(target.clone());
self.set_from(target);
let mut tween: Tween<f64> = Tween::create(0.0, 1.0, 0.0);
tween.set_state(TweenState::Finished);
self.set_tween(tween);
return self;
}
let from: Vec<Vec<f64>> = align_values(self.get_current(), &target);
self.set_from(from.clone());
self.set_to(target.clone());
self.set_current(from);
let tween: Tween<f64> =
Tween::create(0.0, 1.0, self.get_duration() / MILLISECONDS_PER_SECOND)
.with_easing(self.get_tween().get_easing())
.with_delay(self.get_delay() / MILLISECONDS_PER_SECOND);
self.set_tween(tween);
self
}
pub fn advance(&mut self, delta: f64) -> bool {
if self.get_tween().is_finished() {
return false;
}
self.get_mut_tween()
.update(delta.max(0.0) / MILLISECONDS_PER_SECOND);
let progress: f64 = self.get_tween().value();
let current: Vec<Vec<f64>> = interpolate(self.get_from(), self.get_to(), progress);
self.set_current(current);
!self.get_tween().is_finished()
}
pub fn apply(&self, option: &mut ChartOption) {
if self.get_current().is_empty() {
return;
}
for (index, series) in option.series.iter_mut().enumerate() {
let Some(values) = self.get_current().get(index) else {
continue;
};
for (data_index, data) in series.data.iter_mut().enumerate() {
let Some(value) = values.get(data_index) else {
continue;
};
write_value(data, *value);
}
}
}
}
impl Default for Animator {
fn default() -> Self {
Self::new()
}
}