Checkpoint
This commit is contained in:
parent
7e49c7d782
commit
c5470d4050
2 changed files with 58 additions and 53 deletions
|
@ -1,10 +1,12 @@
|
|||
mod async_context;
|
||||
mod model_context;
|
||||
|
||||
pub use async_context::*;
|
||||
pub use model_context::*;
|
||||
|
||||
use crate::{
|
||||
current_platform, AnyWindowHandle, Context, LayoutId, MainThreadOnly, Platform, RootView,
|
||||
TextSystem, Window, WindowContext, WindowHandle, WindowId,
|
||||
current_platform, Context, LayoutId, MainThreadOnly, Platform, RootView, TextSystem, Window,
|
||||
WindowContext, WindowHandle, WindowId,
|
||||
};
|
||||
use anyhow::{anyhow, Result};
|
||||
use collections::{HashMap, VecDeque};
|
||||
|
@ -72,14 +74,13 @@ pub struct AppContext {
|
|||
this: Weak<Mutex<AppContext>>,
|
||||
platform: MainThreadOnly<dyn Platform>,
|
||||
text_system: Arc<TextSystem>,
|
||||
pending_updates: usize,
|
||||
pub(crate) unit_entity: Handle<()>,
|
||||
pub(crate) entities: SlotMap<EntityId, Option<Box<dyn Any + Send>>>,
|
||||
pub(crate) windows: SlotMap<WindowId, Option<Window>>,
|
||||
pending_updates: usize,
|
||||
pub(crate) pending_effects: VecDeque<Effect>,
|
||||
pub(crate) observers: HashMap<EntityId, Handlers>,
|
||||
// We recycle this memory across layout requests.
|
||||
pub(crate) layout_id_buffer: Vec<LayoutId>,
|
||||
pub(crate) layout_id_buffer: Vec<LayoutId>, // We recycle this memory across layout requests.
|
||||
}
|
||||
|
||||
impl AppContext {
|
||||
|
@ -230,54 +231,6 @@ impl Context for AppContext {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct AsyncContext(Weak<Mutex<AppContext>>);
|
||||
|
||||
impl Context for AsyncContext {
|
||||
type EntityContext<'a, 'b, T: Send + Sync + 'static> = ModelContext<'a, T>;
|
||||
type Result<T> = Result<T>;
|
||||
|
||||
fn entity<T: Send + Sync + 'static>(
|
||||
&mut self,
|
||||
build_entity: impl FnOnce(&mut Self::EntityContext<'_, '_, T>) -> T,
|
||||
) -> Result<Handle<T>> {
|
||||
let app = self
|
||||
.0
|
||||
.upgrade()
|
||||
.ok_or_else(|| anyhow!("app was released"))?;
|
||||
let mut lock = app.lock();
|
||||
Ok(lock.entity(build_entity))
|
||||
}
|
||||
|
||||
fn update_entity<T: Send + Sync + 'static, R>(
|
||||
&mut self,
|
||||
handle: &Handle<T>,
|
||||
update: impl FnOnce(&mut T, &mut Self::EntityContext<'_, '_, T>) -> R,
|
||||
) -> Result<R> {
|
||||
let app = self
|
||||
.0
|
||||
.upgrade()
|
||||
.ok_or_else(|| anyhow!("app was released"))?;
|
||||
let mut lock = app.lock();
|
||||
Ok(lock.update_entity(handle, update))
|
||||
}
|
||||
}
|
||||
|
||||
impl AsyncContext {
|
||||
pub fn update_window<T>(
|
||||
&self,
|
||||
handle: AnyWindowHandle,
|
||||
update: impl FnOnce(&mut WindowContext) -> T + Send + Sync,
|
||||
) -> Result<T> {
|
||||
let app = self
|
||||
.0
|
||||
.upgrade()
|
||||
.ok_or_else(|| anyhow!("app was released"))?;
|
||||
let mut app_context = app.lock();
|
||||
app_context.update_window(handle.id, update)
|
||||
}
|
||||
}
|
||||
|
||||
slotmap::new_key_type! { pub struct EntityId; }
|
||||
|
||||
pub struct Handle<T> {
|
||||
|
|
52
crates/gpui3/src/app/async_context.rs
Normal file
52
crates/gpui3/src/app/async_context.rs
Normal file
|
@ -0,0 +1,52 @@
|
|||
use crate::{AnyWindowHandle, AppContext, Context, Handle, ModelContext, Result, WindowContext};
|
||||
use anyhow::anyhow;
|
||||
use parking_lot::Mutex;
|
||||
use std::sync::Weak;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct AsyncContext(pub(crate) Weak<Mutex<AppContext>>);
|
||||
|
||||
impl Context for AsyncContext {
|
||||
type EntityContext<'a, 'b, T: Send + Sync + 'static> = ModelContext<'a, T>;
|
||||
type Result<T> = Result<T>;
|
||||
|
||||
fn entity<T: Send + Sync + 'static>(
|
||||
&mut self,
|
||||
build_entity: impl FnOnce(&mut Self::EntityContext<'_, '_, T>) -> T,
|
||||
) -> Result<Handle<T>> {
|
||||
let app = self
|
||||
.0
|
||||
.upgrade()
|
||||
.ok_or_else(|| anyhow!("app was released"))?;
|
||||
let mut lock = app.lock();
|
||||
Ok(lock.entity(build_entity))
|
||||
}
|
||||
|
||||
fn update_entity<T: Send + Sync + 'static, R>(
|
||||
&mut self,
|
||||
handle: &Handle<T>,
|
||||
update: impl FnOnce(&mut T, &mut Self::EntityContext<'_, '_, T>) -> R,
|
||||
) -> Result<R> {
|
||||
let app = self
|
||||
.0
|
||||
.upgrade()
|
||||
.ok_or_else(|| anyhow!("app was released"))?;
|
||||
let mut lock = app.lock();
|
||||
Ok(lock.update_entity(handle, update))
|
||||
}
|
||||
}
|
||||
|
||||
impl AsyncContext {
|
||||
pub fn update_window<T>(
|
||||
&self,
|
||||
handle: AnyWindowHandle,
|
||||
update: impl FnOnce(&mut WindowContext) -> T + Send + Sync,
|
||||
) -> Result<T> {
|
||||
let app = self
|
||||
.0
|
||||
.upgrade()
|
||||
.ok_or_else(|| anyhow!("app was released"))?;
|
||||
let mut app_context = app.lock();
|
||||
app_context.update_window(handle.id, update)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue