uianimator/
default_animator_f64_linear.rs

1use std::time::Instant;
2
3use crate::Animator;
4
5pub struct DefaultAnimatorF64Linear {
6    value: f64,
7    time: Instant,
8    target: f64,
9    /// in units per second
10    speed: f64,
11}
12impl DefaultAnimatorF64Linear {
13    pub fn new(value: f64, speed: f64) -> Self {
14        Self {
15            value,
16            time: Instant::now(),
17            target: value,
18            speed,
19        }
20    }
21    pub fn target(&self) -> f64 {
22        self.target
23    }
24}
25impl Animator for DefaultAnimatorF64Linear {
26    type Value = f64;
27    type Time = Instant;
28
29    fn get_value(&self, time: Self::Time) -> Self::Value {
30        if self.value < self.target {
31            self.target.min(
32                self.value + time.saturating_duration_since(self.time).as_secs_f64() * self.speed,
33            )
34        } else if self.value > self.target {
35            self.target.max(
36                self.value - time.saturating_duration_since(self.time).as_secs_f64() * self.speed,
37            )
38        } else {
39            self.target
40        }
41    }
42    fn set_target(&mut self, target: Self::Value, time: Self::Time) {
43        if self.target == target {
44            return;
45        }
46        self.value = self.get_value(time);
47        self.time = time;
48        self.target = target;
49    }
50}