Skip to main content

Transition

Struct Transition 

Source
pub struct Transition<T: Lerp + Clone + PartialEq + 'static> { /* private fields */ }
Expand description

A value that moves toward a goal over time and changes course when that goal changes.

A Transition pairs an entity that holds a TransitionState with a Motion. Read the value for the current frame with evaluate during render. Change the goal with update from an event handler, then call cx.notify() so the view redraws. T must implement Lerp, Clone and PartialEq.

Clones share the goal and motion state, but each has its own per-frame cache. Read the value through the clone that is rendering it.

Create one during render with Window::use_keyed_transition. Its key keeps the state across frames. Window::use_transition keys state by call site instead, so that state lasts only while the element renders at that call site in consecutive frames.

§Continuous and non-continuous mode

Transitions are continuous by default. When the goal changes:

  • Continuous (the default): the value continues from where it is now toward the new goal.
  • Non-continuous (continuous(false)): the value restarts from the initial value and moves toward the new goal.

§Examples

The goal can change from an event handler, and the value follows it. This example uses an easing of |_| 0.5, so the value sits halfway between its start and its goal, and the assertions are exact.

use gpui::{
    AppContext, Context, IntoElement, Render, TestApp, Transition, TransitionState, Window,
    div, prelude::*, secs,
};

struct Fade {
    transition: Transition<f32>,
}

impl Render for Fade {
    fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
        let opacity = *self.transition.evaluate(window, cx);
        div().opacity(opacity)
    }
}

let mut app = TestApp::new();
let mut window = app.open_window(|_, cx| {
    let state = cx.new(|_| TransitionState::new(0.0_f32, secs(10)));
    Fade {
        transition: Transition::new(state, secs(10)).with_easing(|_| 0.5),
    }
});

window.update(|view, _, cx| {
    view.transition.update(cx, |goal, cx| {
        *goal = 1.0;
        cx.notify();
    });
});
window.draw();

window.update(|view, _, cx| {
    assert_eq!(*view.transition.read_cache(), Some(0.5));
    assert_eq!(*view.transition.read_goal(cx), 1.0);
});

See the animation guide for the keyed hook.

Implementations§

Source§

impl<T: Lerp + Clone + PartialEq + 'static> Transition<T>

Source

pub fn new(state: Entity<TransitionState<T>>, motion: impl Into<Motion>) -> Self

Creates a transition that stores its state in state and animates with motion.

Inside render, prefer Window::use_keyed_transition, which creates the state for you.

Source

