fix overview entrance animation

This commit is contained in:
Samuel Onoja committed 2026-10-04 07:53:34 +01:00
1 parent d75c93db85
commit c1801e1f07
6 files changed
+319 -43

No files matched your search

+26 -2
View File
@@ -206,6 +206,7 @@ struct WorkspaceSlideItem {
#[derive(Clone)]
struct WorkspaceSlide {
speed: f64,
items: Vec<WorkspaceSlideItem>,
spring: SpringConfig,
held_progress: Option<f64>,
@@ -253,6 +254,7 @@ impl WorkspaceSlide {
}
Self {
speed: 1.0,
items,
spring: SpringConfig {
stiffness: 320.0,
@@ -271,6 +273,7 @@ impl WorkspaceSlide {
}
fn sample(&self, item: &WorkspaceSlideItem, delta: Duration) -> (SlideOffset, SlideOffset) {
let delta = delta.mul_f64(self.speed);
if let Some(progress) = self.held_progress {
return (item.start.between(item.target, progress), item.velocity);
}
@@ -292,8 +295,8 @@ impl WorkspaceSlide {
y: y.current,
},
SlideOffset {
x: x.velocity,
y: y.velocity,
x: x.velocity * self.speed,
y: y.velocity * self.speed,
},
)
}
@@ -332,6 +335,7 @@ impl WorkspaceSlide {
}
fn advance(&mut self, delta: Duration) -> bool {
let delta = delta.mul_f64(self.speed);
if self.held_progress.is_some() {
return true;
}
@@ -1138,6 +1142,26 @@ impl ClientData for ClientState {
#[cfg(test)]
mod tests {
#[test]
fn overview_slide_prediction_uses_the_same_clock_as_live_motion() {
let mut slide = WorkspaceSlide::new(None, WorkspaceId(1), WorkspaceId(2), SwipeDirection::Left);
slide.speed = crate::overview::OVERVIEW_MOTION_SPEED;
for delta in [
Duration::from_millis(8),
Duration::from_millis(100),
Duration::from_secs(2),
] {
let mut advanced = slide.clone();
advanced.advance(delta);
for (item, after) in slide.items.iter().zip(&advanced.items) {
let (position, velocity) = slide.sample(item, delta);
assert_eq!(position, after.start);
assert_eq!(velocity.x, after.velocity.x * slide.speed);
assert_eq!(velocity.y, after.velocity.y * slide.speed);
}
}
}
#[test]
fn slide_item_sampling_matches_advance_without_mutating_the_slide() {
let mut slide = WorkspaceSlide::new(None, WorkspaceId(1), WorkspaceId(2), SwipeDirection::Up);