Add AnyWeakModelHandle

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Max Brunsfeld 2022-02-15 17:56:50 -08:00
parent 34bba303dc
commit 1ca1595490
2 changed files with 68 additions and 4 deletions

View file

@ -84,6 +84,8 @@ pub trait UpgradeModelHandle {
&self, &self,
handle: &WeakModelHandle<T>, handle: &WeakModelHandle<T>,
) -> Option<ModelHandle<T>>; ) -> Option<ModelHandle<T>>;
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle>;
} }
pub trait UpgradeViewHandle { pub trait UpgradeViewHandle {
@ -570,7 +572,11 @@ impl UpgradeModelHandle for AsyncAppContext {
&self, &self,
handle: &WeakModelHandle<T>, handle: &WeakModelHandle<T>,
) -> Option<ModelHandle<T>> { ) -> Option<ModelHandle<T>> {
self.0.borrow_mut().upgrade_model_handle(handle) self.0.borrow().upgrade_model_handle(handle)
}
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
self.0.borrow().upgrade_any_model_handle(handle)
} }
} }
@ -1764,6 +1770,10 @@ impl UpgradeModelHandle for MutableAppContext {
) -> Option<ModelHandle<T>> { ) -> Option<ModelHandle<T>> {
self.cx.upgrade_model_handle(handle) self.cx.upgrade_model_handle(handle)
} }
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
self.cx.upgrade_any_model_handle(handle)
}
} }
impl UpgradeViewHandle for MutableAppContext { impl UpgradeViewHandle for MutableAppContext {
@ -1888,6 +1898,19 @@ impl UpgradeModelHandle for AppContext {
None None
} }
} }
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
if self.models.contains_key(&handle.model_id) {
self.ref_counts.lock().inc_model(handle.model_id);
Some(AnyModelHandle {
model_id: handle.model_id,
model_type: handle.model_type,
ref_counts: self.ref_counts.clone(),
})
} else {
None
}
}
} }
impl UpgradeViewHandle for AppContext { impl UpgradeViewHandle for AppContext {
@ -2280,6 +2303,10 @@ impl<M> UpgradeModelHandle for ModelContext<'_, M> {
) -> Option<ModelHandle<T>> { ) -> Option<ModelHandle<T>> {
self.cx.upgrade_model_handle(handle) self.cx.upgrade_model_handle(handle)
} }
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
self.cx.upgrade_any_model_handle(handle)
}
} }
impl<M> Deref for ModelContext<'_, M> { impl<M> Deref for ModelContext<'_, M> {
@ -2610,6 +2637,10 @@ impl<V> UpgradeModelHandle for ViewContext<'_, V> {
) -> Option<ModelHandle<T>> { ) -> Option<ModelHandle<T>> {
self.cx.upgrade_model_handle(handle) self.cx.upgrade_model_handle(handle)
} }
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
self.cx.upgrade_any_model_handle(handle)
}
} }
impl<V> UpgradeViewHandle for ViewContext<'_, V> { impl<V> UpgradeViewHandle for ViewContext<'_, V> {
@ -3290,6 +3321,13 @@ impl AnyModelHandle {
} }
} }
pub fn downgrade(&self) -> AnyWeakModelHandle {
AnyWeakModelHandle {
model_id: self.model_id,
model_type: self.model_type,
}
}
pub fn is<T: Entity>(&self) -> bool { pub fn is<T: Entity>(&self) -> bool {
self.model_type == TypeId::of::<T>() self.model_type == TypeId::of::<T>()
} }
@ -3306,12 +3344,34 @@ impl<T: Entity> From<ModelHandle<T>> for AnyModelHandle {
} }
} }
impl Clone for AnyModelHandle {
fn clone(&self) -> Self {
self.ref_counts.lock().inc_model(self.model_id);
Self {
model_id: self.model_id,
model_type: self.model_type,
ref_counts: self.ref_counts.clone(),
}
}
}
impl Drop for AnyModelHandle { impl Drop for AnyModelHandle {
fn drop(&mut self) { fn drop(&mut self) {
self.ref_counts.lock().dec_model(self.model_id); self.ref_counts.lock().dec_model(self.model_id);
} }
} }
pub struct AnyWeakModelHandle {
model_id: usize,
model_type: TypeId,
}
impl AnyWeakModelHandle {
pub fn upgrade(&self, cx: &impl UpgradeModelHandle) -> Option<AnyModelHandle> {
cx.upgrade_any_model_handle(self)
}
}
pub struct WeakViewHandle<T> { pub struct WeakViewHandle<T> {
window_id: usize, window_id: usize,
view_id: usize, view_id: usize,

View file

@ -6,9 +6,9 @@ use crate::{
json::{self, ToJson}, json::{self, ToJson},
platform::Event, platform::Event,
text_layout::TextLayoutCache, text_layout::TextLayoutCache,
Action, AnyAction, AnyViewHandle, AssetCache, ElementBox, Entity, FontSystem, ModelHandle, Action, AnyAction, AnyModelHandle, AnyViewHandle, AnyWeakModelHandle, AssetCache, ElementBox,
ReadModel, ReadView, Scene, UpgradeModelHandle, UpgradeViewHandle, View, ViewHandle, Entity, FontSystem, ModelHandle, ReadModel, ReadView, Scene, UpgradeModelHandle,
WeakModelHandle, WeakViewHandle, UpgradeViewHandle, View, ViewHandle, WeakModelHandle, WeakViewHandle,
}; };
use pathfinder_geometry::vector::{vec2f, Vector2F}; use pathfinder_geometry::vector::{vec2f, Vector2F};
use serde_json::json; use serde_json::json;
@ -280,6 +280,10 @@ impl<'a> UpgradeModelHandle for LayoutContext<'a> {
) -> Option<ModelHandle<T>> { ) -> Option<ModelHandle<T>> {
self.app.upgrade_model_handle(handle) self.app.upgrade_model_handle(handle)
} }
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
self.app.upgrade_any_model_handle(handle)
}
} }
impl<'a> UpgradeViewHandle for LayoutContext<'a> { impl<'a> UpgradeViewHandle for LayoutContext<'a> {