Minor API adjustments to make my blog post clearer (#4122)

I don't want to clutter this post with the asset source, so I made it
optional. I'm also checking in an example which helps me ensure my code
examples are valid.

Release Notes:

- N/A
This commit is contained in:
Nathan Sobo 2024-01-18 07:25:31 -07:00 committed by GitHub
commit 006bc5a1fa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 48 additions and 8 deletions

View file

@ -0,0 +1,35 @@
use gpui::{prelude::*, App, AppContext, EventEmitter, Model, ModelContext};
struct Counter {
count: usize,
}
struct Change {
increment: usize,
}
impl EventEmitter<Change> for Counter {}
fn main() {
App::new().run(|cx: &mut AppContext| {
let counter: Model<Counter> = cx.new_model(|_cx| Counter { count: 0 });
let subscriber = cx.new_model(|cx: &mut ModelContext<Counter>| {
cx.subscribe(&counter, |subscriber, _emitter, event, _cx| {
subscriber.count += event.increment * 2;
})
.detach();
Counter {
count: counter.read(cx).count * 2,
}
});
counter.update(cx, |counter, cx| {
counter.count += 2;
cx.notify();
cx.emit(Change { increment: 2 });
});
assert_eq!(subscriber.read(cx).count, 4);
});
}

View file

@ -111,14 +111,20 @@ pub struct App(Rc<AppCell>);
/// configured, you'll start the app with `App::run`.
impl App {
/// Builds an app with the given asset source.
pub fn production(asset_source: Arc<dyn AssetSource>) -> Self {
pub fn new() -> Self {
Self(AppContext::new(
current_platform(),
asset_source,
Arc::new(()),
http::client(),
))
}
/// Assign
pub fn with_assets(self, asset_source: impl AssetSource) -> Self {
self.0.borrow_mut().asset_source = Arc::new(asset_source);
self
}
/// Start the application. The provided callback will be called once the
/// app is fully launched.
pub fn run<F>(self, on_finish_launching: F)
@ -1167,7 +1173,7 @@ impl Context for AppContext {
type Result<T> = T;
/// Build an entity that is owned by the application. The given function will be invoked with
/// a `ModelContext` and must return an object representing the entity. A `Model` will be returned
/// a `ModelContext` and must return an object representing the entity. A `Model` handle will be returned,
/// which can be used to access the entity in a context.
fn new_model<T: 'static>(
&mut self,

View file

@ -1,4 +1,4 @@
use std::{sync::Arc, time::Duration};
use std::time::Duration;
use futures::StreamExt;
use gpui::{actions, KeyBinding, Menu, MenuItem};
@ -12,7 +12,7 @@ actions!(live_kit_client, [Quit]);
fn main() {
SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");
gpui::App::production(Arc::new(())).run(|cx| {
gpui::App::new().run(|cx| {
#[cfg(any(test, feature = "test-support"))]
println!("USING TEST LIVEKIT");

View file

@ -60,8 +60,7 @@ fn main() {
});
let theme_name = args.theme.unwrap_or("One Dark".to_string());
let asset_source = Arc::new(Assets);
gpui::App::production(asset_source).run(move |cx| {
gpui::App::new().with_assets(Assets).run(move |cx| {
load_embedded_fonts(cx).unwrap();
let mut store = SettingsStore::default();

View file

@ -67,7 +67,7 @@ fn main() {
}
log::info!("========== starting zed ==========");
let app = App::production(Arc::new(Assets));
let app = App::new().with_assets(Assets);
let (installation_id, existing_installation_id_found) = app
.background_executor()