1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
8pub enum TweenState {
9 #[default]
11 Idle,
12 Playing,
14 Paused,
16 Complete,
18}
19
20impl TweenState {
21 pub fn is_active(&self) -> bool {
23 matches!(self, Self::Playing)
24 }
25
26 pub fn is_complete(&self) -> bool {
28 matches!(self, Self::Complete)
29 }
30
31 pub fn is_paused(&self) -> bool {
33 matches!(self, Self::Paused)
34 }
35
36 pub fn is_idle(&self) -> bool {
38 matches!(self, Self::Idle)
39 }
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
44pub enum Direction {
45 #[default]
47 Forward,
48 Reverse,
50}
51
52impl Direction {
53 pub fn toggle(&mut self) {
55 *self = match self {
56 Self::Forward => Self::Reverse,
57 Self::Reverse => Self::Forward,
58 };
59 }
60
61 pub fn is_forward(&self) -> bool {
63 matches!(self, Self::Forward)
64 }
65
66 pub fn is_reverse(&self) -> bool {
68 matches!(self, Self::Reverse)
69 }
70
71 pub fn multiplier(&self) -> f32 {
75 match self {
76 Self::Forward => 1.0,
77 Self::Reverse => -1.0,
78 }
79 }
80}
81
82impl std::ops::Not for Direction {
83 type Output = Self;
84
85 fn not(self) -> Self::Output {
86 match self {
87 Self::Forward => Self::Reverse,
88 Self::Reverse => Self::Forward,
89 }
90 }
91}
92
93pub trait Controllable: Send + Sync {
98 fn play(&mut self);
100
101 fn pause(&mut self);
103
104 fn resume(&mut self);
106
107 fn reverse(&mut self);
109
110 fn restart(&mut self);
112
113 fn seek(&mut self, time: f32);
115
116 fn kill(&mut self);
118
119 fn progress(&self) -> f32;
121
122 fn set_progress(&mut self, progress: f32);
124
125 fn duration(&self) -> f32;
127
128 fn elapsed(&self) -> f32;
130
131 fn state(&self) -> TweenState;
133
134 fn direction(&self) -> Direction;
136
137 fn time_scale(&self) -> f32;
139
140 fn set_time_scale(&mut self, scale: f32);
142
143 fn tick(&mut self, delta: f32) -> bool;
147}
148
149#[cfg(test)]
150mod tests {
151 use super::*;
152
153 #[test]
154 fn test_tween_state() {
155 assert!(TweenState::Playing.is_active());
156 assert!(!TweenState::Paused.is_active());
157 assert!(TweenState::Complete.is_complete());
158 assert!(TweenState::Idle.is_idle());
159 }
160
161 #[test]
162 fn test_direction_toggle() {
163 let mut dir = Direction::Forward;
164
165 dir.toggle();
166 assert!(dir.is_reverse());
167
168 dir.toggle();
169 assert!(dir.is_forward());
170 }
171
172 #[test]
173 fn test_direction_multiplier() {
174 assert_eq!(Direction::Forward.multiplier(), 1.0);
175 assert_eq!(Direction::Reverse.multiplier(), -1.0);
176 }
177
178 #[test]
179 fn test_direction_not() {
180 assert_eq!(!Direction::Forward, Direction::Reverse);
181 assert_eq!(!Direction::Reverse, Direction::Forward);
182 }
183}