pub struct WeakEntity<T> { /* private fields */ }Expand description
Implementations§
Source§impl<T: 'static> WeakEntity<T>
impl<T: 'static> WeakEntity<T>
Sourcepub fn upgrade(&self) -> Option<Entity<T>>
pub fn upgrade(&self) -> Option<Entity<T>>
Returns a strong handle to the entity, or None if it has been released.
Sourcepub fn update<C, R>(
&self,
cx: &mut C,
update: impl FnOnce(&mut T, &mut Context<'_, T>) -> R,
) -> Result<R>where
C: AppContext,
pub fn update<C, R>(
&self,
cx: &mut C,
update: impl FnOnce(&mut T, &mut Context<'_, T>) -> R,
) -> Result<R>where
C: AppContext,
Changes the entity if it still exists. Returns an error if it has been released.
This is Entity::update for a handle that may be stale. Use it in callbacks and tasks, where the
entity may have been released before the callback runs.
§Panics
Panics if the entity is already being updated, in the same cases as Entity::update. A weak
handle still upgrades during an update of its own entity, so it doesn’t report that case as an
error.
§Examples
struct Counter {
count: usize,
}
let counter = cx.new(|_cx| Counter { count: 0 });
let weak = counter.downgrade();
assert!(weak.update(cx, |counter, _cx| counter.count += 1).is_ok());
drop(counter);
// The update that dropped the last strong handle has finished, so the counter is gone.
assert!(weak.update(cx, |counter, _cx| counter.count += 1).is_err());Sourcepub fn update_in<C, R>(
&self,
cx: &mut C,
update: impl FnOnce(&mut T, &mut Window, &mut Context<'_, T>) -> R,
) -> Result<R>where
C: AppContext,
pub fn update_in<C, R>(
&self,
cx: &mut C,
update: impl FnOnce(&mut T, &mut Window, &mut Context<'_, T>) -> R,
) -> Result<R>where
C: AppContext,
Like WeakEntity::update, but also passes the Window that the entity is shown in.
Returns an error if the entity has been released, or if it isn’t shown in a window that is currently available.
Sourcepub fn read_with<C, R>(
&self,
cx: &C,
read: impl FnOnce(&T, &App) -> R,
) -> Result<R>where
C: AppContext,
pub fn read_with<C, R>(
&self,
cx: &C,
read: impl FnOnce(&T, &App) -> R,
) -> Result<R>where
C: AppContext,
Calls read with the entity if it still exists. Returns an error if it has been released.
Use this when you only need to read the value. It works with any AppContext.
Sourcepub fn new_invalid() -> Self
pub fn new_invalid() -> Self
Returns a weak handle that never upgrades. Use it as a placeholder until you have a real entity.
Methods from Deref<Target = AnyWeakEntity>§
Sourcepub fn is_upgradable(&self) -> bool
pub fn is_upgradable(&self) -> bool
Returns whether AnyWeakEntity::upgrade would succeed now.
Returns false once the last strong handle has been dropped, even before GPUI has released the
entity.
Sourcepub fn upgrade(&self) -> Option<AnyEntity>
pub fn upgrade(&self) -> Option<AnyEntity>
Returns a strong handle to the entity, or None if it has been released.
An entity whose last strong handle was dropped in the current update already returns None.
Sourcepub fn assert_released(&self)
pub fn assert_released(&self)
Asserts that the entity this handle refers to has been released.
Use this in tests to find a strong handle that was leaked. A task or a subscription that still holds
a strong handle makes the check fail. The check needs the leak detector, which is enabled in tests
and with the leak-detection feature.
GPUI releases an entity when the update that dropped its last handle finishes. Run an update before you call this, as the example does.
§Examples
let document = app.update(|cx| cx.new(|_cx| Document));
let weak = document.downgrade();
drop(document);
// The update finishes, and GPUI releases the entity.
app.update(|_cx| {});
weak.assert_released();§Debugging Leaks
If this method panics because of a leaked handle, set the LEAK_BACKTRACE environment variable to
see where the handle was created:
With leak detection enabled (build with GPUI_LEAK_DETECTION=1), a failure
lists each leaked handle. Also set the LEAK_BACKTRACE environment variable
to see where they were allocated:
GPUI_LEAK_DETECTION=1 LEAK_BACKTRACE=1 cargo test my_test§Panics
- Panics if any strong handles to the entity are still alive.
- Panics if the entity was dropped in the current update. Its resources are kept until that update finishes.
Trait Implementations§
Source§impl<T> Clone for WeakEntity<T>
impl<T> Clone for WeakEntity<T>
Source§impl<T> Debug for WeakEntity<T>
impl<T> Debug for WeakEntity<T>
Source§impl<T> Deref for WeakEntity<T>
impl<T> Deref for WeakEntity<T>
Source§impl<T> DerefMut for WeakEntity<T>
impl<T> DerefMut for WeakEntity<T>
impl<T> Eq for WeakEntity<T>
Source§impl<T> From<WeakEntity<T>> for AnyWeakEntity
impl<T> From<WeakEntity<T>> for AnyWeakEntity
Source§fn from(entity: WeakEntity<T>) -> Self
fn from(entity: WeakEntity<T>) -> Self
Source§impl<V: 'static + Render> From<WeakEntity<V>> for AnyWeakView
impl<V: 'static + Render> From<WeakEntity<V>> for AnyWeakView
Source§fn from(view: WeakEntity<V>) -> Self
fn from(view: WeakEntity<V>) -> Self
Source§impl<T> Hash for WeakEntity<T>
impl<T> Hash for WeakEntity<T>
Source§impl<T: 'static> Ord for WeakEntity<T>
impl<T: 'static> Ord for WeakEntity<T>
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl<T> PartialEq for WeakEntity<T>
impl<T> PartialEq for WeakEntity<T>
Source§impl<T> PartialEq<Entity<T>> for WeakEntity<T>
impl<T> PartialEq<Entity<T>> for WeakEntity<T>
Source§impl<T> PartialEq<WeakEntity<T>> for Entity<T>
impl<T> PartialEq<WeakEntity<T>> for Entity<T>
Source§impl<T: 'static> PartialOrd for WeakEntity<T>
impl<T: 'static> PartialOrd for WeakEntity<T>
Auto Trait Implementations§
impl<T> !RefUnwindSafe for WeakEntity<T>
impl<T> !UnwindSafe for WeakEntity<T>
impl<T> Freeze for WeakEntity<T>
impl<T> Send for WeakEntity<T>
impl<T> Sync for WeakEntity<T>
impl<T> Unpin for WeakEntity<T>
impl<T> UnsafeUnpin for WeakEntity<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<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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<K> MapSeekTarget<K> for Kwhere
K: Ord,
impl<K> MapSeekTarget<K> for Kwhere
K: Ord,
fn cmp_cursor(&self, cursor_location: &K) -> Ordering
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