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>
impl<T: Lerp + Clone + PartialEq + 'static> Transition<T>
Sourcepub fn new(state: Entity<TransitionState<T>>, motion: impl Into<Motion>) -> Self
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.
Sourcepub fn with_easing(self, easing: impl Fn(f32) -> f32 + 'static) -> Self
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.
Sourcepub fn continuous(self, continuous: bool) -> Self
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.
Sourcepub fn evaluate(&self, window: &mut Window, cx: &mut App) -> Ref<'_, T>
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.
Sourcepub fn read_cache(&self) -> Ref<'_, Option<T>>
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.
Sourcepub fn evaluate_delta(&self, cx: &App) -> f32
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.
Sourcepub fn update<R>(
&self,
cx: &mut App,
update: impl FnOnce(&mut T, &mut Context<'_, TransitionState<T>>) -> R,
) -> bool
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.
Sourcepub fn jump_to(&self, target: T, cx: &mut App)
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.
Sourcepub fn scale_by(&self, ratio: f32, cx: &mut App)
pub fn scale_by(&self, ratio: f32, cx: &mut App)
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.
Trait Implementations§
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>
impl<T> UnsafeUnpin for Transition<T>
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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<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