Skip to main content

gpui_base/motion/
stagger.rs

1use std::time::Duration;
2
3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
4pub enum StaggerOrigin {
5    First,
6    Last,
7    Center,
8    Index(usize),
9}
10
11#[derive(Clone, Copy, Debug, Eq, PartialEq)]
12pub struct Stagger {
13    interval: Duration,
14    origin: StaggerOrigin,
15}
16
17impl Stagger {
18    pub const fn new(interval: Duration, origin: StaggerOrigin) -> Self {
19        Self { interval, origin }
20    }
21
22    #[inline]
23    pub fn delay(&self, index: usize, count: usize) -> Duration {
24        if count == 0 {
25            return Duration::ZERO;
26        }
27        let index = index.min(count - 1);
28        let origin = match self.origin {
29            StaggerOrigin::First => 0,
30            StaggerOrigin::Last => count - 1,
31            StaggerOrigin::Center => (count - 1) / 2,
32            StaggerOrigin::Index(origin) => origin.min(count - 1),
33        };
34        self.interval
35            .saturating_mul(index.abs_diff(origin).min(u32::MAX as usize) as u32)
36    }
37}