diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 340a218ca75b2c5e6c5bb0402c89148f34d64014..1b29555a335ef117d696f218bb7e7e4daf14319f 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -84,6 +84,8 @@ pub trait UpgradeModelHandle { &self, handle: &WeakModelHandle, ) -> Option>; + + fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option; } pub trait UpgradeViewHandle { @@ -570,7 +572,11 @@ impl UpgradeModelHandle for AsyncAppContext { &self, handle: &WeakModelHandle, ) -> Option> { - self.0.borrow_mut().upgrade_model_handle(handle) + self.0.borrow().upgrade_model_handle(handle) + } + + fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option { + self.0.borrow().upgrade_any_model_handle(handle) } } @@ -1764,6 +1770,10 @@ impl UpgradeModelHandle for MutableAppContext { ) -> Option> { self.cx.upgrade_model_handle(handle) } + + fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option { + 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 { + 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 UpgradeModelHandle for ModelContext<'_, M> { ) -> Option> { self.cx.upgrade_model_handle(handle) } + + fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option { + self.cx.upgrade_any_model_handle(handle) + } } impl Deref for ModelContext<'_, M> { @@ -2610,6 +2637,10 @@ impl UpgradeModelHandle for ViewContext<'_, V> { ) -> Option> { self.cx.upgrade_model_handle(handle) } + + fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option { + self.cx.upgrade_any_model_handle(handle) + } } impl 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(&self) -> bool { self.model_type == TypeId::of::() } @@ -3306,12 +3344,34 @@ impl From> 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 { + cx.upgrade_any_model_handle(self) + } +} + pub struct WeakViewHandle { window_id: usize, view_id: usize, diff --git a/crates/gpui/src/presenter.rs b/crates/gpui/src/presenter.rs index e549a06ad66fba0a6eff6c85836bd05ef06e92ed..f49081ae2dd944728c957fffba374fdca8d2c9e5 100644 --- a/crates/gpui/src/presenter.rs +++ b/crates/gpui/src/presenter.rs @@ -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> { self.app.upgrade_model_handle(handle) } + + fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option { + self.app.upgrade_any_model_handle(handle) + } } impl<'a> UpgradeViewHandle for LayoutContext<'a> {