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,
handle: &WeakModelHandle<T>,
) -> Option<ModelHandle<T>>;
fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle>;
}
pub trait UpgradeViewHandle {
@ -570,7 +572,11 @@ impl UpgradeModelHandle for AsyncAppContext {
&self,
handle: &WeakModelHandle<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>> {
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 {
@ -1888,6 +1898,19 @@ impl UpgradeModelHandle for AppContext {
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 {
@ -2280,6 +2303,10 @@ impl<M> UpgradeModelHandle for ModelContext<'_, M> {
) -> Option<ModelHandle<T>> {
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> {
@ -2610,6 +2637,10 @@ impl<V> UpgradeModelHandle for ViewContext<'_, V> {
) -> Option<ModelHandle<T>> {
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> {
@ -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 {
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 {
fn drop(&mut self) {
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> {
window_id: usize,
view_id: usize,

View file

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