pub fn with_easing(self, easing: impl Fn(f32) -> f32 + 'static) -> Self

Sets the easing of the forward pass. See Motion::with_easing.

The easing maps normalized pass time to presentation progress. It may be non-monotonic, and it may overshoot zero through one.

Source

pub fn continuous(self, continuous: bool) -> Self

Sets whether a new goal continues from the current value.

Continuous is the default. Pass false to restart from the initial value on every goal change instead.

Source

pub fn evaluate(&self, window: &mut Window, cx: &mut App) -> Ref<'_, T>

Returns the value for the current frame, and requests another frame while it moves.

The value depends on the time since the last goal change, and on the easing. The first call samples the clock and caches the result. Later calls return the cached value until the goal changes or the cache is cleared, so a Transition kept across frames returns the same value. Window::use_keyed_transition returns a new Transition on every render, which avoids this. Call this during render or paint.

Source

pub fn read_goal<'b>(&'b self, cx: &'b mut App) -> &'b T

Returns the goal: the value most recently set by update.

This isn’t the value on screen while the transition moves. Use evaluate for that.

Source

pub fn read_cache(&self) -> Ref<'_, Option<T>>

Returns the value cached by the last evaluate, or None if the cache was cleared.

The cache is cleared when the goal changes, and by jump_to, scale_by, reset and with_easing.

Source

pub fn evaluate_delta(&self, cx: &App) -> f32

Returns the eased progress for the current frame, without requesting another frame.

Progress may overshoot zero through one. It doesn’t mean the run has finished: restarting iterations begin again, and alternating iterations run in reverse.

Source

pub fn update<R>( &self, cx: &mut App, update: impl FnOnce(&mut T, &mut Context<'_, TransitionState<T>>) -> R, ) -> bool

Changes the goal, and starts a run toward the new goal if it changed.

update passes the current goal to the closure, which can change it. If the new goal differs from the old one, the value moves toward it. In continuous mode the run starts from the current value. Otherwise it starts from the initial value. The goal isn’t read during render, so change it from an event handler.

Returns true if the goal changed, and false if it stayed the same.

This doesn’t notify GPUI. Call cx.notify() inside the closure to redraw the view.

Source

pub fn jump_to(&self, target: T, cx: &mut App)

Sets the value and the goal to target, with no animation.

Later calls to evaluate return target until the goal changes again. Use this when the next animation should start from a different value.

Source

pub fn scale_by(&self, ratio: f32, cx: &mut App)
where T: Mul<f32, Output = T>,

Multiplies the start value and the goal by ratio.

An in-flight transition keeps its progress when the coordinate space changes, such as a window resize. Pass the ratio of the new scale to the old one.

Source

pub fn entity_id(&self) -> EntityId

Returns the ID of the entity that holds this transition’s state.

Use it to tell two transitions apart.

Source

pub fn reset(&self, cx: &mut App)

Returns the transition to its initial value, with no animation.

This clears any progress and sets the goal back to the value the transition was created with. The cache is cleared too.

Trait Implementations§

Source§

impl<T: Clone + Lerp + Clone + PartialEq + 'static> Clone for Transition<T>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for Transition<T>

§

impl<T> !RefUnwindSafe for Transition<T>

§

impl<T> !Send for Transition<T>

§

impl<T> !Sync for Transition<T>

§

impl<T> !UnwindSafe for Transition<T>

§

impl<T> Unpin for Transition<T>
where Entity<Animated<T>>: Unpin, RefCell<TransitionCache<T>>: Unpin,

§

impl<T> UnsafeUnpin for Transition<T>
where Entity<Animated<T>>: UnsafeUnpin, RefCell<TransitionCache<T>>: UnsafeUnpin,

Blanket Implementations§

Source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where 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) -> D
where M: TransformMatrix<T>,

👎Deprecated since 0.7.7:

replaced by palette::chromatic_adaptation::AdaptIntoUnclamped

Convert the source color to the destination color using the specified method.
Source§

fn adapt_into(self) -> D

👎Deprecated since 0.7.7:

replaced by palette::chromatic_adaptation::AdaptIntoUnclamped

Convert the source color to the destination color using the bradford method by default.
Source§

impl<T, C> AdaptIntoUnclamped<T> for C
where T: AdaptFromUnclamped<C>,

Source§

type Scalar = <T as AdaptFromUnclamped<C>>::Scalar

The number type that’s used as the color’s components.
Source§

fn adapt_into_unclamped_with<M>(self) -> T

Adapt a color of type Self into a color of type T, using the custom matrix M. Read more
Source§

fn adapt_into_unclamped(self) -> T
where Bradford: LmsToXyz<Self::Scalar> + XyzToLms<Self::Scalar>,

Adapt a color of type Self into a color of type T, using the Bradford matrix. Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, C> ArraysFrom<C> for T
where C: IntoArrays<T>,

Source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
Source§

impl<T, C> ArraysInto<C> for T
where C: FromArrays<T>,

Source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where T: FromCam16Unclamped<WpParam, U>,

Source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

Source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
Source§

impl<T, C> ComponentsInto<C> for T

Source§

fn components_into(self) -> C

Cast this collection of color components into a collection of colors. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromAngle<T> for T

Source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
Source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

Source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> IntoAngle<U> for T
where U: FromAngle<T>,

Source§

fn into_angle(self) -> U

Performs a conversion into T.
Source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where T: Cam16FromUnclamped<WpParam, U>,

Source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, U> IntoColor<U> for T
where U: FromColor<T>,

Source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
Source§

impl<T, U> IntoColorUnclamped<U> for T
where U: FromColorUnclamped<T>,

Source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoStimulus<T> for T

Source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

Source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
Source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U> TryIntoColor<U> for T
where U: TryFromColor<T>,

Source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
Source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

Source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
Source§

impl<C, U> UintsInto<C> for U
where C: FromUints<U>,

Source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more