pub struct MotionGraph { /* private fields */ }Expand description
Acyclic, insertion-ordered motion graph. Sources must precede their dependants. Setup allocates; sampling reuses nodes, scratch storage and listeners. Callbacks run after all derived values update. Defer edits to this graph until callbacks return; they may update other application state or cancel their subscriptions.
use gpui_ce_motion::{MotionGraph, Transition};
use std::time::Duration;
let mut graph = MotionGraph::default();
let x = graph.source(0.0);
let opacity = graph.derive(&[x], |v| (1.0 - v[0] / 200.0).clamp(0.0, 1.0)).unwrap();
graph.animate(x, 100.0, Transition::Instant, Duration::ZERO).unwrap();
graph.sample(Duration::ZERO, false);
assert_eq!(graph.get(opacity).unwrap(), 0.5);Implementations§
Source§impl MotionGraph
impl MotionGraph
Sourcepub fn source(&mut self, value: f64) -> ValueId
pub fn source(&mut self, value: f64) -> ValueId
Adds a finite scalar source. Panics for non-finite values.
Sourcepub fn derive(
&mut self,
inputs: &[ValueId],
map: impl Fn(&[f64]) -> f64 + 'static,
) -> Result<ValueId, GraphError>
pub fn derive( &mut self, inputs: &[ValueId], map: impl Fn(&[f64]) -> f64 + 'static, ) -> Result<ValueId, GraphError>
Sourcepub fn get(&self, id: ValueId) -> Result<f64, GraphError>
pub fn get(&self, id: ValueId) -> Result<f64, GraphError>
Last sampled presentation. Does not advance the graph.
Sourcepub fn velocity(&self, id: ValueId) -> Result<f64, GraphError>
pub fn velocity(&self, id: ValueId) -> Result<f64, GraphError>
Last sampled velocity, including finite-difference derived velocities.
Sourcepub fn animate(
&mut self,
id: ValueId,
target: f64,
transition: Transition,
now: Duration,
) -> Result<(), GraphError>
pub fn animate( &mut self, id: ValueId, target: f64, transition: Transition, now: Duration, ) -> Result<(), GraphError>
Retargets a source with the shared spring/tween solver. Identical declarations do not produce new start/cancel events. Panics for non-finite destinations.
Sourcepub fn set(
&mut self,
id: ValueId,
value: f64,
now: Duration,
) -> Result<(), GraphError>
pub fn set( &mut self, id: ValueId, value: f64, now: Duration, ) -> Result<(), GraphError>
Directly edits a source, with optional retained pointer velocity. This is
batched: dependants and listeners update on the next sample.
Sourcepub fn jump(
&mut self,
id: ValueId,
value: f64,
now: Duration,
) -> Result<(), GraphError>
pub fn jump( &mut self, id: ValueId, value: f64, now: Duration, ) -> Result<(), GraphError>
Cancels a source trajectory and clears momentum on the next sample.
Sourcepub fn subscribe(
&mut self,
id: ValueId,
callback: impl FnMut(MotionEvent) + 'static,
) -> Result<GraphSubscription, GraphError>
pub fn subscribe( &mut self, id: ValueId, callback: impl FnMut(MotionEvent) + 'static, ) -> Result<GraphSubscription, GraphError>
Listens to sampled changes and lifecycle events. Store the returned handle.
Sourcepub fn sample(&mut self, now: Duration, reduced_motion: bool)
pub fn sample(&mut self, now: Duration, reduced_motion: bool)
Advances sources, then derived dependencies, then dispatches listeners. Multiple writes coalesce to one change event per value and sample. Backward timestamps hold. Reduced motion settles sources using the shared policy.
Sourcepub fn is_animating(&self) -> bool
pub fn is_animating(&self) -> bool
Whether any source or dependant requires another frame.
Source§impl MotionGraph
impl MotionGraph
Sourcepub fn typed_source<T: MotionData<N>, const N: usize>(
&mut self,
value: T,
) -> [ValueId; N]
pub fn typed_source<T: MotionData<N>, const N: usize>( &mut self, value: T, ) -> [ValueId; N]
Adds the numeric channels of a typed value, allocating only during setup.
Panics for invalid channels as source does.
Sourcepub fn typed_value<T: MotionData<N>, const N: usize>(
&self,
template: T,
ids: [ValueId; N],
) -> Result<T, GraphError>
pub fn typed_value<T: MotionData<N>, const N: usize>( &self, template: T, ids: [ValueId; N], ) -> Result<T, GraphError>
Reconstructs a typed value from automatically sampled/derived channels.
Sourcepub fn animate_typed<T: MotionData<N>, const N: usize>(
&mut self,
ids: [ValueId; N],
target: T,
transition: Transition,
now: Duration,
) -> Result<(), GraphError>
pub fn animate_typed<T: MotionData<N>, const N: usize>( &mut self, ids: [ValueId; N], target: T, transition: Transition, now: Duration, ) -> Result<(), GraphError>
Retargets typed source channels transactionally. Invalid or derived IDs leave all sources unchanged; values/velocities use the shared solver.
Trait Implementations§
Source§impl Debug for MotionGraph
impl Debug for MotionGraph
Auto Trait Implementations§
impl !RefUnwindSafe for MotionGraph
impl !Send for MotionGraph
impl !Sync for MotionGraph
impl !UnwindSafe for MotionGraph
impl Freeze for MotionGraph
impl Unpin for MotionGraph
impl UnsafeUnpin for MotionGraph
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
Source§type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
Source§fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T, C> ComponentsInto<C> for T
impl<T, C> ComponentsInto<C> for T
Source§fn components_into(self) -> C
fn components_into(self) -> C
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more