#![warn(missing_docs)] use std::cell::Cell; /// The AnimationDriver pub struct AnimationDriver { /// Indicate whether there are any active animations that require a future call to update_animations. active_animations: Cell, global_instant: core::pin::Pin>>, } impl Default for AnimationDriver { fn default() -> Self { AnimationDriver { active_animations: Cell::default(), global_instant: Box::pin(crate::Property::new(instant::Instant::now())), } } } impl AnimationDriver { /// Iterates through all animations based on the new time tick and updates their state. This should be called by /// the windowing system driver for every frame. pub fn update_animations(&self, new_tick: instant::Instant) { self.active_animations.set(false); self.global_instant.as_ref().set(new_tick); } /// Returns true if there are any active or ready animations. This is used by the windowing system to determine /// if a new animation frame is required or not. Returns false otherwise. pub fn has_active_animations(&self) -> bool { self.active_animations.get() } /// Tell the driver that there are active animations pub fn set_has_active_animations(&self) { self.active_animations.set(true); } /// The current instant that is to be used for animation /// using this function register the current binding as a dependency pub fn current_tick(&self) -> instant::Instant { self.global_instant.as_ref().get() } } thread_local!(pub(crate) static CURRENT_ANIMATION_DRIVER : AnimationDriver = AnimationDriver::default());