From 83363008f9ea6c042805281b101f96bbb5bc1997 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 23 Jan 2024 15:30:51 -0800 Subject: [PATCH 01/27] Call notify observers during `Window::draw()` --- crates/gpui/src/element.rs | 19 +++++++++++ crates/gpui/src/window.rs | 64 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/crates/gpui/src/element.rs b/crates/gpui/src/element.rs index 4dbc7be652d3acf73bc90e3c709039fb79223074..b91d5381a0e8cb1476042d52a0c4e6085902d5a2 100644 --- a/crates/gpui/src/element.rs +++ b/crates/gpui/src/element.rs @@ -136,6 +136,25 @@ impl Render for () { fn render(&mut self, _cx: &mut ViewContext) -> impl IntoElement {} } +/// A quick way to create a [`Render`]able view without having to define a new type. +#[cfg(any(test, feature = "test-support"))] +pub struct TestView(Box) -> AnyElement>); + +#[cfg(any(test, feature = "test-support"))] +impl TestView { + /// Construct a TestView from a render closure. + pub fn new) -> AnyElement + 'static>(f: F) -> Self { + Self(Box::new(f)) + } +} + +#[cfg(any(test, feature = "test-support"))] +impl Render for TestView { + fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { + (self.0)(cx) + } +} + /// You can derive [`IntoElement`] on any type that implements this trait. /// It is used to construct reusable `components` out of plain data. Think of /// components as a recipe for a certain pattern of elements. RenderOnce allows diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 4a4c328fd07baf576da83f0dd79e209334335359..edd998c84848d8a5f63ca580f6331449e189bc60 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -94,6 +94,7 @@ type AnyObserver = Box bool + 'static>; type AnyWindowFocusListener = Box bool + 'static>; +#[derive(Debug)] struct FocusEvent { previous_focus_path: SmallVec<[FocusId; 8]>, current_focus_path: SmallVec<[FocusId; 8]>, @@ -2015,11 +2016,12 @@ impl<'a, V: 'static> ViewContext<'a, V> { } } + // Always emit a notify effect, so that handlers fire correctly + self.window_cx.app.push_effect(Effect::Notify { + emitter: self.view.model.entity_id, + }); if !self.window.drawing { self.window_cx.window.dirty = true; - self.window_cx.app.push_effect(Effect::Notify { - emitter: self.view.model.entity_id, - }); } } @@ -2751,3 +2753,59 @@ pub fn outline(bounds: impl Into>, border_color: impl Into) border_color: border_color.into(), } } + +#[cfg(test)] +mod test { + + use std::{cell::RefCell, rc::Rc}; + + use crate::{ + self as gpui, div, FocusHandle, InteractiveElement, IntoElement, Render, TestAppContext, + ViewContext, VisualContext, + }; + + #[gpui::test] + fn test_notify_on_focus(cx: &mut TestAppContext) { + struct TestFocusView { + handle: FocusHandle, + } + + impl Render for TestFocusView { + fn render(&mut self, _cx: &mut ViewContext) -> impl IntoElement { + div().id("test").track_focus(&self.handle) + } + } + + let notify_counter = Rc::new(RefCell::new(0)); + + let (notify_producer, cx) = cx.add_window_view(|cx| { + cx.activate_window(); + let handle = cx.focus_handle(); + + cx.on_focus(&handle, |_, cx| { + cx.notify(); + }) + .detach(); + + TestFocusView { handle } + }); + + let focus_handle = cx.update(|cx| notify_producer.read(cx).handle.clone()); + + let _notify_consumer = cx.new_view({ + |cx| { + let notify_counter = notify_counter.clone(); + cx.observe(¬ify_producer, move |_, _, _| { + *notify_counter.borrow_mut() += 1; + }) + .detach(); + } + }); + + cx.update(|cx| { + cx.focus(&focus_handle); + }); + + assert_eq!(*notify_counter.borrow(), 1); + } +} From a936aab72ff0d979a6ec048e9b41a5cec335cc48 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 23 Jan 2024 22:09:38 -0500 Subject: [PATCH 02/27] Update README (#4237) This PR updates the README by removing the TODO items and linking out to the contributing docs. Release Notes: - N/A --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 737615623194a958f4d8b8d129dfab50475e2e8b..a3ca3651fc71afec3998e9f4745a8fb5b298a167 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,3 @@ -# 🚧 TODO 🚧 - -- [ ] Add intro -- [ ] Add link to contributing guide -- [ ] Add barebones running zed from source instructions -- [ ] Link out to further dev docs - # Zed [![CI](https://github.com/zed-industries/zed/actions/workflows/ci.yml/badge.svg)](https://github.com/zed-industries/zed/actions/workflows/ci.yml) @@ -16,6 +9,10 @@ Welcome to Zed, a high-performance, multiplayer code editor from the creators of - [Building Zed](./docs/src/developing_zed__building_zed.md) - [Running Collaboration Locally](./docs/src/developing_zed__local_collaboration.md) +### Contributing + +See [CONTRIBUTING.md](./CONTRIBUTING.md) for ways you can contribute to Zed. + ### Licensing License information for third party dependencies must be correctly provided for CI to pass. From 6b50509182a4903e8d19d81134cafb8b060e0473 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 23 Jan 2024 22:15:37 -0500 Subject: [PATCH 03/27] Balance headings in README (#4238) This PR balances the headings in the README. Release Notes: - N/A --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a3ca3651fc71afec3998e9f4745a8fb5b298a167..aa325db454b99ae67e89700a8bdf21ee3b3c10a6 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ Welcome to Zed, a high-performance, multiplayer code editor from the creators of - [Building Zed](./docs/src/developing_zed__building_zed.md) - [Running Collaboration Locally](./docs/src/developing_zed__local_collaboration.md) -### Contributing +## Contributing See [CONTRIBUTING.md](./CONTRIBUTING.md) for ways you can contribute to Zed. -### Licensing +## Licensing License information for third party dependencies must be correctly provided for CI to pass. From ab3aba9d2ff37b8aa25f68912cee1d52bf646365 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 23 Jan 2024 22:31:39 -0500 Subject: [PATCH 04/27] Add `CODE_OF_CONDUCT.md` (#4239) This PR adds a `CODE_OF_CONDUCT.md` that links out to the existing code of conduct on the Zed site. The link in the file is currently a dead link, but will work once the new site goes live tomorrow. Release Notes: - N/A --- CODE_OF_CONDUCT.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000000000000000000000000000000000..57e3cc7c59ff77a09061ba9e28ebaabf593d9c11 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +# Code of Conduct + +The Code of Conduct for this repository can be found online at [zed.dev/docs/code-of-conduct](https://zed.dev/docs/code-of-conduct). From c07e416dc025120d64de3c928e155347fa274841 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 23 Jan 2024 23:20:05 -0500 Subject: [PATCH 05/27] Clean up `gpui` docs (#4240) This PR does some cleanup of the `gpui` docs, making sure we're linking things appropriately and following good Rust documentation style. Release Notes: - N/A --- crates/gpui/src/app/async_context.rs | 16 ++- crates/gpui/src/app/model_context.rs | 5 +- crates/gpui/src/elements/div.rs | 190 +++++++++++++-------------- crates/gpui/src/shared_string.rs | 2 +- crates/gpui/src/window.rs | 2 +- crates/gpui/src/window/element_cx.rs | 14 +- 6 files changed, 119 insertions(+), 110 deletions(-) diff --git a/crates/gpui/src/app/async_context.rs b/crates/gpui/src/app/async_context.rs index 7c36aebf57b0236d54f286789d03b60ec547cab5..f1bfe7ef4ec18da777982b510192523de93d4bd2 100644 --- a/crates/gpui/src/app/async_context.rs +++ b/crates/gpui/src/app/async_context.rs @@ -154,6 +154,7 @@ impl AsyncAppContext { } /// Reads the global state of the specified type, passing it to the given callback. + /// /// Panics if no global state of the specified type has been assigned. /// Returns an error if the `AppContext` has been dropped. pub fn read_global(&self, read: impl FnOnce(&G, &AppContext) -> R) -> Result { @@ -166,7 +167,10 @@ impl AsyncAppContext { } /// Reads the global state of the specified type, passing it to the given callback. - /// Similar to [read_global], but returns an error instead of panicking if no state of the specified type has been assigned. + /// + /// Similar to [`AsyncAppContext::read_global`], but returns an error instead of panicking + /// if no state of the specified type has been assigned. + /// /// Returns an error if no state of the specified type has been assigned the `AppContext` has been dropped. pub fn try_read_global( &self, @@ -212,12 +216,12 @@ impl AsyncWindowContext { self.window } - /// A convenience method for [WindowContext::update()] + /// A convenience method for [`AppContext::update_window`]. pub fn update(&mut self, update: impl FnOnce(&mut WindowContext) -> R) -> Result { self.app.update_window(self.window, |_, cx| update(cx)) } - /// A convenience method for [WindowContext::update()] + /// A convenience method for [`AppContext::update_window`]. pub fn update_root( &mut self, update: impl FnOnce(AnyView, &mut WindowContext) -> R, @@ -225,12 +229,12 @@ impl AsyncWindowContext { self.app.update_window(self.window, update) } - /// A convenience method for [WindowContext::on_next_frame()] + /// A convenience method for [`WindowContext::on_next_frame`]. pub fn on_next_frame(&mut self, f: impl FnOnce(&mut WindowContext) + 'static) { self.window.update(self, |_, cx| cx.on_next_frame(f)).ok(); } - /// A convenience method for [AppContext::global()] + /// A convenience method for [`AppContext::global`]. pub fn read_global( &mut self, read: impl FnOnce(&G, &WindowContext) -> R, @@ -238,7 +242,7 @@ impl AsyncWindowContext { self.window.update(self, |_, cx| read(cx.global(), cx)) } - /// A convenience method for [AppContext::update_global()] + /// A convenience method for [`AppContext::update_global`]. /// for updating the global state of the specified type. pub fn update_global( &mut self, diff --git a/crates/gpui/src/app/model_context.rs b/crates/gpui/src/app/model_context.rs index 268410245e95aae8e1f1a091f9b98d0ce359dfdb..38caa1b260ffa285702d7381a9ccc0033c7bb917 100644 --- a/crates/gpui/src/app/model_context.rs +++ b/crates/gpui/src/app/model_context.rs @@ -42,7 +42,8 @@ impl<'a, T: 'static> ModelContext<'a, T> { self.model_state.clone() } - /// Arranges for the given function to be called whenever [ModelContext::notify] or [ViewContext::notify] is called with the given model or view. + /// Arranges for the given function to be called whenever [`ModelContext::notify`] or + /// [`ViewContext::notify`](crate::ViewContext::notify) is called with the given model or view. pub fn observe( &mut self, entity: &E, @@ -150,7 +151,7 @@ impl<'a, T: 'static> ModelContext<'a, T> { } /// Arrange for the given function to be invoked whenever the application is quit. - /// The future returned from this callback will be polled for up to [gpui::SHUTDOWN_TIMEOUT] until the app fully quits. + /// The future returned from this callback will be polled for up to [crate::SHUTDOWN_TIMEOUT] until the app fully quits. pub fn on_app_quit( &mut self, mut on_quit: impl FnMut(&mut T, &mut ModelContext) -> Fut + 'static, diff --git a/crates/gpui/src/elements/div.rs b/crates/gpui/src/elements/div.rs index 7ccdf8c2bf04891d9084b2170dc926874143a563..4a951fb48dddabab7ae42a22a78fa8d6354a6f5f 100644 --- a/crates/gpui/src/elements/div.rs +++ b/crates/gpui/src/elements/div.rs @@ -1,7 +1,7 @@ //! Div is the central, reusable element that most GPUI trees will be built from. //! It functions as a container for other elements, and provides a number of //! useful features for laying out and styling its children as well as binding -//! mouse events and action handlers. It is meant to be similar to the HTML
+//! mouse events and action handlers. It is meant to be similar to the HTML `
` //! element, but for GPUI. //! //! # Build your own div @@ -85,7 +85,7 @@ impl Interactivity { /// Bind the given callback to the mouse down event for the given mouse button, during the bubble phase /// The imperative API equivalent of [`InteractiveElement::on_mouse_down`] /// - /// See [`ViewContext::listener()`] to get access to the view state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to the view state from this callback. pub fn on_mouse_down( &mut self, button: MouseButton, @@ -105,7 +105,7 @@ impl Interactivity { /// Bind the given callback to the mouse down event for any button, during the capture phase /// The imperative API equivalent of [`InteractiveElement::capture_any_mouse_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn capture_any_mouse_down( &mut self, listener: impl Fn(&MouseDownEvent, &mut WindowContext) + 'static, @@ -119,9 +119,9 @@ impl Interactivity { } /// Bind the given callback to the mouse down event for any button, during the bubble phase - /// the imperative API equivalent to [`InteractiveElement::on_any_mouse_down()`] + /// the imperative API equivalent to [`InteractiveElement::on_any_mouse_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_any_mouse_down( &mut self, listener: impl Fn(&MouseDownEvent, &mut WindowContext) + 'static, @@ -135,9 +135,9 @@ impl Interactivity { } /// Bind the given callback to the mouse up event for the given button, during the bubble phase - /// the imperative API equivalent to [`InteractiveElement::on_mouse_up()`] + /// the imperative API equivalent to [`InteractiveElement::on_mouse_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_mouse_up( &mut self, button: MouseButton, @@ -155,9 +155,9 @@ impl Interactivity { } /// Bind the given callback to the mouse up event for any button, during the capture phase - /// the imperative API equivalent to [`InteractiveElement::capture_any_mouse_up()`] + /// the imperative API equivalent to [`InteractiveElement::capture_any_mouse_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn capture_any_mouse_up( &mut self, listener: impl Fn(&MouseUpEvent, &mut WindowContext) + 'static, @@ -171,9 +171,9 @@ impl Interactivity { } /// Bind the given callback to the mouse up event for any button, during the bubble phase - /// the imperative API equivalent to [`InteractiveElement::on_any_mouse_up()`] + /// the imperative API equivalent to [`Interactivity::on_any_mouse_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_any_mouse_up( &mut self, listener: impl Fn(&MouseUpEvent, &mut WindowContext) + 'static, @@ -188,9 +188,9 @@ impl Interactivity { /// Bind the given callback to the mouse down event, on any button, during the capture phase, /// when the mouse is outside of the bounds of this element. - /// The imperative API equivalent to [`InteractiveElement::on_mouse_down_out()`] + /// The imperative API equivalent to [`InteractiveElement::on_mouse_down_out`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_mouse_down_out( &mut self, listener: impl Fn(&MouseDownEvent, &mut WindowContext) + 'static, @@ -206,9 +206,9 @@ impl Interactivity { /// Bind the given callback to the mouse up event, for the given button, during the capture phase, /// when the mouse is outside of the bounds of this element. - /// The imperative API equivalent to [`InteractiveElement::on_mouse_up_out()`] + /// The imperative API equivalent to [`InteractiveElement::on_mouse_up_out`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_mouse_up_out( &mut self, button: MouseButton, @@ -226,9 +226,9 @@ impl Interactivity { } /// Bind the given callback to the mouse move event, during the bubble phase - /// The imperative API equivalent to [`InteractiveElement::on_mouse_move()`] + /// The imperative API equivalent to [`InteractiveElement::on_mouse_move`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_mouse_move( &mut self, listener: impl Fn(&MouseMoveEvent, &mut WindowContext) + 'static, @@ -245,9 +245,9 @@ impl Interactivity { /// will be called for all move events, inside or outside of this element, as long as the /// drag was started with this element under the mouse. Useful for implementing draggable /// UIs that don't conform to a drag and drop style interaction, like resizing. - /// The imperative API equivalent to [`InteractiveElement::on_drag_move()`] + /// The imperative API equivalent to [`InteractiveElement::on_drag_move`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_drag_move( &mut self, listener: impl Fn(&DragMoveEvent, &mut WindowContext) + 'static, @@ -275,9 +275,9 @@ impl Interactivity { } /// Bind the given callback to scroll wheel events during the bubble phase - /// The imperative API equivalent to [`InteractiveElement::on_scroll_wheel()`] + /// The imperative API equivalent to [`InteractiveElement::on_scroll_wheel`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_scroll_wheel( &mut self, listener: impl Fn(&ScrollWheelEvent, &mut WindowContext) + 'static, @@ -291,9 +291,9 @@ impl Interactivity { } /// Bind the given callback to an action dispatch during the capture phase - /// The imperative API equivalent to [`InteractiveElement::capture_action()`] + /// The imperative API equivalent to [`InteractiveElement::capture_action`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn capture_action( &mut self, listener: impl Fn(&A, &mut WindowContext) + 'static, @@ -310,9 +310,9 @@ impl Interactivity { } /// Bind the given callback to an action dispatch during the bubble phase - /// The imperative API equivalent to [`InteractiveElement::on_action()`] + /// The imperative API equivalent to [`InteractiveElement::on_action`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_action(&mut self, listener: impl Fn(&A, &mut WindowContext) + 'static) { self.action_listeners.push(( TypeId::of::(), @@ -328,9 +328,9 @@ impl Interactivity { /// Bind the given callback to an action dispatch, based on a dynamic action parameter /// instead of a type parameter. Useful for component libraries that want to expose /// action bindings to their users. - /// The imperative API equivalent to [`InteractiveElement::on_boxed_action()`] + /// The imperative API equivalent to [`InteractiveElement::on_boxed_action`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_boxed_action( &mut self, action: &dyn Action, @@ -348,9 +348,9 @@ impl Interactivity { } /// Bind the given callback to key down events during the bubble phase - /// The imperative API equivalent to [`InteractiveElement::on_key_down()`] + /// The imperative API equivalent to [`InteractiveElement::on_key_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_key_down(&mut self, listener: impl Fn(&KeyDownEvent, &mut WindowContext) + 'static) { self.key_down_listeners .push(Box::new(move |event, phase, cx| { @@ -361,9 +361,9 @@ impl Interactivity { } /// Bind the given callback to key down events during the capture phase - /// The imperative API equivalent to [`InteractiveElement::capture_key_down()`] + /// The imperative API equivalent to [`InteractiveElement::capture_key_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn capture_key_down( &mut self, listener: impl Fn(&KeyDownEvent, &mut WindowContext) + 'static, @@ -377,9 +377,9 @@ impl Interactivity { } /// Bind the given callback to key up events during the bubble phase - /// The imperative API equivalent to [`InteractiveElement::on_key_up()`] + /// The imperative API equivalent to [`InteractiveElement::on_key_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_key_up(&mut self, listener: impl Fn(&KeyUpEvent, &mut WindowContext) + 'static) { self.key_up_listeners .push(Box::new(move |event, phase, cx| { @@ -390,9 +390,9 @@ impl Interactivity { } /// Bind the given callback to key up events during the capture phase - /// The imperative API equivalent to [`InteractiveElement::on_key_up()`] + /// The imperative API equivalent to [`InteractiveElement::on_key_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn capture_key_up(&mut self, listener: impl Fn(&KeyUpEvent, &mut WindowContext) + 'static) { self.key_up_listeners .push(Box::new(move |event, phase, cx| { @@ -403,9 +403,9 @@ impl Interactivity { } /// Bind the given callback to drop events of the given type, whether or not the drag started on this element - /// The imperative API equivalent to [`InteractiveElement::on_drop()`] + /// The imperative API equivalent to [`InteractiveElement::on_drop`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_drop(&mut self, listener: impl Fn(&T, &mut WindowContext) + 'static) { self.drop_listeners.push(( TypeId::of::(), @@ -416,15 +416,15 @@ impl Interactivity { } /// Use the given predicate to determine whether or not a drop event should be dispatched to this element - /// The imperative API equivalent to [`InteractiveElement::can_drop()`] + /// The imperative API equivalent to [`InteractiveElement::can_drop`] pub fn can_drop(&mut self, predicate: impl Fn(&dyn Any, &mut WindowContext) -> bool + 'static) { self.can_drop_predicate = Some(Box::new(predicate)); } /// Bind the given callback to click events of this element - /// The imperative API equivalent to [`InteractiveElement::on_click()`] + /// The imperative API equivalent to [`StatefulInteractiveElement::on_click`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_click(&mut self, listener: impl Fn(&ClickEvent, &mut WindowContext) + 'static) where Self: Sized, @@ -435,10 +435,10 @@ impl Interactivity { /// On drag initiation, this callback will be used to create a new view to render the dragged value for a /// drag and drop operation. This API should also be used as the equivalent of 'on drag start' with - /// the [`Self::on_drag_move()`] API - /// The imperative API equivalent to [`InteractiveElement::on_drag()`] + /// the [`Self::on_drag_move`] API + /// The imperative API equivalent to [`StatefulInteractiveElement::on_drag`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_drag( &mut self, value: T, @@ -460,9 +460,9 @@ impl Interactivity { /// Bind the given callback on the hover start and end events of this element. Note that the boolean /// passed to the callback is true when the hover starts and false when it ends. - /// The imperative API equivalent to [`InteractiveElement::on_drag()`] + /// The imperative API equivalent to [`StatefulInteractiveElement::on_drag`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. pub fn on_hover(&mut self, listener: impl Fn(&bool, &mut WindowContext) + 'static) where Self: Sized, @@ -475,7 +475,7 @@ impl Interactivity { } /// Use the given callback to construct a new tooltip view when the mouse hovers over this element. - /// The imperative API equivalent to [`InteractiveElement::tooltip()`] + /// The imperative API equivalent to [`InteractiveElement::tooltip`] pub fn tooltip(&mut self, build_tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) where Self: Sized, @@ -488,7 +488,7 @@ impl Interactivity { } /// Block the mouse from interacting with this element or any of it's children - /// The imperative API equivalent to [`InteractiveElement::block_mouse()`] + /// The imperative API equivalent to [`InteractiveElement::block_mouse`] pub fn block_mouse(&mut self) { self.block_mouse = true; } @@ -559,9 +559,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to the mouse down event for the given mouse button, - /// the fluent API equivalent to [`Interactivity::on_mouse_down()`] + /// the fluent API equivalent to [`Interactivity::on_mouse_down`] /// - /// See [`ViewContext::listener()`] to get access to the view state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to the view state from this callback. fn on_mouse_down( mut self, button: MouseButton, @@ -573,7 +573,7 @@ pub trait InteractiveElement: Sized { #[cfg(any(test, feature = "test-support"))] /// Set a key that can be used to look up this element's bounds - /// in the [`VisualTestContext::debug_bounds()`] map + /// in the [`VisualTestContext::debug_bounds`] map /// This is a noop in release builds fn debug_selector(mut self, f: impl FnOnce() -> String) -> Self { self.interactivity().debug_selector = Some(f()); @@ -582,7 +582,7 @@ pub trait InteractiveElement: Sized { #[cfg(not(any(test, feature = "test-support")))] /// Set a key that can be used to look up this element's bounds - /// in the [`VisualTestContext::debug_bounds()`] map + /// in the [`VisualTestContext::debug_bounds`] map /// This is a noop in release builds #[inline] fn debug_selector(self, _: impl FnOnce() -> String) -> Self { @@ -590,9 +590,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to the mouse down event for any button, during the capture phase - /// the fluent API equivalent to [`Interactivity::capture_any_mouse_down()`] + /// the fluent API equivalent to [`Interactivity::capture_any_mouse_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn capture_any_mouse_down( mut self, listener: impl Fn(&MouseDownEvent, &mut WindowContext) + 'static, @@ -602,9 +602,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to the mouse down event for any button, during the capture phase - /// the fluent API equivalent to [`Interactivity::on_any_mouse_down()`] + /// the fluent API equivalent to [`Interactivity::on_any_mouse_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_any_mouse_down( mut self, listener: impl Fn(&MouseDownEvent, &mut WindowContext) + 'static, @@ -614,9 +614,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to the mouse up event for the given button, during the bubble phase - /// the fluent API equivalent to [`Interactivity::on_mouse_up()`] + /// the fluent API equivalent to [`Interactivity::on_mouse_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_mouse_up( mut self, button: MouseButton, @@ -627,9 +627,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to the mouse up event for any button, during the capture phase - /// the fluent API equivalent to [`Interactivity::capture_any_mouse_up()`] + /// the fluent API equivalent to [`Interactivity::capture_any_mouse_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn capture_any_mouse_up( mut self, listener: impl Fn(&MouseUpEvent, &mut WindowContext) + 'static, @@ -640,9 +640,9 @@ pub trait InteractiveElement: Sized { /// Bind the given callback to the mouse down event, on any button, during the capture phase, /// when the mouse is outside of the bounds of this element. - /// The fluent API equivalent to [`Interactivity::on_mouse_down_out()`] + /// The fluent API equivalent to [`Interactivity::on_mouse_down_out`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_mouse_down_out( mut self, listener: impl Fn(&MouseDownEvent, &mut WindowContext) + 'static, @@ -653,9 +653,9 @@ pub trait InteractiveElement: Sized { /// Bind the given callback to the mouse up event, for the given button, during the capture phase, /// when the mouse is outside of the bounds of this element. - /// The fluent API equivalent to [`Interactivity::on_mouse_up_out()`] + /// The fluent API equivalent to [`Interactivity::on_mouse_up_out`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_mouse_up_out( mut self, button: MouseButton, @@ -666,9 +666,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to the mouse move event, during the bubble phase - /// The fluent API equivalent to [`Interactivity::on_mouse_move()`] + /// The fluent API equivalent to [`Interactivity::on_mouse_move`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_mouse_move( mut self, listener: impl Fn(&MouseMoveEvent, &mut WindowContext) + 'static, @@ -681,9 +681,9 @@ pub trait InteractiveElement: Sized { /// will be called for all move events, inside or outside of this element, as long as the /// drag was started with this element under the mouse. Useful for implementing draggable /// UIs that don't conform to a drag and drop style interaction, like resizing. - /// The fluent API equivalent to [`Interactivity::on_drag_move()`] + /// The fluent API equivalent to [`Interactivity::on_drag_move`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_drag_move( mut self, listener: impl Fn(&DragMoveEvent, &mut WindowContext) + 'static, @@ -696,9 +696,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to scroll wheel events during the bubble phase - /// The fluent API equivalent to [`Interactivity::on_scroll_wheel()`] + /// The fluent API equivalent to [`Interactivity::on_scroll_wheel`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_scroll_wheel( mut self, listener: impl Fn(&ScrollWheelEvent, &mut WindowContext) + 'static, @@ -708,9 +708,9 @@ pub trait InteractiveElement: Sized { } /// Capture the given action, before normal action dispatch can fire - /// The fluent API equivalent to [`Interactivity::on_scroll_wheel()`] + /// The fluent API equivalent to [`Interactivity::on_scroll_wheel`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn capture_action( mut self, listener: impl Fn(&A, &mut WindowContext) + 'static, @@ -720,9 +720,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to an action dispatch during the bubble phase - /// The fluent API equivalent to [`Interactivity::on_action()`] + /// The fluent API equivalent to [`Interactivity::on_action`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_action(mut self, listener: impl Fn(&A, &mut WindowContext) + 'static) -> Self { self.interactivity().on_action(listener); self @@ -731,9 +731,9 @@ pub trait InteractiveElement: Sized { /// Bind the given callback to an action dispatch, based on a dynamic action parameter /// instead of a type parameter. Useful for component libraries that want to expose /// action bindings to their users. - /// The fluent API equivalent to [`Interactivity::on_boxed_action()`] + /// The fluent API equivalent to [`Interactivity::on_boxed_action`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_boxed_action( mut self, action: &dyn Action, @@ -744,9 +744,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to key down events during the bubble phase - /// The fluent API equivalent to [`Interactivity::on_key_down()`] + /// The fluent API equivalent to [`Interactivity::on_key_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_key_down( mut self, listener: impl Fn(&KeyDownEvent, &mut WindowContext) + 'static, @@ -756,9 +756,9 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to key down events during the capture phase - /// The fluent API equivalent to [`Interactivity::capture_key_down()`] + /// The fluent API equivalent to [`Interactivity::capture_key_down`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn capture_key_down( mut self, listener: impl Fn(&KeyDownEvent, &mut WindowContext) + 'static, @@ -768,18 +768,18 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to key up events during the bubble phase - /// The fluent API equivalent to [`Interactivity::on_key_up()`] + /// The fluent API equivalent to [`Interactivity::on_key_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_key_up(mut self, listener: impl Fn(&KeyUpEvent, &mut WindowContext) + 'static) -> Self { self.interactivity().on_key_up(listener); self } /// Bind the given callback to key up events during the capture phase - /// The fluent API equivalent to [`Interactivity::capture_key_up()`] + /// The fluent API equivalent to [`Interactivity::capture_key_up`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn capture_key_up( mut self, listener: impl Fn(&KeyUpEvent, &mut WindowContext) + 'static, @@ -813,16 +813,16 @@ pub trait InteractiveElement: Sized { } /// Bind the given callback to drop events of the given type, whether or not the drag started on this element - /// The fluent API equivalent to [`Interactivity::on_drop()`] + /// The fluent API equivalent to [`Interactivity::on_drop`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_drop(mut self, listener: impl Fn(&T, &mut WindowContext) + 'static) -> Self { self.interactivity().on_drop(listener); self } /// Use the given predicate to determine whether or not a drop event should be dispatched to this element - /// The fluent API equivalent to [`Interactivity::can_drop()`] + /// The fluent API equivalent to [`Interactivity::can_drop`] fn can_drop( mut self, predicate: impl Fn(&dyn Any, &mut WindowContext) -> bool + 'static, @@ -832,7 +832,7 @@ pub trait InteractiveElement: Sized { } /// Block the mouse from interacting with this element or any of it's children - /// The fluent API equivalent to [`Interactivity::block_mouse()`] + /// The fluent API equivalent to [`Interactivity::block_mouse`] fn block_mouse(mut self) -> Self { self.interactivity().block_mouse(); self @@ -899,9 +899,9 @@ pub trait StatefulInteractiveElement: InteractiveElement { } /// Bind the given callback to click events of this element - /// The fluent API equivalent to [`Interactivity::on_click()`] + /// The fluent API equivalent to [`Interactivity::on_click`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_click(mut self, listener: impl Fn(&ClickEvent, &mut WindowContext) + 'static) -> Self where Self: Sized, @@ -912,10 +912,10 @@ pub trait StatefulInteractiveElement: InteractiveElement { /// On drag initiation, this callback will be used to create a new view to render the dragged value for a /// drag and drop operation. This API should also be used as the equivalent of 'on drag start' with - /// the [`Self::on_drag_move()`] API - /// The fluent API equivalent to [`Interactivity::on_drag()`] + /// the [`Self::on_drag_move`] API + /// The fluent API equivalent to [`Interactivity::on_drag`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_drag( mut self, value: T, @@ -932,9 +932,9 @@ pub trait StatefulInteractiveElement: InteractiveElement { /// Bind the given callback on the hover start and end events of this element. Note that the boolean /// passed to the callback is true when the hover starts and false when it ends. - /// The fluent API equivalent to [`Interactivity::on_hover()`] + /// The fluent API equivalent to [`Interactivity::on_hover`] /// - /// See [`ViewContext::listener()`] to get access to a view's state from this callback + /// See [`ViewContext::listener`](crate::ViewContext::listener) to get access to a view's state from this callback. fn on_hover(mut self, listener: impl Fn(&bool, &mut WindowContext) + 'static) -> Self where Self: Sized, @@ -944,7 +944,7 @@ pub trait StatefulInteractiveElement: InteractiveElement { } /// Use the given callback to construct a new tooltip view when the mouse hovers over this element. - /// The fluent API equivalent to [`Interactivity::tooltip()`] + /// The fluent API equivalent to [`Interactivity::tooltip`] fn tooltip(mut self, build_tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) -> Self where Self: Sized, diff --git a/crates/gpui/src/shared_string.rs b/crates/gpui/src/shared_string.rs index d196b19636f3d2ecf0c62fa6bc457c3af1087e48..8c12c1c970c279279c4476d9ecf25012b65edab8 100644 --- a/crates/gpui/src/shared_string.rs +++ b/crates/gpui/src/shared_string.rs @@ -4,7 +4,7 @@ use std::{borrow::Borrow, sync::Arc}; use util::arc_cow::ArcCow; /// A shared string is an immutable string that can be cheaply cloned in GPUI -/// tasks. Essentially an abstraction over an Arc and &'static str, +/// tasks. Essentially an abstraction over an `Arc` and `&'static str`, #[derive(Deref, DerefMut, Eq, PartialEq, Hash, Clone)] pub struct SharedString(ArcCow<'static, str>); diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index edd998c84848d8a5f63ca580f6331449e189bc60..1ae632dfdee123c88d28e5550654fc3e0e5eb1bb 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -2671,7 +2671,7 @@ impl From<(&'static str, u64)> for ElementId { } /// A rectangle to be rendered in the window at the given position and size. -/// Passed as an argument [`WindowContext::paint_quad`]. +/// Passed as an argument [`ElementContext::paint_quad`]. #[derive(Clone)] pub struct PaintQuad { bounds: Bounds, diff --git a/crates/gpui/src/window/element_cx.rs b/crates/gpui/src/window/element_cx.rs index ed74bf40601e8bcccd513792f0e964ca2f2999ff..145597b039da24f61e7206c6df0398b9d36c2641 100644 --- a/crates/gpui/src/window/element_cx.rs +++ b/crates/gpui/src/window/element_cx.rs @@ -656,7 +656,7 @@ impl<'a> ElementContext<'a> { /// Paint one or more quads into the scene for the next frame at the current stacking context. /// Quads are colored rectangular regions with an optional background, border, and corner radius. - /// see [`fill`], [`outline`], and [`quad`] to construct this type. + /// see [`fill`](crate::fill), [`outline`](crate::outline), and [`quad`](crate::quad) to construct this type. pub fn paint_quad(&mut self, quad: PaintQuad) { let scale_factor = self.scale_factor(); let content_mask = self.content_mask(); @@ -731,9 +731,11 @@ impl<'a> ElementContext<'a> { ); } - /// Paint a monochrome (non-emoji) glyph into the scene for the next frame at the current z-index. + /// Paints a monochrome (non-emoji) glyph into the scene for the next frame at the current z-index. + /// /// The y component of the origin is the baseline of the glyph. - /// You should generally prefer to use the [`ShapedLine::paint`] or [`WrappedLine::paint`] methods in the [`text_system`]. + /// You should generally prefer to use the [`ShapedLine::paint`](crate::ShapedLine::paint) or + /// [`WrappedLine::paint`](crate::WrappedLine::paint) methods in the [`TextSystem`](crate::TextSystem). /// This method is only useful if you need to paint a single glyph that has already been shaped. pub fn paint_glyph( &mut self, @@ -790,9 +792,11 @@ impl<'a> ElementContext<'a> { Ok(()) } - /// Paint an emoji glyph into the scene for the next frame at the current z-index. + /// Paints an emoji glyph into the scene for the next frame at the current z-index. + /// /// The y component of the origin is the baseline of the glyph. - /// You should generally prefer to use the [`ShapedLine::paint`] or [`WrappedLine::paint`] methods in the [`text_system`]. + /// You should generally prefer to use the [`ShapedLine::paint`](crate::ShapedLine::paint) or + /// [`WrappedLine::paint`](crate::WrappedLine::paint) methods in the [`TextSystem`](crate::TextSystem). /// This method is only useful if you need to paint a single emoji that has already been shaped. pub fn paint_emoji( &mut self, From d80959d64e7e2b13cc33e3ec6114fc568982c0fc Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 23 Jan 2024 21:29:12 -0800 Subject: [PATCH 06/27] Add module documentation to GPUI and make gpui.rs example compile --- crates/gpui/src/color.rs | 5 ++- crates/gpui/src/elements/div.rs | 7 ---- crates/gpui/src/elements/text.rs | 12 +++++++ crates/gpui/src/gpui.rs | 62 +++++++++++++++++++++++--------- 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/crates/gpui/src/color.rs b/crates/gpui/src/color.rs index dadc3d5ad301ba3cd2145215bb7909701fd9ed27..caf7cddf69a09c314096e56115de00f60be7aac5 100644 --- a/crates/gpui/src/color.rs +++ b/crates/gpui/src/color.rs @@ -3,11 +3,11 @@ use serde::de::{self, Deserialize, Deserializer, Visitor}; use std::fmt; /// Convert an RGB hex color code number to a color type -pub fn rgb>(hex: u32) -> C { +pub fn rgb(hex: u32) -> Rgba { let r = ((hex >> 16) & 0xFF) as f32 / 255.0; let g = ((hex >> 8) & 0xFF) as f32 / 255.0; let b = (hex & 0xFF) as f32 / 255.0; - Rgba { r, g, b, a: 1.0 }.into() + Rgba { r, g, b, a: 1.0 } } /// Convert an RGBA hex color code number to [`Rgba`] @@ -40,7 +40,6 @@ impl fmt::Debug for Rgba { impl Rgba { /// Create a new [`Rgba`] color by blending this and another color together - /// TODO!(docs): find the source for this algorithm pub fn blend(&self, other: Rgba) -> Self { if other.a >= 1.0 { other diff --git a/crates/gpui/src/elements/div.rs b/crates/gpui/src/elements/div.rs index 4a951fb48dddabab7ae42a22a78fa8d6354a6f5f..a0bbf6fc7948095adcc175f9cfb81ef3c1c88743 100644 --- a/crates/gpui/src/elements/div.rs +++ b/crates/gpui/src/elements/div.rs @@ -14,13 +14,6 @@ //! as several associated traits. Together, these provide the full suite of Dom-like events //! and Tailwind-like styling that you can use to build your own custom elements. Div is //! constructed by combining these two systems into an all-in-one element. -//! -//! # Capturing and bubbling -//! -//! Note that while event dispatch in GPUI uses similar names and concepts to the web -//! even API, the details are very different. See the documentation in [TODO!(docs) -//! DOCUMENT EVENT DISPATCH SOMEWHERE IN WINDOW CONTEXT] for more details -//! use crate::{ point, px, size, Action, AnyDrag, AnyElement, AnyTooltip, AnyView, AppContext, Bounds, diff --git a/crates/gpui/src/elements/text.rs b/crates/gpui/src/elements/text.rs index 13fc6200766edc068af5f23defc3d9c2e73c4214..2b5bf9166ef2182dca7cae92f93a3e7a91af5925 100644 --- a/crates/gpui/src/elements/text.rs +++ b/crates/gpui/src/elements/text.rs @@ -46,6 +46,18 @@ impl IntoElement for &'static str { } } +impl IntoElement for String { + type Element = SharedString; + + fn element_id(&self) -> Option { + None + } + + fn into_element(self) -> Self::Element { + self.into() + } +} + impl Element for SharedString { type State = TextState; diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index 8ecfd8ad6d834ac8c6577e2f724e22719e15e36e..5e5618721b97ac100365d24e48af44d6803f9e4d 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -1,30 +1,60 @@ //! # Welcome to GPUI! //! //! GPUI is a hybrid immediate and retained mode, GPU accelerated, UI framework -//! for Rust, designed to support a wide variety of applications. GPUI is currently -//! being actively developed and improved for the [Zed code editor](https://zed.dev/), and new versions -//! will have breaking changes. You'll probably need to use the latest stable version -//! of rust to use GPUI. +//! for Rust, designed to support a wide variety of applications. //! -//! # Getting started with GPUI +//! ## Getting Started //! -//! TODO!(docs): Write a code sample showing how to create a window and render a simple -//! div +//! GPUI is still in active development as we work on the Zed code editor and isn't yet on crates.io. +//! You'll also need to use the latest version of stable rust. Add the following to your Cargo.toml: //! -//! # Drawing interesting things +//! gpui = { git = "https://github.com/zed-industries/zed" } //! -//! TODO!(docs): Expand demo to show how to draw a more interesting scene, with -//! a counter to store state and a button to increment it. +//! Everything in GPUI starts with an [`App`]. You can create one with [`App::new`], and +//! kick off your application by passing a callback to [`App::run`]. Inside this callback, +//! you can create a new window with [`AppContext::open_window`], and register your first root +//! view. See [gpui.rs](https://www.gpui.rs/) for a complete example. //! -//! # Interacting with your application state +//! ## The Big Picture //! -//! TODO!(docs): Expand demo to show GPUI entity interactions, like subscriptions and entities -//! maybe make a network request to show async stuff? +//! GPUI offers three different [registers](https://en.wikipedia.org/wiki/Register_(sociolinguistics)) depending on your needs: //! -//! # Conclusion +//! - State management and communication with Models. Whenever you need to store application state +//! that communicates between different parts of your application, you'll want to use GPUI's +//! models. Models are owned by GPUI and are only accessible through an owned smart pointer +//! similar to an [`Rc`]. See the [`app::model_context`] module for more information. //! -//! TODO!(docs): Wrap up with a conclusion and links to other places? Zed / GPUI website? -//! Discord for chatting about it? Other tutorials or references? +//! - High level, declarative UI with Views. All UI in GPUI starts with a View. A view is simply +//! a model that can be rendered, via the [`Render`] trait. At the start of each frame, GPUI +//! will call this render method on the root view of a given window. Views build a tree of +//! `elements`, lay them out and style them with a tailwind-style API, and then give them to +//! GPUI to turn into pixels. See the [`div`] element for an all purpose swiss-army knife of +//! rendering. +//! +//! - Low level, imperative UI with Elements. Elements are the building blocks of UI in GPUI, and they +//! provide a nice wrapper around an imperative API that provides as much flexibility and control as +//! you need. Elements have total control over how they and their child elements are rendered and and +//! can be used for making efficient views into large lists, implement custom layouting for a code editor, +//! and anything else you can think of. See the [`element`] module for more information. +//! +//! Each of these registers has one or more corresponding contexts that can be accessed from all GPUI services. +//! This context is your main interface to GPUI, and is used extensively throughout the framework. +//! +//! ## Other Resources +//! +//! In addition to the systems above, GPUI provides a range of smaller services that are useful for building +//! complex applications: +//! +//! - Actions are user-defined structs that are used for converting keystrokes into logical operations in your UI. +//! Use this for implementing keyboard shortcuts, such as cmd-q. See the [`action`] module for more information. +//! - Platform services, such as `quit the app` or `open a URL` are available as methods on the [`app::AppContext`]. +//! - An async executor that is integrated with the platform's event loop. See the [`executor`] module for more information., +//! - The [gpui::test] macro provides a convenient way to write tests for your GPUI applications. Tests also have their +//! own kind of context, a [`TestAppContext`] which provides ways of simulating common platform input. See [`app::test_context`] +//! and [`test`] modules for more details. +//! +//! Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack. +//! We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). #![deny(missing_docs)] #![allow(clippy::type_complexity)] From 4e085b2052eb24d050bab3281a5e78e7ddce2ed6 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 23 Jan 2024 22:30:34 -0700 Subject: [PATCH 07/27] Show hovered cursors less flickerily --- crates/editor/src/editor.rs | 8 +++++--- crates/editor/src/element.rs | 25 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index b8c152ae4043f2e9bdfa8a935573b48531d251c4..9dd41fa25d5cbf650b4fd36a6462f3978bfdffbe 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -126,6 +126,7 @@ const MAX_LINE_LEN: usize = 1024; const MIN_NAVIGATION_HISTORY_ROW_DELTA: i64 = 10; const MAX_SELECTION_HISTORY_LEN: usize = 1024; const COPILOT_DEBOUNCE_TIMEOUT: Duration = Duration::from_millis(75); +pub(crate) const CURSORS_VISIBLE_FOR: Duration = Duration::from_millis(2000); #[doc(hidden)] pub const CODE_ACTIONS_DEBOUNCE_TIMEOUT: Duration = Duration::from_millis(250); #[doc(hidden)] @@ -369,7 +370,7 @@ pub struct Editor { collaboration_hub: Option>, blink_manager: Model, show_cursor_names: bool, - hovered_cursor: Option, + hovered_cursors: HashMap>, pub show_local_selections: bool, mode: EditorMode, show_gutter: bool, @@ -463,6 +464,7 @@ enum SelectionHistoryMode { Redoing, } +#[derive(Clone, PartialEq, Eq, Hash)] struct HoveredCursor { replica_id: u16, selection_id: usize, @@ -1440,7 +1442,7 @@ impl Editor { gutter_width: Default::default(), style: None, show_cursor_names: false, - hovered_cursor: Default::default(), + hovered_cursors: Default::default(), editor_actions: Default::default(), show_copilot_suggestions: mode == EditorMode::Full, _subscriptions: vec![ @@ -3741,7 +3743,7 @@ impl Editor { self.show_cursor_names = true; cx.notify(); cx.spawn(|this, mut cx| async move { - cx.background_executor().timer(Duration::from_secs(3)).await; + cx.background_executor().timer(CURSORS_VISIBLE_FOR).await; this.update(&mut cx, |this, cx| { this.show_cursor_names = false; cx.notify() diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index dadcc62842360b1be401a2b0900b5a1a1d824dc8..65d2e06d350477b140e2a807686ce5697f8ee869 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -17,8 +17,8 @@ use crate::{ mouse_context_menu, scroll::scroll_amount::ScrollAmount, CursorShape, DisplayPoint, Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle, - HalfPageDown, HalfPageUp, LineDown, LineUp, OpenExcerpts, PageDown, PageUp, Point, SelectPhase, - Selection, SoftWrap, ToPoint, MAX_LINE_LEN, + HalfPageDown, HalfPageUp, HoveredCursor, LineDown, LineUp, OpenExcerpts, PageDown, PageUp, + Point, SelectPhase, Selection, SoftWrap, ToPoint, CURSORS_VISIBLE_FOR, MAX_LINE_LEN, }; use anyhow::Result; use collections::{BTreeMap, HashMap}; @@ -612,13 +612,24 @@ impl EditorElement { .anchor_at(range.end.to_point(&snapshot.display_snapshot), Bias::Right); let Some(selection) = snapshot.remote_selections_in_range(&range, hub, cx).next() else { - editor.hovered_cursor.take(); return; }; - editor.hovered_cursor.replace(crate::HoveredCursor { + let key = crate::HoveredCursor { replica_id: selection.replica_id, selection_id: selection.selection.id, - }); + }; + editor.hovered_cursors.insert( + key.clone(), + cx.spawn(|editor, mut cx| async move { + cx.background_executor().timer(CURSORS_VISIBLE_FOR).await; + editor + .update(&mut cx, |editor, cx| { + editor.hovered_cursors.remove(&key); + cx.notify(); + }) + .ok(); + }), + ); cx.notify() } @@ -1986,7 +1997,9 @@ impl EditorElement { if Some(selection.peer_id) == editor.leader_peer_id { continue; } - let is_shown = editor.show_cursor_names || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id); + let key = HoveredCursor{replica_id: selection.replica_id, selection_id: selection.selection.id}; + + let is_shown = editor.show_cursor_names || editor.hovered_cursors.contains_key(&key); remote_selections .entry(selection.replica_id) From 1d6390254dc93cb535484892f66a5f6bd65bc707 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Wed, 24 Jan 2024 00:34:26 -0500 Subject: [PATCH 08/27] Update JetBrains keymap --- assets/keymaps/jetbrains.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/assets/keymaps/jetbrains.json b/assets/keymaps/jetbrains.json index b2ed144a3f364822fd5e0375a75e07bb50d0ab20..6be7289d8aeefc4dd837a90adfb576d3006efb16 100644 --- a/assets/keymaps/jetbrains.json +++ b/assets/keymaps/jetbrains.json @@ -79,5 +79,11 @@ "cmd-1": "workspace::ToggleLeftDock", "cmd-6": "diagnostics::Deploy" } + }, + { + "context": "ProjectPanel", + "bindings": { + "enter": "project_panel::Open" + } } ] From ce7cd5a077e4cadedae6e3c889035a61566539cf Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 23 Jan 2024 21:35:01 -0800 Subject: [PATCH 09/27] Copy GPUI documentation to README --- crates/gpui/README.md | 42 +++++++++++++++++++++++++++++++++++++++-- crates/gpui/src/gpui.rs | 9 ++++++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/crates/gpui/README.md b/crates/gpui/README.md index e145946024d0a7a2c84eb1ce3a2d2129ab0ee591..cb275eb9445c541d684e1bb35d0a1cf710a36e8c 100644 --- a/crates/gpui/README.md +++ b/crates/gpui/README.md @@ -1,3 +1,41 @@ -# GPUI +# Welcome to GPUI! + +GPUI is a hybrid immediate and retained mode, GPU accelerated, UI framework +for Rust, designed to support a wide variety of applications. + +## Getting Started + +GPUI is still in active development as we work on the Zed code editor and isn't yet on crates.io. You'll also need to use the latest version of stable rust and be on macOS. Add the following to your Cargo.toml: + +``` +gpui = { git = "https://github.com/zed-industries/zed" } +``` + +Everything in GPUI starts with an `App`. You can create one with `App::new()`, and kick off your application by passing a callback to `App::run()`. Inside this callback, you can create a new window with `AppContext::open_window()`, and register your first root view. See [gpui.rs](https://www.gpui.rs/) for a complete example. + +## The Big Picture + +GPUI offers three different registers(https://en.wikipedia.org/wiki/Register_(sociolinguistics)) depending on your needs: + +- State management and communication with Models. Whenever you need to store application state that communicates between different parts of your application, you'll want to use GPUI's models. Models are owned by GPUI and are only accessible through an owned smart pointer similar to an `Rc`. See the `app::model_context` module for more information. + +- High level, declarative UI with Views. All UI in GPUI starts with a View. A view is simply a model that can be rendered, via the `Render` trait. At the start of each frame, GPUI will call this render method on the root view of a given window. Views build a tree of `elements`, lay them out and style them with a tailwind-style API, and then give them to GPUI to turn into pixels. See the `div` element for an all purpose swiss-army knife of rendering. + +- Low level, imperative UI with Elements. Elements are the building blocks of UI in GPUI, and they provide a nice wrapper around an imperative API that provides as much flexibility and control as you need. Elements have total control over how they and their child elements are rendered and and can be used for making efficient views into large lists, implement custom layouting for a code editor, and anything else you can think of. See the `element` module for more information. + +Each of these registers has one or more corresponding contexts that can be accessed from all GPUI services. This context is your main interface to GPUI, and is used extensively throughout the framework. + +## Other Resources + +In addition to the systems above, GPUI provides a range of smaller services that are useful for building complex applications: + +- Actions are user-defined structs that are used for converting keystrokes into logical operations in your UI. Use this for implementing keyboard shortcuts, such as cmd-q. See the `action` module for more information. + +- Platform services, such as `quit the app` or `open a URL` are available as methods on the `app::AppContext`. + +- An async executor that is integrated with the platform's event loop. See the `executor` module for more information., + +- The `[gpui::test]` macro provides a convenient way to write tests for your GPUI applications. Tests also have their own kind of context, a `TestAppContext` which provides ways of simulating common platform input. See `app::test_context` and `test` modules for more details. + +Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack. We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). -A fast, productive UI framework from the creators of [https://zed.dev]. diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index 5e5618721b97ac100365d24e48af44d6803f9e4d..f821ba34ef735ce3e867791953c909313742c47c 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -6,9 +6,12 @@ //! ## Getting Started //! //! GPUI is still in active development as we work on the Zed code editor and isn't yet on crates.io. -//! You'll also need to use the latest version of stable rust. Add the following to your Cargo.toml: +//! You'll also need to use the latest version of stable rust and be on macOS. Add the following to your +//! Cargo.toml: //! +//! ``` //! gpui = { git = "https://github.com/zed-industries/zed" } +//! ``` //! //! Everything in GPUI starts with an [`App`]. You can create one with [`App::new`], and //! kick off your application by passing a callback to [`App::run`]. Inside this callback, @@ -28,8 +31,8 @@ //! a model that can be rendered, via the [`Render`] trait. At the start of each frame, GPUI //! will call this render method on the root view of a given window. Views build a tree of //! `elements`, lay them out and style them with a tailwind-style API, and then give them to -//! GPUI to turn into pixels. See the [`div`] element for an all purpose swiss-army knife of -//! rendering. +//! GPUI to turn into pixels. See the [`elements::Div`] element for an all purpose swiss-army +//! knife for UI. //! //! - Low level, imperative UI with Elements. Elements are the building blocks of UI in GPUI, and they //! provide a nice wrapper around an imperative API that provides as much flexibility and control as From 1facc9fc116e3aeeacfb7ce2b3ef252eb79554cc Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 23 Jan 2024 21:38:16 -0800 Subject: [PATCH 10/27] Fix test error --- crates/theme/src/styles/colors.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/theme/src/styles/colors.rs b/crates/theme/src/styles/colors.rs index a01e73f5ef3e47820c2aa58ae07db842584e3767..b830d19fee1faeaa6ce01b79850a72277a309a01 100644 --- a/crates/theme/src/styles/colors.rs +++ b/crates/theme/src/styles/colors.rs @@ -261,7 +261,7 @@ mod tests { fn override_a_single_theme_color() { let mut colors = ThemeColors::light(); - let magenta: Hsla = gpui::rgb(0xff00ff); + let magenta: Hsla = gpui::rgb(0xff00ff).into(); assert_ne!(colors.text, magenta); @@ -279,8 +279,8 @@ mod tests { fn override_multiple_theme_colors() { let mut colors = ThemeColors::light(); - let magenta: Hsla = gpui::rgb(0xff00ff); - let green: Hsla = gpui::rgb(0x00ff00); + let magenta: Hsla = gpui::rgb(0xff00ff).into(); + let green: Hsla = gpui::rgb(0x00ff00).into(); assert_ne!(colors.text, magenta); assert_ne!(colors.background, green); @@ -305,7 +305,7 @@ mod tests { })) .unwrap(); - assert_eq!(colors.background, Some(gpui::rgb(0xff00ff))); - assert_eq!(colors.text, Some(gpui::rgb(0xff0000))); + assert_eq!(colors.background, Some(gpui::rgb(0xff00ff).into())); + assert_eq!(colors.text, Some(gpui::rgb(0xff0000).into())); } } From fa6acc385f619371c4d8c0faad86ce77094aa44a Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 23 Jan 2024 21:41:06 -0800 Subject: [PATCH 11/27] Add note about discord --- crates/gpui/README.md | 2 +- crates/gpui/src/gpui.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/gpui/README.md b/crates/gpui/README.md index cb275eb9445c541d684e1bb35d0a1cf710a36e8c..1ced6979863c2244e93cbde526dacc30dc563afe 100644 --- a/crates/gpui/README.md +++ b/crates/gpui/README.md @@ -37,5 +37,5 @@ In addition to the systems above, GPUI provides a range of smaller services that - The `[gpui::test]` macro provides a convenient way to write tests for your GPUI applications. Tests also have their own kind of context, a `TestAppContext` which provides ways of simulating common platform input. See `app::test_context` and `test` modules for more details. -Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack. We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). +Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack or in the [Zed Discord](https://discord.gg/U4qhCEhMXP). We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index f821ba34ef735ce3e867791953c909313742c47c..4a1cf4119328c581b5263d3b05896a760cc07d61 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -56,7 +56,7 @@ //! own kind of context, a [`TestAppContext`] which provides ways of simulating common platform input. See [`app::test_context`] //! and [`test`] modules for more details. //! -//! Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack. +//! Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack or in the [Zed Discord](https://discord.gg/U4qhCEhMXP). //! We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). #![deny(missing_docs)] From ce0ff819f915531d16a319845fd5e01b54062087 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 23 Jan 2024 21:47:44 -0800 Subject: [PATCH 12/27] Fix more tests --- crates/gpui/README.md | 3 +-- crates/gpui/src/gpui.rs | 5 +++-- crates/storybook/src/stories/z_index.rs | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/gpui/README.md b/crates/gpui/README.md index 1ced6979863c2244e93cbde526dacc30dc563afe..9b087a9752a05586b97a67962b20e86c953672ec 100644 --- a/crates/gpui/README.md +++ b/crates/gpui/README.md @@ -37,5 +37,4 @@ In addition to the systems above, GPUI provides a range of smaller services that - The `[gpui::test]` macro provides a convenient way to write tests for your GPUI applications. Tests also have their own kind of context, a `TestAppContext` which provides ways of simulating common platform input. See `app::test_context` and `test` modules for more details. -Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack or in the [Zed Discord](https://discord.gg/U4qhCEhMXP). We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). - +Currently, the best way to learn about these APIs is to read the Zed source code, ask us about it at a fireside hack, or drop a question in the [Zed Discord](https://discord.gg/U4qhCEhMXP). We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index 4a1cf4119328c581b5263d3b05896a760cc07d61..638e94de3969360f94b5594f06e45710cace1495 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -56,8 +56,9 @@ //! own kind of context, a [`TestAppContext`] which provides ways of simulating common platform input. See [`app::test_context`] //! and [`test`] modules for more details. //! -//! Currently, the best way to learn about these APIs is to read the Zed source code or to ask us about it at a fireside hack or in the [Zed Discord](https://discord.gg/U4qhCEhMXP). -//! We're working on improving the documentation, creating more examples, and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). +//! Currently, the best way to learn about these APIs is to read the Zed source code, ask us about it at a fireside hack, or drop +//! a question in the [Zed Discord](https://discord.gg/U4qhCEhMXP). We're working on improving the documentation, creating more examples, +//! and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). #![deny(missing_docs)] #![allow(clippy::type_complexity)] diff --git a/crates/storybook/src/stories/z_index.rs b/crates/storybook/src/stories/z_index.rs index 63ee1af7591ee8a62f07f052b320db8a70077b9d..e32e39a2d1d96c078eeada0c4e1be616ae4408ac 100644 --- a/crates/storybook/src/stories/z_index.rs +++ b/crates/storybook/src/stories/z_index.rs @@ -1,4 +1,4 @@ -use gpui::{px, rgb, Div, Hsla, IntoElement, Render, RenderOnce}; +use gpui::{px, rgb, Div, IntoElement, Render, RenderOnce}; use story::Story; use ui::prelude::*; @@ -51,22 +51,22 @@ trait Styles: Styled + Sized { self.absolute() .w(px(150.)) .h(px(50.)) - .text_color(rgb::(0x000000)) + .text_color(rgb(0x000000)) } fn blue(self) -> Self { - self.bg(rgb::(0xe5e8fc)) + self.bg(rgb(0xe5e8fc)) .border_5() - .border_color(rgb::(0x112382)) + .border_color(rgb(0x112382)) .line_height(px(55.)) // HACK: Simulate `text-align: center`. .pl(px(24.)) } fn red(self) -> Self { - self.bg(rgb::(0xfce5e7)) + self.bg(rgb(0xfce5e7)) .border_5() - .border_color(rgb::(0xe3a1a7)) + .border_color(rgb(0xe3a1a7)) // HACK: Simulate `text-align: center`. .pl(px(8.)) } @@ -92,10 +92,10 @@ impl RenderOnce for ZIndexExample { .left(px(15.)) .w(px(180.)) .h(px(230.)) - .bg(rgb::(0xfcfbe5)) - .text_color(rgb::(0x000000)) + .bg(rgb(0xfcfbe5)) + .text_color(rgb(0x000000)) .border_5() - .border_color(rgb::(0xe3e0a1)) + .border_color(rgb(0xe3e0a1)) .line_height(px(215.)) // HACK: Simulate `text-align: center`. .pl(px(24.)) From b640e0e7afe4edfeaad09d03ea4d0c532288f504 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 24 Jan 2024 10:14:26 +0100 Subject: [PATCH 13/27] Increase capacity of element arena to 8MB This fixes a panic we just saw on nightly. It's the first time we see this panic, so I think it's pretty safe to assume having twice as much capacity will fix it. --- crates/gpui/src/window.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 1ae632dfdee123c88d28e5550654fc3e0e5eb1bb..1bf072045963fc9eef25756edacefce701ed1c51 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -106,7 +106,7 @@ slotmap::new_key_type! { } thread_local! { - pub(crate) static ELEMENT_ARENA: RefCell = RefCell::new(Arena::new(4 * 1024 * 1024)); + pub(crate) static ELEMENT_ARENA: RefCell = RefCell::new(Arena::new(8 * 1024 * 1024)); } impl FocusId { From 4800991f28b220f07d30be12c040aeb11356e321 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Wed, 24 Jan 2024 10:38:38 +0100 Subject: [PATCH 14/27] Cache font-missing result to avoid unnecessary lookups This fixes the performance problem we saw in https://github.com/zed-industries/community/issues/2405. In a trace we could see that if a font is missing we'd constantly look it up and never cache that it's missing. This changes that and does cache the font-is-missing result. Drawback is that one would need to restart Zed after installing a missing font that was configured in settings. That seems acceptable for now, though. Co-authored-by: Antonio --- crates/gpui/src/text_system.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/crates/gpui/src/text_system.rs b/crates/gpui/src/text_system.rs index 6cc56e306b3e0d19f11ea4d8fe72a4bee18c3daa..15042cbf596c99b4707cc6d4e787aad5f0072765 100644 --- a/crates/gpui/src/text_system.rs +++ b/crates/gpui/src/text_system.rs @@ -41,7 +41,7 @@ pub(crate) const SUBPIXEL_VARIANTS: u8 = 4; pub struct TextSystem { line_layout_cache: Arc, platform_text_system: Arc, - font_ids_by_font: RwLock>, + font_ids_by_font: RwLock>>, font_metrics: RwLock>, raster_bounds: RwLock>>, wrapper_pool: Mutex>>, @@ -91,13 +91,26 @@ impl TextSystem { /// Get the FontId for the configure font family and style. pub fn font_id(&self, font: &Font) -> Result { - let font_id = self.font_ids_by_font.read().get(font).copied(); + fn clone_font_id_result(font_id: &Result) -> Result { + match font_id { + Ok(font_id) => Ok(*font_id), + Err(err) => Err(anyhow!("{}", err)), + } + } + + let font_id = self + .font_ids_by_font + .read() + .get(font) + .map(clone_font_id_result); if let Some(font_id) = font_id { - Ok(font_id) + font_id } else { - let font_id = self.platform_text_system.font_id(font)?; - self.font_ids_by_font.write().insert(font.clone(), font_id); - Ok(font_id) + let font_id = self.platform_text_system.font_id(font); + self.font_ids_by_font + .write() + .insert(font.clone(), clone_font_id_result(&font_id)); + font_id } } From 18f5752f0473b3542989e57cfb427dcee38a5e02 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Wed, 24 Jan 2024 11:03:28 +0100 Subject: [PATCH 15/27] Log if element arena allocation is >80% We recently doubled the size of the `ELEMENT_ARENA` after someone ran into a panic due to the arena running out of space. This adds some logging so that we can hopefully develop a better understanding of when the element area's allocation is elevated. Co-authored-by: Antonio --- crates/gpui/src/arena.rs | 8 ++++++++ crates/gpui/src/window.rs | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/crates/gpui/src/arena.rs b/crates/gpui/src/arena.rs index b3d7f9b0ecf530a2dbe2c8f9d4dd286ac971a2d9..4ddeaaff65eb6247595fd15a263a985a01d2ae23 100644 --- a/crates/gpui/src/arena.rs +++ b/crates/gpui/src/arena.rs @@ -44,6 +44,14 @@ impl Arena { } } + pub fn len(&self) -> usize { + self.offset as usize - self.start as usize + } + + pub fn capacity(&self) -> usize { + self.end as usize - self.start as usize + } + pub fn clear(&mut self) { self.valid.set(false); self.valid = Rc::new(Cell::new(true)); diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 1bf072045963fc9eef25756edacefce701ed1c51..4f49b4a71656cda57e7a8978d55a731d5bd064b6 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -1031,7 +1031,13 @@ impl<'a> WindowContext<'a> { self.window .next_frame .finish(&mut self.window.rendered_frame); - ELEMENT_ARENA.with_borrow_mut(|element_arena| element_arena.clear()); + ELEMENT_ARENA.with_borrow_mut(|element_arena| { + let percentage = (element_arena.len() as f32 / element_arena.capacity() as f32) * 100.; + if percentage >= 80. { + log::warn!("elevated element arena occupation: {}.", percentage); + } + element_arena.clear(); + }); let previous_focus_path = self.window.rendered_frame.focus_path(); let previous_window_active = self.window.rendered_frame.window_active; From 027f425804cbe0e7bd6f90ce36c5886fec4ae2c3 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Wed, 24 Jan 2024 11:47:59 +0100 Subject: [PATCH 16/27] Fix tab bar button's focus handling lagging behind This fixes https://github.com/zed-industries/community/issues/2442 for me. Previously, the tab bar buttons would stay when the chat panel was opened (and received focus) until something else was drawn (or caused a render?) With this change, the tab bar buttons are only shown if the pane was focus. I'm not sure about the side-effects of this, but the toolbar still seems to work fine. --- crates/workspace/src/pane.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 10209f6e880b3ac99e7a6e88855713f25ba7ab09..cc7eeb1a8a3f7ff1542988b36b21903dab30665f 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -1470,7 +1470,7 @@ impl Pane { ), ) }) - .when(self.was_focused || self.has_focus(cx), |tab_bar| { + .when(self.has_focus(cx), |tab_bar| { tab_bar.end_child({ let render_tab_buttons = self.render_tab_bar_buttons.clone(); render_tab_buttons(self, cx) From e4604ebedfdb537f4b843c92d17d8c99f257a655 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 23 Jan 2024 19:34:10 +0100 Subject: [PATCH 17/27] Parallelize deserialization of pane items on startup Co-Authored-By: Mikayla Maki --- crates/workspace/src/persistence/model.rs | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/crates/workspace/src/persistence/model.rs b/crates/workspace/src/persistence/model.rs index c75ea2f52f41037f13bd6241825bb9a261e36953..73ae0f9b7e877b0bc49b26238fdb5156563d6338 100644 --- a/crates/workspace/src/persistence/model.rs +++ b/crates/workspace/src/persistence/model.rs @@ -233,24 +233,28 @@ impl SerializedPane { workspace: WeakView, cx: &mut AsyncWindowContext, ) -> Result>>> { - let mut items = Vec::new(); + let mut item_tasks = Vec::new(); let mut active_item_index = None; for (index, item) in self.children.iter().enumerate() { let project = project.clone(); - let item_handle = pane - .update(cx, |_, cx| { - if let Some(deserializer) = cx.global::().get(&item.kind) { - deserializer(project, workspace.clone(), workspace_id, item.item_id, cx) - } else { - Task::ready(Err(anyhow::anyhow!( - "Deserializer does not exist for item kind: {}", - item.kind - ))) - } - })? - .await - .log_err(); + item_tasks.push(pane.update(cx, |_, cx| { + if let Some(deserializer) = cx.global::().get(&item.kind) { + deserializer(project, workspace.clone(), workspace_id, item.item_id, cx) + } else { + Task::ready(Err(anyhow::anyhow!( + "Deserializer does not exist for item kind: {}", + item.kind + ))) + } + })?); + if item.active { + active_item_index = Some(index); + } + } + let mut items = Vec::new(); + for item_handle in futures::future::join_all(item_tasks).await { + let item_handle = item_handle.log_err(); items.push(item_handle.clone()); if let Some(item_handle) = item_handle { @@ -258,10 +262,6 @@ impl SerializedPane { pane.add_item(item_handle.clone(), true, true, None, cx); })?; } - - if item.active { - active_item_index = Some(index); - } } if let Some(active_item_index) = active_item_index { From e3157f7212f2f19b775d397e08c146a8addff4ef Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 24 Jan 2024 13:05:55 +0100 Subject: [PATCH 18/27] Remove unused font --- assets/fonts/plex/IBMPlexSans-Bold.ttf | Bin 193120 -> 0 bytes assets/fonts/plex/IBMPlexSans-Italic.ttf | Bin 202128 -> 0 bytes assets/fonts/plex/IBMPlexSans-Regular.ttf | Bin 192980 -> 0 bytes assets/fonts/plex/LICENSE.txt | 93 ---------------------- crates/zed/src/zed.rs | 5 -- 5 files changed, 98 deletions(-) delete mode 100644 assets/fonts/plex/IBMPlexSans-Bold.ttf delete mode 100644 assets/fonts/plex/IBMPlexSans-Italic.ttf delete mode 100644 assets/fonts/plex/IBMPlexSans-Regular.ttf delete mode 100644 assets/fonts/plex/LICENSE.txt diff --git a/assets/fonts/plex/IBMPlexSans-Bold.ttf b/assets/fonts/plex/IBMPlexSans-Bold.ttf deleted file mode 100644 index 72b190a849c9c275b44de7466c5bbd101e4e0403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193120 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 diff --git a/assets/fonts/plex/IBMPlexSans-Italic.ttf b/assets/fonts/plex/IBMPlexSans-Italic.ttf deleted file mode 100644 index a997a20562517421ed0b19885bca198a86f9597c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202128 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

9TLSh;J=v5J5YtI_%z-TEL}?!jkpVnj95 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 Q*dYhwGq(Ls8MpKQ0qZt9BLDyZ diff --git a/assets/fonts/plex/LICENSE.txt b/assets/fonts/plex/LICENSE.txt deleted file mode 100644 index c35c4c618fab33da8695177b3a6cefe0810b7b28..0000000000000000000000000000000000000000 --- a/assets/fonts/plex/LICENSE.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" - -This Font Software is licensed under the SIL Open Font License, Version 1.1. - -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index b94881d1b06c7a9d9c9f3ced83c2d09b77a3bbd0..3c714ad5da131da46054703e992d071ab96dc1bb 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -2705,11 +2705,6 @@ mod tests { .unwrap() .to_vec() .into(), - Assets - .load("fonts/plex/IBMPlexSans-Regular.ttf") - .unwrap() - .to_vec() - .into(), ]) .unwrap(); let themes = ThemeRegistry::default(); From 92b0184036976d74e2d7f17a9206ccb50db278e4 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 24 Jan 2024 13:15:31 +0100 Subject: [PATCH 19/27] Load images in the background --- crates/gpui/src/elements/img.rs | 2 +- crates/gpui/src/image_cache.rs | 75 ++++++++++++++++----------------- 2 files changed, 37 insertions(+), 40 deletions(-) diff --git a/crates/gpui/src/elements/img.rs b/crates/gpui/src/elements/img.rs index 191cadf2939834eb68c4b70abf18b92c8bdc6ff8..e7377373fe18cd7d6d26a610c2d5b776e02874fc 100644 --- a/crates/gpui/src/elements/img.rs +++ b/crates/gpui/src/elements/img.rs @@ -104,7 +104,7 @@ impl Element for Img { cx.with_z_index(1, |cx| { match source { ImageSource::Uri(uri) => { - let image_future = cx.image_cache.get(uri.clone()); + let image_future = cx.image_cache.get(uri.clone(), cx); if let Some(data) = image_future .clone() .now_or_never() diff --git a/crates/gpui/src/image_cache.rs b/crates/gpui/src/image_cache.rs index dd7b7b571e43c20609e6920f0da59093b5aa010f..95b41c3b2c0619c24deb4207e41b01d23e615b21 100644 --- a/crates/gpui/src/image_cache.rs +++ b/crates/gpui/src/image_cache.rs @@ -1,9 +1,6 @@ -use crate::{ImageData, ImageId, SharedUrl}; +use crate::{AppContext, ImageData, ImageId, SharedUrl, Task}; use collections::HashMap; -use futures::{ - future::{BoxFuture, Shared}, - AsyncReadExt, FutureExt, TryFutureExt, -}; +use futures::{future::Shared, AsyncReadExt, FutureExt, TryFutureExt}; use image::ImageError; use parking_lot::Mutex; use std::sync::Arc; @@ -44,10 +41,10 @@ impl From for Error { pub(crate) struct ImageCache { client: Arc, - images: Arc>>, + images: Arc>>, } -type FetchImageFuture = Shared, Error>>>; +type FetchImageTask = Shared, Error>>>; impl ImageCache { pub fn new(client: Arc) -> Self { @@ -57,10 +54,7 @@ impl ImageCache { } } - pub fn get( - &self, - uri: impl Into, - ) -> Shared, Error>>> { + pub fn get(&self, uri: impl Into, cx: &AppContext) -> FetchImageTask { let uri = uri.into(); let mut images = self.images.lock(); @@ -68,36 +62,39 @@ impl ImageCache { Some(future) => future.clone(), None => { let client = self.client.clone(); - let future = { - let uri = uri.clone(); - async move { - let mut response = client.get(uri.as_ref(), ().into(), true).await?; - let mut body = Vec::new(); - response.body_mut().read_to_end(&mut body).await?; + let future = cx + .background_executor() + .spawn( + { + let uri = uri.clone(); + async move { + let mut response = + client.get(uri.as_ref(), ().into(), true).await?; + let mut body = Vec::new(); + response.body_mut().read_to_end(&mut body).await?; - if !response.status().is_success() { - return Err(Error::BadStatus { - status: response.status(), - body: String::from_utf8_lossy(&body).into_owned(), - }); - } - - let format = image::guess_format(&body)?; - let image = - image::load_from_memory_with_format(&body, format)?.into_bgra8(); - Ok(Arc::new(ImageData::new(image))) - } - } - .map_err({ - let uri = uri.clone(); + if !response.status().is_success() { + return Err(Error::BadStatus { + status: response.status(), + body: String::from_utf8_lossy(&body).into_owned(), + }); + } - move |error| { - log::log!(log::Level::Error, "{:?} {:?}", &uri, &error); - error - } - }) - .boxed() - .shared(); + let format = image::guess_format(&body)?; + let image = image::load_from_memory_with_format(&body, format)? + .into_bgra8(); + Ok(Arc::new(ImageData::new(image))) + } + } + .map_err({ + let uri = uri.clone(); + move |error| { + log::log!(log::Level::Error, "{:?} {:?}", &uri, &error); + error + } + }), + ) + .shared(); images.insert(uri, future.clone()); future From 22046ef9a7f3129abdb9b3328e24fbf05fefdfaf Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 24 Jan 2024 13:36:44 +0100 Subject: [PATCH 20/27] Load language models in the background --- crates/ai/src/providers/open_ai/completion.rs | 6 +- crates/ai/src/providers/open_ai/embedding.rs | 7 +- crates/assistant/src/assistant_panel.rs | 134 ++++++++++-------- crates/semantic_index/src/semantic_index.rs | 7 +- 4 files changed, 84 insertions(+), 70 deletions(-) diff --git a/crates/ai/src/providers/open_ai/completion.rs b/crates/ai/src/providers/open_ai/completion.rs index 0e325ee62489b41fb599a75b7b64efcbe864d269..fda4d6981667e68f7da01d258cfef5079113955f 100644 --- a/crates/ai/src/providers/open_ai/completion.rs +++ b/crates/ai/src/providers/open_ai/completion.rs @@ -201,8 +201,10 @@ pub struct OpenAICompletionProvider { } impl OpenAICompletionProvider { - pub fn new(model_name: &str, executor: BackgroundExecutor) -> Self { - let model = OpenAILanguageModel::load(model_name); + pub async fn new(model_name: String, executor: BackgroundExecutor) -> Self { + let model = executor + .spawn(async move { OpenAILanguageModel::load(&model_name) }) + .await; let credential = Arc::new(RwLock::new(ProviderCredential::NoCredentials)); Self { model, diff --git a/crates/ai/src/providers/open_ai/embedding.rs b/crates/ai/src/providers/open_ai/embedding.rs index 0a9b6ba969c7c519d337ae27db45af12252efa0b..1dca571733325f52448cd8c4399445f977d11727 100644 --- a/crates/ai/src/providers/open_ai/embedding.rs +++ b/crates/ai/src/providers/open_ai/embedding.rs @@ -67,11 +67,14 @@ struct OpenAIEmbeddingUsage { } impl OpenAIEmbeddingProvider { - pub fn new(client: Arc, executor: BackgroundExecutor) -> Self { + pub async fn new(client: Arc, executor: BackgroundExecutor) -> Self { let (rate_limit_count_tx, rate_limit_count_rx) = watch::channel_with(None); let rate_limit_count_tx = Arc::new(Mutex::new(rate_limit_count_tx)); - let model = OpenAILanguageModel::load("text-embedding-ada-002"); + // Loading the model is expensive, so ensure this runs off the main thread. + let model = executor + .spawn(async move { OpenAILanguageModel::load("text-embedding-ada-002") }) + .await; let credential = Arc::new(RwLock::new(ProviderCredential::NoCredentials)); OpenAIEmbeddingProvider { diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs index 1f57e52032b1e4e76f7297f577d4db82cf970eb3..097c6424d7cefe0738feb135d0e242ffac963639 100644 --- a/crates/assistant/src/assistant_panel.rs +++ b/crates/assistant/src/assistant_panel.rs @@ -31,9 +31,9 @@ use fs::Fs; use futures::StreamExt; use gpui::{ canvas, div, point, relative, rems, uniform_list, Action, AnyElement, AppContext, - AsyncWindowContext, AvailableSpace, ClipboardItem, Context, EventEmitter, FocusHandle, - FocusableView, FontStyle, FontWeight, HighlightStyle, InteractiveElement, IntoElement, Model, - ModelContext, ParentElement, Pixels, PromptLevel, Render, SharedString, + AsyncAppContext, AsyncWindowContext, AvailableSpace, ClipboardItem, Context, EventEmitter, + FocusHandle, FocusableView, FontStyle, FontWeight, HighlightStyle, InteractiveElement, + IntoElement, Model, ModelContext, ParentElement, Pixels, PromptLevel, Render, SharedString, StatefulInteractiveElement, Styled, Subscription, Task, TextStyle, UniformListScrollHandle, View, ViewContext, VisualContext, WeakModel, WeakView, WhiteSpace, WindowContext, }; @@ -123,6 +123,10 @@ impl AssistantPanel { .await .log_err() .unwrap_or_default(); + // Defaulting currently to GPT4, allow for this to be set via config. + let completion_provider = + OpenAICompletionProvider::new("gpt-4".into(), cx.background_executor().clone()) + .await; // TODO: deserialize state. let workspace_handle = workspace.clone(); @@ -156,11 +160,6 @@ impl AssistantPanel { }); let semantic_index = SemanticIndex::global(cx); - // Defaulting currently to GPT4, allow for this to be set via config. - let completion_provider = Arc::new(OpenAICompletionProvider::new( - "gpt-4", - cx.background_executor().clone(), - )); let focus_handle = cx.focus_handle(); cx.on_focus_in(&focus_handle, Self::focus_in).detach(); @@ -176,7 +175,7 @@ impl AssistantPanel { zoomed: false, focus_handle, toolbar, - completion_provider, + completion_provider: Arc::new(completion_provider), api_key_editor: None, languages: workspace.app_state().languages.clone(), fs: workspace.app_state().fs.clone(), @@ -1079,9 +1078,9 @@ impl AssistantPanel { cx.spawn(|this, mut cx| async move { let saved_conversation = fs.load(&path).await?; let saved_conversation = serde_json::from_str(&saved_conversation)?; - let conversation = cx.new_model(|cx| { - Conversation::deserialize(saved_conversation, path.clone(), languages, cx) - })?; + let conversation = + Conversation::deserialize(saved_conversation, path.clone(), languages, &mut cx) + .await?; this.update(&mut cx, |this, cx| { // If, by the time we've loaded the conversation, the user has already opened // the same conversation, we don't want to open it again. @@ -1462,21 +1461,25 @@ impl Conversation { } } - fn deserialize( + async fn deserialize( saved_conversation: SavedConversation, path: PathBuf, language_registry: Arc, - cx: &mut ModelContext, - ) -> Self { + cx: &mut AsyncAppContext, + ) -> Result> { let id = match saved_conversation.id { Some(id) => Some(id), None => Some(Uuid::new_v4().to_string()), }; let model = saved_conversation.model; let completion_provider: Arc = Arc::new( - OpenAICompletionProvider::new(model.full_name(), cx.background_executor().clone()), + OpenAICompletionProvider::new( + model.full_name().into(), + cx.background_executor().clone(), + ) + .await, ); - completion_provider.retrieve_credentials(cx); + cx.update(|cx| completion_provider.retrieve_credentials(cx))?; let markdown = language_registry.language_for_name("Markdown"); let mut message_anchors = Vec::new(); let mut next_message_id = MessageId(0); @@ -1499,32 +1502,34 @@ impl Conversation { }) .detach_and_log_err(cx); buffer - }); - - let mut this = Self { - id, - message_anchors, - messages_metadata: saved_conversation.message_metadata, - next_message_id, - summary: Some(Summary { - text: saved_conversation.summary, - done: true, - }), - pending_summary: Task::ready(None), - completion_count: Default::default(), - pending_completions: Default::default(), - token_count: None, - max_token_count: tiktoken_rs::model::get_context_size(&model.full_name()), - pending_token_count: Task::ready(None), - model, - _subscriptions: vec![cx.subscribe(&buffer, Self::handle_buffer_event)], - pending_save: Task::ready(Ok(())), - path: Some(path), - buffer, - completion_provider, - }; - this.count_remaining_tokens(cx); - this + })?; + + cx.new_model(|cx| { + let mut this = Self { + id, + message_anchors, + messages_metadata: saved_conversation.message_metadata, + next_message_id, + summary: Some(Summary { + text: saved_conversation.summary, + done: true, + }), + pending_summary: Task::ready(None), + completion_count: Default::default(), + pending_completions: Default::default(), + token_count: None, + max_token_count: tiktoken_rs::model::get_context_size(&model.full_name()), + pending_token_count: Task::ready(None), + model, + _subscriptions: vec![cx.subscribe(&buffer, Self::handle_buffer_event)], + pending_save: Task::ready(Ok(())), + path: Some(path), + buffer, + completion_provider, + }; + this.count_remaining_tokens(cx); + this + }) } fn handle_buffer_event( @@ -3169,7 +3174,7 @@ mod tests { use super::*; use crate::MessageId; use ai::test::FakeCompletionProvider; - use gpui::AppContext; + use gpui::{AppContext, TestAppContext}; use settings::SettingsStore; #[gpui::test] @@ -3487,16 +3492,17 @@ mod tests { } #[gpui::test] - fn test_serialization(cx: &mut AppContext) { - let settings_store = SettingsStore::test(cx); + async fn test_serialization(cx: &mut TestAppContext) { + let settings_store = cx.update(SettingsStore::test); cx.set_global(settings_store); - init(cx); + cx.update(init); let registry = Arc::new(LanguageRegistry::test()); let completion_provider = Arc::new(FakeCompletionProvider::new()); let conversation = cx.new_model(|cx| Conversation::new(registry.clone(), cx, completion_provider)); - let buffer = conversation.read(cx).buffer.clone(); - let message_0 = conversation.read(cx).message_anchors[0].id; + let buffer = conversation.read_with(cx, |conversation, _| conversation.buffer.clone()); + let message_0 = + conversation.read_with(cx, |conversation, _| conversation.message_anchors[0].id); let message_1 = conversation.update(cx, |conversation, cx| { conversation .insert_message_after(message_0, Role::Assistant, MessageStatus::Done, cx) @@ -3517,9 +3523,9 @@ mod tests { .unwrap() }); buffer.update(cx, |buffer, cx| buffer.undo(cx)); - assert_eq!(buffer.read(cx).text(), "a\nb\nc\n"); + assert_eq!(buffer.read_with(cx, |buffer, _| buffer.text()), "a\nb\nc\n"); assert_eq!( - messages(&conversation, cx), + cx.read(|cx| messages(&conversation, cx)), [ (message_0, Role::User, 0..2), (message_1.id, Role::Assistant, 2..6), @@ -3527,18 +3533,22 @@ mod tests { ] ); - let deserialized_conversation = cx.new_model(|cx| { - Conversation::deserialize( - conversation.read(cx).serialize(cx), - Default::default(), - registry.clone(), - cx, - ) - }); - let deserialized_buffer = deserialized_conversation.read(cx).buffer.clone(); - assert_eq!(deserialized_buffer.read(cx).text(), "a\nb\nc\n"); + let deserialized_conversation = Conversation::deserialize( + conversation.read_with(cx, |conversation, cx| conversation.serialize(cx)), + Default::default(), + registry.clone(), + &mut cx.to_async(), + ) + .await + .unwrap(); + let deserialized_buffer = + deserialized_conversation.read_with(cx, |conversation, _| conversation.buffer.clone()); + assert_eq!( + deserialized_buffer.read_with(cx, |buffer, _| buffer.text()), + "a\nb\nc\n" + ); assert_eq!( - messages(&deserialized_conversation, cx), + cx.read(|cx| messages(&deserialized_conversation, cx)), [ (message_0, Role::User, 0..2), (message_1.id, Role::Assistant, 2..6), diff --git a/crates/semantic_index/src/semantic_index.rs b/crates/semantic_index/src/semantic_index.rs index a556986f9b1f9bda64706a8691cd329ead136086..475ab079dc21a92b6ecba7a2256ea951cb0cfb0f 100644 --- a/crates/semantic_index/src/semantic_index.rs +++ b/crates/semantic_index/src/semantic_index.rs @@ -90,13 +90,12 @@ pub fn init( .detach(); cx.spawn(move |cx| async move { + let embedding_provider = + OpenAIEmbeddingProvider::new(http_client, cx.background_executor().clone()).await; let semantic_index = SemanticIndex::new( fs, db_file_path, - Arc::new(OpenAIEmbeddingProvider::new( - http_client, - cx.background_executor().clone(), - )), + Arc::new(embedding_provider), language_registry, cx.clone(), ) From 0497b2f212b46efb9bb32876d0b3a02b24be7bbb Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 24 Jan 2024 13:57:55 +0100 Subject: [PATCH 21/27] pane: Another stab at focus flickers in tab bar This time around, we address the flicker seen in #3857 by querying the active item (that might've just been added), as it knows whether it has focus even if the parent Pane does not. Co-authored-by: Thorsten --- crates/workspace/src/pane.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index cc7eeb1a8a3f7ff1542988b36b21903dab30665f..dd134576f5ec9bc8094975ce95df7a07c0e6332c 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -342,7 +342,18 @@ impl Pane { } pub fn has_focus(&self, cx: &WindowContext) -> bool { + // In addition to checking our own focus handle, + // we need to account for a brief moment (when active item is being switched) + // where we don't have focus. + // We not only check whether our focus handle contains focus, but also + // whether the active_item might have focus, because we might have just activated an item + // but that hasn't rendered yet. So before the next render, we might have transfered focus + // to the item and `focus_handle.contains_focus` returns false because the `active_item` + // is not hooked up to us in the dispatch tree. self.focus_handle.contains_focused(cx) + || self + .active_item() + .map_or(false, |item| item.focus_handle(cx).contains_focused(cx)) } fn focus_in(&mut self, cx: &mut ViewContext) { From fe2cb9f9ca5f6b727d28d1d7436bc4a6f65b485f Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:01:17 +0100 Subject: [PATCH 22/27] fixup! pane: Another stab at focus flickers in tab bar --- crates/workspace/src/pane.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index dd134576f5ec9bc8094975ce95df7a07c0e6332c..ab8e248ac06f0cb7d45b1323595c8387deeacfe0 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -342,12 +342,10 @@ impl Pane { } pub fn has_focus(&self, cx: &WindowContext) -> bool { - // In addition to checking our own focus handle, - // we need to account for a brief moment (when active item is being switched) - // where we don't have focus. // We not only check whether our focus handle contains focus, but also // whether the active_item might have focus, because we might have just activated an item - // but that hasn't rendered yet. So before the next render, we might have transfered focus + // but that hasn't rendered yet. + // So before the next render, we might have transfered focus // to the item and `focus_handle.contains_focus` returns false because the `active_item` // is not hooked up to us in the dispatch tree. self.focus_handle.contains_focused(cx) From 0d0c85a5ee5d2a1b57bca35d4248ec1e124834d9 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:03:12 +0100 Subject: [PATCH 23/27] Fix typo in comment --- crates/workspace/src/pane.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index ab8e248ac06f0cb7d45b1323595c8387deeacfe0..7f164c6e69b22ce20d95308584d5819b48bd91f7 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -345,7 +345,7 @@ impl Pane { // We not only check whether our focus handle contains focus, but also // whether the active_item might have focus, because we might have just activated an item // but that hasn't rendered yet. - // So before the next render, we might have transfered focus + // So before the next render, we might have transferred focus // to the item and `focus_handle.contains_focus` returns false because the `active_item` // is not hooked up to us in the dispatch tree. self.focus_handle.contains_focused(cx) From 25a7eb27d22ea6bf49df71e650db38b33810520f Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 24 Jan 2024 14:53:05 +0100 Subject: [PATCH 24/27] Move interaction with keychain off the main thread --- crates/ai/src/auth.rs | 14 +- crates/ai/src/providers/open_ai/completion.rs | 67 +++++-- crates/ai/src/providers/open_ai/embedding.rs | 71 ++++--- crates/ai/src/test.rs | 38 +++- crates/assistant/src/assistant_panel.rs | 108 ++++++---- crates/client/src/client.rs | 27 ++- crates/gpui/src/app.rs | 11 +- crates/gpui/src/platform.rs | 8 +- crates/gpui/src/platform/mac/platform.rs | 185 ++++++++++-------- crates/gpui/src/platform/test/platform.rs | 15 +- crates/semantic_index/src/semantic_index.rs | 40 +++- crates/zed/src/main.rs | 2 +- 12 files changed, 371 insertions(+), 215 deletions(-) diff --git a/crates/ai/src/auth.rs b/crates/ai/src/auth.rs index 1ea49bd615999a7f0318d3e205d3f86cee9c64a8..62556d718360a92bdd21cd20155c2ea8ca5e5c57 100644 --- a/crates/ai/src/auth.rs +++ b/crates/ai/src/auth.rs @@ -1,3 +1,4 @@ +use futures::future::BoxFuture; use gpui::AppContext; #[derive(Clone, Debug)] @@ -9,7 +10,14 @@ pub enum ProviderCredential { pub trait CredentialProvider: Send + Sync { fn has_credentials(&self) -> bool; - fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential; - fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential); - fn delete_credentials(&self, cx: &mut AppContext); + #[must_use] + fn retrieve_credentials(&self, cx: &mut AppContext) -> BoxFuture; + #[must_use] + fn save_credentials( + &self, + cx: &mut AppContext, + credential: ProviderCredential, + ) -> BoxFuture<()>; + #[must_use] + fn delete_credentials(&self, cx: &mut AppContext) -> BoxFuture<()>; } diff --git a/crates/ai/src/providers/open_ai/completion.rs b/crates/ai/src/providers/open_ai/completion.rs index fda4d6981667e68f7da01d258cfef5079113955f..aa5895011323e67ea4618bbb2fb4164737dc53a2 100644 --- a/crates/ai/src/providers/open_ai/completion.rs +++ b/crates/ai/src/providers/open_ai/completion.rs @@ -222,45 +222,70 @@ impl CredentialProvider for OpenAICompletionProvider { } } - fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential { + fn retrieve_credentials(&self, cx: &mut AppContext) -> BoxFuture { let existing_credential = self.credential.read().clone(); let retrieved_credential = match existing_credential { - ProviderCredential::Credentials { .. } => existing_credential.clone(), + ProviderCredential::Credentials { .. } => { + return async move { existing_credential }.boxed() + } _ => { if let Some(api_key) = env::var("OPENAI_API_KEY").log_err() { - ProviderCredential::Credentials { api_key } - } else if let Some(Some((_, api_key))) = - cx.read_credentials(OPENAI_API_URL).log_err() - { - if let Some(api_key) = String::from_utf8(api_key).log_err() { - ProviderCredential::Credentials { api_key } - } else { - ProviderCredential::NoCredentials - } + async move { ProviderCredential::Credentials { api_key } }.boxed() } else { - ProviderCredential::NoCredentials + let credentials = cx.read_credentials(OPENAI_API_URL); + async move { + if let Some(Some((_, api_key))) = credentials.await.log_err() { + if let Some(api_key) = String::from_utf8(api_key).log_err() { + ProviderCredential::Credentials { api_key } + } else { + ProviderCredential::NoCredentials + } + } else { + ProviderCredential::NoCredentials + } + } + .boxed() } } }; - *self.credential.write() = retrieved_credential.clone(); - retrieved_credential + + async move { + let retrieved_credential = retrieved_credential.await; + *self.credential.write() = retrieved_credential.clone(); + retrieved_credential + } + .boxed() } - fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential) { + fn save_credentials( + &self, + cx: &mut AppContext, + credential: ProviderCredential, + ) -> BoxFuture<()> { *self.credential.write() = credential.clone(); let credential = credential.clone(); - match credential { + let write_credentials = match credential { ProviderCredential::Credentials { api_key } => { - cx.write_credentials(OPENAI_API_URL, "Bearer", api_key.as_bytes()) - .log_err(); + Some(cx.write_credentials(OPENAI_API_URL, "Bearer", api_key.as_bytes())) + } + _ => None, + }; + + async move { + if let Some(write_credentials) = write_credentials { + write_credentials.await.log_err(); } - _ => {} } + .boxed() } - fn delete_credentials(&self, cx: &mut AppContext) { - cx.delete_credentials(OPENAI_API_URL).log_err(); + fn delete_credentials(&self, cx: &mut AppContext) -> BoxFuture<()> { *self.credential.write() = ProviderCredential::NoCredentials; + let delete_credentials = cx.delete_credentials(OPENAI_API_URL); + async move { + delete_credentials.await.log_err(); + } + .boxed() } } diff --git a/crates/ai/src/providers/open_ai/embedding.rs b/crates/ai/src/providers/open_ai/embedding.rs index 1dca571733325f52448cd8c4399445f977d11727..89aebb1b7616643c683cdd419ec0ebd1d51b5142 100644 --- a/crates/ai/src/providers/open_ai/embedding.rs +++ b/crates/ai/src/providers/open_ai/embedding.rs @@ -1,6 +1,8 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; +use futures::future::BoxFuture; use futures::AsyncReadExt; +use futures::FutureExt; use gpui::AppContext; use gpui::BackgroundExecutor; use isahc::http::StatusCode; @@ -157,46 +159,71 @@ impl CredentialProvider for OpenAIEmbeddingProvider { _ => false, } } - fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential { - let existing_credential = self.credential.read().clone(); + fn retrieve_credentials(&self, cx: &mut AppContext) -> BoxFuture { + let existing_credential = self.credential.read().clone(); let retrieved_credential = match existing_credential { - ProviderCredential::Credentials { .. } => existing_credential.clone(), + ProviderCredential::Credentials { .. } => { + return async move { existing_credential }.boxed() + } _ => { if let Some(api_key) = env::var("OPENAI_API_KEY").log_err() { - ProviderCredential::Credentials { api_key } - } else if let Some(Some((_, api_key))) = - cx.read_credentials(OPENAI_API_URL).log_err() - { - if let Some(api_key) = String::from_utf8(api_key).log_err() { - ProviderCredential::Credentials { api_key } - } else { - ProviderCredential::NoCredentials - } + async move { ProviderCredential::Credentials { api_key } }.boxed() } else { - ProviderCredential::NoCredentials + let credentials = cx.read_credentials(OPENAI_API_URL); + async move { + if let Some(Some((_, api_key))) = credentials.await.log_err() { + if let Some(api_key) = String::from_utf8(api_key).log_err() { + ProviderCredential::Credentials { api_key } + } else { + ProviderCredential::NoCredentials + } + } else { + ProviderCredential::NoCredentials + } + } + .boxed() } } }; - *self.credential.write() = retrieved_credential.clone(); - retrieved_credential + async move { + let retrieved_credential = retrieved_credential.await; + *self.credential.write() = retrieved_credential.clone(); + retrieved_credential + } + .boxed() } - fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential) { + fn save_credentials( + &self, + cx: &mut AppContext, + credential: ProviderCredential, + ) -> BoxFuture<()> { *self.credential.write() = credential.clone(); - match credential { + let credential = credential.clone(); + let write_credentials = match credential { ProviderCredential::Credentials { api_key } => { - cx.write_credentials(OPENAI_API_URL, "Bearer", api_key.as_bytes()) - .log_err(); + Some(cx.write_credentials(OPENAI_API_URL, "Bearer", api_key.as_bytes())) + } + _ => None, + }; + + async move { + if let Some(write_credentials) = write_credentials { + write_credentials.await.log_err(); } - _ => {} } + .boxed() } - fn delete_credentials(&self, cx: &mut AppContext) { - cx.delete_credentials(OPENAI_API_URL).log_err(); + fn delete_credentials(&self, cx: &mut AppContext) -> BoxFuture<()> { *self.credential.write() = ProviderCredential::NoCredentials; + let delete_credentials = cx.delete_credentials(OPENAI_API_URL); + async move { + delete_credentials.await.log_err(); + } + .boxed() } } diff --git a/crates/ai/src/test.rs b/crates/ai/src/test.rs index 3d59febbe912b42f7be11625ff0fbc2952184291..89edc71b0bc51f4d08c8f5fba8c3621ddb6ce000 100644 --- a/crates/ai/src/test.rs +++ b/crates/ai/src/test.rs @@ -104,11 +104,22 @@ impl CredentialProvider for FakeEmbeddingProvider { fn has_credentials(&self) -> bool { true } - fn retrieve_credentials(&self, _cx: &mut AppContext) -> ProviderCredential { - ProviderCredential::NotNeeded + + fn retrieve_credentials(&self, _cx: &mut AppContext) -> BoxFuture { + async { ProviderCredential::NotNeeded }.boxed() + } + + fn save_credentials( + &self, + _cx: &mut AppContext, + _credential: ProviderCredential, + ) -> BoxFuture<()> { + async {}.boxed() + } + + fn delete_credentials(&self, _cx: &mut AppContext) -> BoxFuture<()> { + async {}.boxed() } - fn save_credentials(&self, _cx: &mut AppContext, _credential: ProviderCredential) {} - fn delete_credentials(&self, _cx: &mut AppContext) {} } #[async_trait] @@ -165,11 +176,22 @@ impl CredentialProvider for FakeCompletionProvider { fn has_credentials(&self) -> bool { true } - fn retrieve_credentials(&self, _cx: &mut AppContext) -> ProviderCredential { - ProviderCredential::NotNeeded + + fn retrieve_credentials(&self, _cx: &mut AppContext) -> BoxFuture { + async { ProviderCredential::NotNeeded }.boxed() + } + + fn save_credentials( + &self, + _cx: &mut AppContext, + _credential: ProviderCredential, + ) -> BoxFuture<()> { + async {}.boxed() + } + + fn delete_credentials(&self, _cx: &mut AppContext) -> BoxFuture<()> { + async {}.boxed() } - fn save_credentials(&self, _cx: &mut AppContext, _credential: ProviderCredential) {} - fn delete_credentials(&self, _cx: &mut AppContext) {} } impl CompletionProvider for FakeCompletionProvider { diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs index 097c6424d7cefe0738feb135d0e242ffac963639..b2c539fcc21dc1ccb05532e5a5aa7e9ca7012b0a 100644 --- a/crates/assistant/src/assistant_panel.rs +++ b/crates/assistant/src/assistant_panel.rs @@ -6,14 +6,12 @@ use crate::{ NewConversation, QuoteSelection, ResetKey, Role, SavedConversation, SavedConversationMetadata, SavedMessage, Split, ToggleFocus, ToggleIncludeConversation, ToggleRetrieveContext, }; - +use ai::prompts::repository_context::PromptCodeSnippet; use ai::{ auth::ProviderCredential, completion::{CompletionProvider, CompletionRequest}, providers::open_ai::{OpenAICompletionProvider, OpenAIRequest, RequestMessage}, }; - -use ai::prompts::repository_context::PromptCodeSnippet; use anyhow::{anyhow, Result}; use chrono::{DateTime, Local}; use client::telemetry::AssistantKind; @@ -220,23 +218,9 @@ impl AssistantPanel { _: &InlineAssist, cx: &mut ViewContext, ) { - let this = if let Some(this) = workspace.panel::(cx) { - if this.update(cx, |assistant, cx| { - if !assistant.has_credentials() { - assistant.load_credentials(cx); - }; - - assistant.has_credentials() - }) { - this - } else { - workspace.focus_panel::(cx); - return; - } - } else { + let Some(assistant) = workspace.panel::(cx) else { return; }; - let active_editor = if let Some(active_editor) = workspace .active_item(cx) .and_then(|item| item.act_as::(cx)) @@ -245,12 +229,32 @@ impl AssistantPanel { } else { return; }; + let project = workspace.project().clone(); - let project = workspace.project(); + if assistant.update(cx, |assistant, _| assistant.has_credentials()) { + assistant.update(cx, |assistant, cx| { + assistant.new_inline_assist(&active_editor, cx, &project) + }); + } else { + let assistant = assistant.downgrade(); + cx.spawn(|workspace, mut cx| async move { + assistant + .update(&mut cx, |assistant, cx| assistant.load_credentials(cx))? + .await; + if assistant.update(&mut cx, |assistant, _| assistant.has_credentials())? { + assistant.update(&mut cx, |assistant, cx| { + assistant.new_inline_assist(&active_editor, cx, &project) + })?; + } else { + workspace.update(&mut cx, |workspace, cx| { + workspace.focus_panel::(cx) + })?; + } - this.update(cx, |assistant, cx| { - assistant.new_inline_assist(&active_editor, cx, project) - }); + anyhow::Ok(()) + }) + .detach_and_log_err(cx) + } } fn new_inline_assist( @@ -290,9 +294,6 @@ impl AssistantPanel { let inline_assist_id = post_inc(&mut self.next_inline_assist_id); let provider = self.completion_provider.clone(); - // Retrieve Credentials Authenticates the Provider - provider.retrieve_credentials(cx); - let codegen = cx.new_model(|cx| { Codegen::new(editor.read(cx).buffer().clone(), codegen_kind, provider, cx) }); @@ -845,11 +846,18 @@ impl AssistantPanel { api_key: api_key.clone(), }; - self.completion_provider.save_credentials(cx, credential); + let completion_provider = self.completion_provider.clone(); + cx.spawn(|this, mut cx| async move { + cx.update(|cx| completion_provider.save_credentials(cx, credential))? + .await; - self.api_key_editor.take(); - self.focus_handle.focus(cx); - cx.notify(); + this.update(&mut cx, |this, cx| { + this.api_key_editor.take(); + this.focus_handle.focus(cx); + cx.notify(); + }) + }) + .detach_and_log_err(cx); } } else { cx.propagate(); @@ -857,10 +865,17 @@ impl AssistantPanel { } fn reset_credentials(&mut self, _: &ResetKey, cx: &mut ViewContext) { - self.completion_provider.delete_credentials(cx); - self.api_key_editor = Some(build_api_key_editor(cx)); - self.focus_handle.focus(cx); - cx.notify(); + let completion_provider = self.completion_provider.clone(); + cx.spawn(|this, mut cx| async move { + cx.update(|cx| completion_provider.delete_credentials(cx))? + .await; + this.update(&mut cx, |this, cx| { + this.api_key_editor = Some(build_api_key_editor(cx)); + this.focus_handle.focus(cx); + cx.notify(); + }) + }) + .detach_and_log_err(cx); } fn toggle_zoom(&mut self, _: &workspace::ToggleZoom, cx: &mut ViewContext) { @@ -1107,8 +1122,16 @@ impl AssistantPanel { self.completion_provider.has_credentials() } - fn load_credentials(&mut self, cx: &mut ViewContext) { - self.completion_provider.retrieve_credentials(cx); + fn load_credentials(&mut self, cx: &mut ViewContext) -> Task<()> { + let completion_provider = self.completion_provider.clone(); + cx.spawn(|_, mut cx| async move { + if let Some(retrieve_credentials) = cx + .update(|cx| completion_provider.retrieve_credentials(cx)) + .log_err() + { + retrieve_credentials.await; + } + }) } } @@ -1314,11 +1337,16 @@ impl Panel for AssistantPanel { fn set_active(&mut self, active: bool, cx: &mut ViewContext) { if active { - self.load_credentials(cx); - - if self.editors.is_empty() { - self.new_conversation(cx); - } + let load_credentials = self.load_credentials(cx); + cx.spawn(|this, mut cx| async move { + load_credentials.await; + this.update(&mut cx, |this, cx| { + if this.editors.is_empty() { + this.new_conversation(cx); + } + }) + }) + .detach_and_log_err(cx); } } diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 844c9a5eb66a89751a632ef311a79e9419521a58..370a2ba6ffdb8ab13d8279c19e9207990b160b20 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -700,8 +700,8 @@ impl Client { } } - pub fn has_keychain_credentials(&self, cx: &AsyncAppContext) -> bool { - read_credentials_from_keychain(cx).is_some() + pub async fn has_keychain_credentials(&self, cx: &AsyncAppContext) -> bool { + read_credentials_from_keychain(cx).await.is_some() } #[async_recursion(?Send)] @@ -732,7 +732,7 @@ impl Client { let mut read_from_keychain = false; let mut credentials = self.state.read().credentials.clone(); if credentials.is_none() && try_keychain { - credentials = read_credentials_from_keychain(cx); + credentials = read_credentials_from_keychain(cx).await; read_from_keychain = credentials.is_some(); } if credentials.is_none() { @@ -770,7 +770,7 @@ impl Client { Ok(conn) => { self.state.write().credentials = Some(credentials.clone()); if !read_from_keychain && IMPERSONATE_LOGIN.is_none() { - write_credentials_to_keychain(credentials, cx).log_err(); + write_credentials_to_keychain(credentials, cx).await.log_err(); } futures::select_biased! { @@ -784,7 +784,7 @@ impl Client { Err(EstablishConnectionError::Unauthorized) => { self.state.write().credentials.take(); if read_from_keychain { - delete_credentials_from_keychain(cx).log_err(); + delete_credentials_from_keychain(cx).await.log_err(); self.set_status(Status::SignedOut, cx); self.authenticate_and_connect(false, cx).await } else { @@ -1350,14 +1350,16 @@ impl Client { } } -fn read_credentials_from_keychain(cx: &AsyncAppContext) -> Option { +async fn read_credentials_from_keychain(cx: &AsyncAppContext) -> Option { if IMPERSONATE_LOGIN.is_some() { return None; } let (user_id, access_token) = cx - .update(|cx| cx.read_credentials(&ZED_SERVER_URL).log_err().flatten()) - .ok()??; + .update(|cx| cx.read_credentials(&ZED_SERVER_URL)) + .log_err()? + .await + .log_err()??; Some(Credentials { user_id: user_id.parse().ok()?, @@ -1365,7 +1367,10 @@ fn read_credentials_from_keychain(cx: &AsyncAppContext) -> Option { }) } -fn write_credentials_to_keychain(credentials: Credentials, cx: &AsyncAppContext) -> Result<()> { +async fn write_credentials_to_keychain( + credentials: Credentials, + cx: &AsyncAppContext, +) -> Result<()> { cx.update(move |cx| { cx.write_credentials( &ZED_SERVER_URL, @@ -1373,10 +1378,12 @@ fn write_credentials_to_keychain(credentials: Credentials, cx: &AsyncAppContext) credentials.access_token.as_bytes(), ) })? + .await } -fn delete_credentials_from_keychain(cx: &AsyncAppContext) -> Result<()> { +async fn delete_credentials_from_keychain(cx: &AsyncAppContext) -> Result<()> { cx.update(move |cx| cx.delete_credentials(&ZED_SERVER_URL))? + .await } const WORKTREE_URL_PREFIX: &str = "zed://worktrees/"; diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index dfecffb80a26461cc16d40489213988494229672..6f75eafaf2a898ecc7d33a4d96365a42e41e712f 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -523,17 +523,22 @@ impl AppContext { } /// Writes credentials to the platform keychain. - pub fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()> { + pub fn write_credentials( + &self, + url: &str, + username: &str, + password: &[u8], + ) -> Task> { self.platform.write_credentials(url, username, password) } /// Reads credentials from the platform keychain. - pub fn read_credentials(&self, url: &str) -> Result)>> { + pub fn read_credentials(&self, url: &str) -> Task)>>> { self.platform.read_credentials(url) } /// Deletes credentials from the platform keychain. - pub fn delete_credentials(&self, url: &str) -> Result<()> { + pub fn delete_credentials(&self, url: &str) -> Task> { self.platform.delete_credentials(url) } diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 900b17bb2c565a80b4095090478b3d2a06c8423a..3d2679dd7ecabe5d92e31038fa9c5d4a02f9d55c 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -9,7 +9,7 @@ use crate::{ Action, AnyWindowHandle, AsyncWindowContext, BackgroundExecutor, Bounds, DevicePixels, Font, FontId, FontMetrics, FontRun, ForegroundExecutor, GlobalPixels, GlyphId, Keymap, LineLayout, Pixels, PlatformInput, Point, RenderGlyphParams, RenderImageParams, RenderSvgParams, Result, - Scene, SharedString, Size, TaskLabel, WindowContext, + Scene, SharedString, Size, Task, TaskLabel, WindowContext, }; use anyhow::anyhow; use async_task::Runnable; @@ -108,9 +108,9 @@ pub(crate) trait Platform: 'static { fn write_to_clipboard(&self, item: ClipboardItem); fn read_from_clipboard(&self) -> Option; - fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()>; - fn read_credentials(&self, url: &str) -> Result)>>; - fn delete_credentials(&self, url: &str) -> Result<()>; + fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Task>; + fn read_credentials(&self, url: &str) -> Task)>>>; + fn delete_credentials(&self, url: &str) -> Task>; } /// A handle to a platform's display, e.g. a monitor or laptop screen. diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index e4a688c2fdb35c1dd3adec829fd66a4baf1e4441..58a759865ead18dda81d4a8f2090dbab6c05e379 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -3,7 +3,7 @@ use crate::{ Action, AnyWindowHandle, BackgroundExecutor, ClipboardItem, CursorStyle, DisplayId, ForegroundExecutor, Keymap, MacDispatcher, MacDisplay, MacDisplayLinker, MacTextSystem, MacWindow, Menu, MenuItem, PathPromptOptions, Platform, PlatformDisplay, PlatformInput, - PlatformTextSystem, PlatformWindow, Result, SemanticVersion, WindowOptions, + PlatformTextSystem, PlatformWindow, Result, SemanticVersion, Task, WindowOptions, }; use anyhow::anyhow; use block::ConcreteBlock; @@ -856,104 +856,115 @@ impl Platform for MacPlatform { } } - fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()> { - let url = CFString::from(url); - let username = CFString::from(username); - let password = CFData::from_buffer(password); - - unsafe { - use security::*; - - // First, check if there are already credentials for the given server. If so, then - // update the username and password. - let mut verb = "updating"; - let mut query_attrs = CFMutableDictionary::with_capacity(2); - query_attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); - query_attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); - - let mut attrs = CFMutableDictionary::with_capacity(4); - attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); - attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); - attrs.set(kSecAttrAccount as *const _, username.as_CFTypeRef()); - attrs.set(kSecValueData as *const _, password.as_CFTypeRef()); - - let mut status = SecItemUpdate( - query_attrs.as_concrete_TypeRef(), - attrs.as_concrete_TypeRef(), - ); + fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Task> { + let url = url.to_string(); + let username = username.to_string(); + let password = password.to_vec(); + self.background_executor().spawn(async move { + unsafe { + use security::*; + + let url = CFString::from(url.as_str()); + let username = CFString::from(username.as_str()); + let password = CFData::from_buffer(&password); + + // First, check if there are already credentials for the given server. If so, then + // update the username and password. + let mut verb = "updating"; + let mut query_attrs = CFMutableDictionary::with_capacity(2); + query_attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); + query_attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); + + let mut attrs = CFMutableDictionary::with_capacity(4); + attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); + attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); + attrs.set(kSecAttrAccount as *const _, username.as_CFTypeRef()); + attrs.set(kSecValueData as *const _, password.as_CFTypeRef()); + + let mut status = SecItemUpdate( + query_attrs.as_concrete_TypeRef(), + attrs.as_concrete_TypeRef(), + ); - // If there were no existing credentials for the given server, then create them. - if status == errSecItemNotFound { - verb = "creating"; - status = SecItemAdd(attrs.as_concrete_TypeRef(), ptr::null_mut()); - } + // If there were no existing credentials for the given server, then create them. + if status == errSecItemNotFound { + verb = "creating"; + status = SecItemAdd(attrs.as_concrete_TypeRef(), ptr::null_mut()); + } - if status != errSecSuccess { - return Err(anyhow!("{} password failed: {}", verb, status)); + if status != errSecSuccess { + return Err(anyhow!("{} password failed: {}", verb, status)); + } } - } - Ok(()) - } - - fn read_credentials(&self, url: &str) -> Result)>> { - let url = CFString::from(url); - let cf_true = CFBoolean::true_value().as_CFTypeRef(); + Ok(()) + }) + } + + fn read_credentials(&self, url: &str) -> Task)>>> { + let url = url.to_string(); + self.background_executor().spawn(async move { + let url = CFString::from(url.as_str()); + let cf_true = CFBoolean::true_value().as_CFTypeRef(); + + unsafe { + use security::*; + + // Find any credentials for the given server URL. + let mut attrs = CFMutableDictionary::with_capacity(5); + attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); + attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); + attrs.set(kSecReturnAttributes as *const _, cf_true); + attrs.set(kSecReturnData as *const _, cf_true); + + let mut result = CFTypeRef::from(ptr::null()); + let status = SecItemCopyMatching(attrs.as_concrete_TypeRef(), &mut result); + match status { + security::errSecSuccess => {} + security::errSecItemNotFound | security::errSecUserCanceled => return Ok(None), + _ => return Err(anyhow!("reading password failed: {}", status)), + } - unsafe { - use security::*; - - // Find any credentials for the given server URL. - let mut attrs = CFMutableDictionary::with_capacity(5); - attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); - attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); - attrs.set(kSecReturnAttributes as *const _, cf_true); - attrs.set(kSecReturnData as *const _, cf_true); - - let mut result = CFTypeRef::from(ptr::null()); - let status = SecItemCopyMatching(attrs.as_concrete_TypeRef(), &mut result); - match status { - security::errSecSuccess => {} - security::errSecItemNotFound | security::errSecUserCanceled => return Ok(None), - _ => return Err(anyhow!("reading password failed: {}", status)), + let result = CFType::wrap_under_create_rule(result) + .downcast::() + .ok_or_else(|| anyhow!("keychain item was not a dictionary"))?; + let username = result + .find(kSecAttrAccount as *const _) + .ok_or_else(|| anyhow!("account was missing from keychain item"))?; + let username = CFType::wrap_under_get_rule(*username) + .downcast::() + .ok_or_else(|| anyhow!("account was not a string"))?; + let password = result + .find(kSecValueData as *const _) + .ok_or_else(|| anyhow!("password was missing from keychain item"))?; + let password = CFType::wrap_under_get_rule(*password) + .downcast::() + .ok_or_else(|| anyhow!("password was not a string"))?; + + Ok(Some((username.to_string(), password.bytes().to_vec()))) } - - let result = CFType::wrap_under_create_rule(result) - .downcast::() - .ok_or_else(|| anyhow!("keychain item was not a dictionary"))?; - let username = result - .find(kSecAttrAccount as *const _) - .ok_or_else(|| anyhow!("account was missing from keychain item"))?; - let username = CFType::wrap_under_get_rule(*username) - .downcast::() - .ok_or_else(|| anyhow!("account was not a string"))?; - let password = result - .find(kSecValueData as *const _) - .ok_or_else(|| anyhow!("password was missing from keychain item"))?; - let password = CFType::wrap_under_get_rule(*password) - .downcast::() - .ok_or_else(|| anyhow!("password was not a string"))?; - - Ok(Some((username.to_string(), password.bytes().to_vec()))) - } + }) } - fn delete_credentials(&self, url: &str) -> Result<()> { - let url = CFString::from(url); + fn delete_credentials(&self, url: &str) -> Task> { + let url = url.to_string(); - unsafe { - use security::*; + self.background_executor().spawn(async move { + unsafe { + use security::*; - let mut query_attrs = CFMutableDictionary::with_capacity(2); - query_attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); - query_attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); + let url = CFString::from(url.as_str()); + let mut query_attrs = CFMutableDictionary::with_capacity(2); + query_attrs.set(kSecClass as *const _, kSecClassInternetPassword as *const _); + query_attrs.set(kSecAttrServer as *const _, url.as_CFTypeRef()); - let status = SecItemDelete(query_attrs.as_concrete_TypeRef()); + let status = SecItemDelete(query_attrs.as_concrete_TypeRef()); - if status != errSecSuccess { - return Err(anyhow!("delete password failed: {}", status)); + if status != errSecSuccess { + return Err(anyhow!("delete password failed: {}", status)); + } } - } - Ok(()) + Ok(()) + }) } } diff --git a/crates/gpui/src/platform/test/platform.rs b/crates/gpui/src/platform/test/platform.rs index 9a33b4b3b58bf67591746d1c1f000089db315098..5aadc4b760aeacf9bb03ee3bef4694a4d73fea4d 100644 --- a/crates/gpui/src/platform/test/platform.rs +++ b/crates/gpui/src/platform/test/platform.rs @@ -1,6 +1,7 @@ use crate::{ AnyWindowHandle, BackgroundExecutor, ClipboardItem, CursorStyle, DisplayId, ForegroundExecutor, - Keymap, Platform, PlatformDisplay, PlatformTextSystem, TestDisplay, TestWindow, WindowOptions, + Keymap, Platform, PlatformDisplay, PlatformTextSystem, Task, TestDisplay, TestWindow, + WindowOptions, }; use anyhow::{anyhow, Result}; use collections::VecDeque; @@ -280,16 +281,16 @@ impl Platform for TestPlatform { self.current_clipboard_item.lock().clone() } - fn write_credentials(&self, _url: &str, _username: &str, _password: &[u8]) -> Result<()> { - Ok(()) + fn write_credentials(&self, _url: &str, _username: &str, _password: &[u8]) -> Task> { + Task::ready(Ok(())) } - fn read_credentials(&self, _url: &str) -> Result)>> { - Ok(None) + fn read_credentials(&self, _url: &str) -> Task)>>> { + Task::ready(Ok(None)) } - fn delete_credentials(&self, _url: &str) -> Result<()> { - Ok(()) + fn delete_credentials(&self, _url: &str) -> Task> { + Task::ready(Ok(())) } fn double_click_interval(&self) -> std::time::Duration { diff --git a/crates/semantic_index/src/semantic_index.rs b/crates/semantic_index/src/semantic_index.rs index 475ab079dc21a92b6ecba7a2256ea951cb0cfb0f..62773cced8e74c59ebffadc03d4c0efa9ab47c2e 100644 --- a/crates/semantic_index/src/semantic_index.rs +++ b/crates/semantic_index/src/semantic_index.rs @@ -278,14 +278,22 @@ impl SemanticIndex { .map(|semantic_index| semantic_index.clone()) } - pub fn authenticate(&mut self, cx: &mut AppContext) -> bool { + pub fn authenticate(&mut self, cx: &mut AppContext) -> Task { if !self.embedding_provider.has_credentials() { - self.embedding_provider.retrieve_credentials(cx); + let embedding_provider = self.embedding_provider.clone(); + cx.spawn(|cx| async move { + if let Some(retrieve_credentials) = cx + .update(|cx| embedding_provider.retrieve_credentials(cx)) + .log_err() + { + retrieve_credentials.await; + } + + embedding_provider.has_credentials() + }) } else { - return true; + Task::ready(true) } - - self.embedding_provider.has_credentials() } pub fn is_authenticated(&self) -> bool { @@ -1005,12 +1013,26 @@ impl SemanticIndex { project: Model, cx: &mut ModelContext, ) -> Task> { - if !self.is_authenticated() { - if !self.authenticate(cx) { - return Task::ready(Err(anyhow!("user is not authenticated"))); - } + if self.is_authenticated() { + self.index_project_internal(project, cx) + } else { + let authenticate = self.authenticate(cx); + cx.spawn(|this, mut cx| async move { + if authenticate.await { + this.update(&mut cx, |this, cx| this.index_project_internal(project, cx))? + .await + } else { + Err(anyhow!("user is not authenticated")) + } + }) } + } + fn index_project_internal( + &mut self, + project: Model, + cx: &mut ModelContext, + ) -> Task> { if !self.projects.contains_key(&project.downgrade()) { let subscription = cx.subscribe(&project, |this, project, event, cx| match event { project::Event::WorktreeAdded | project::Event::WorktreeRemoved(_) => { diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 6486fc5db45bff24e1697aa72fc3aa0483b06155..5abb046165c224f9a11fc5f9166d46eee73235b7 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -376,7 +376,7 @@ async fn authenticate(client: Arc, cx: &AsyncAppContext) -> Result<()> { if client::IMPERSONATE_LOGIN.is_some() { client.authenticate_and_connect(false, &cx).await?; } - } else if client.has_keychain_credentials(&cx) { + } else if client.has_keychain_credentials(&cx).await { client.authenticate_and_connect(true, &cx).await?; } Ok::<_, anyhow::Error>(()) From f654b896576ca65470b5d7cf57c322acd1fc8384 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Wed, 24 Jan 2024 09:59:13 -0500 Subject: [PATCH 25/27] Make it clearer that macOS Sonoma is supported (#4249) This PR updates the docs to make it clearer that macOS Sonoma is supported. Release Notes: - N/A --- docs/src/system_requirements.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/system_requirements.md b/docs/src/system_requirements.md index debf7fa2998b262e9ad07746e3732e433b448fe6..1049626d1e3ceab907dcf8a53bbad17199a0be83 100644 --- a/docs/src/system_requirements.md +++ b/docs/src/system_requirements.md @@ -2,7 +2,7 @@ ## macOS -Supported versions: Catalina (10.15) - Ventura (13.x). +Supported versions: Catalina (10.15) - Sonoma (14.x). {% hint style="info" %} The implementation of our screen sharing feature makes use of [LiveKit](https://livekit.io). The LiveKit SDK requires macOS Catalina (10.15); consequently, in v0.62.4, we dropped support for earlier macOS versions that we were initially supporting. From a4897e00b4ad2aa03d189c4a652276d2cf10c731 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Wed, 24 Jan 2024 10:54:33 -0500 Subject: [PATCH 26/27] v0.121.x dev --- Cargo.lock | 2 +- crates/zed/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb6c7ab5ea7e7f6bb5422152d01aa6e9220758a6..020daaa10714ee44c394ad7a37b52d7ea5913c05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9704,7 +9704,7 @@ dependencies = [ [[package]] name = "zed" -version = "0.120.0" +version = "0.121.0" dependencies = [ "activity_indicator", "ai", diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index dedab12cd554647693e88d981b7dbb99ca144f06..9203392cf4a9cc75a8ef8acac7ad85f875f3b691 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -2,7 +2,7 @@ description = "The fast, collaborative code editor." edition = "2021" name = "zed" -version = "0.120.0" +version = "0.121.0" publish = false license = "GPL-3.0-only" From f8604e88efb53133697c30417d9a30a3fadb48c7 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Wed, 24 Jan 2024 12:26:15 -0500 Subject: [PATCH 27/27] Add GitHub items --- .../0_feature_parity_report.yml | 24 ++++++++++ .github/ISSUE_TEMPLATE/0_feature_request.yml | 24 ++++++++++ .github/ISSUE_TEMPLATE/1_language_support.yml | 47 +++++++++++++++++++ .github/ISSUE_TEMPLATE/2_bug_report.yml | 38 +++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 13 +++++ .../workflows/update_top_ranking_issues.yml | 17 +++++++ 6 files changed, 163 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/0_feature_parity_report.yml create mode 100644 .github/ISSUE_TEMPLATE/0_feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/1_language_support.yml create mode 100644 .github/ISSUE_TEMPLATE/2_bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/update_top_ranking_issues.yml diff --git a/.github/ISSUE_TEMPLATE/0_feature_parity_report.yml b/.github/ISSUE_TEMPLATE/0_feature_parity_report.yml new file mode 100644 index 0000000000000000000000000000000000000000..7ea5f3f02daf513198d5acca9c4c25dd218863ba --- /dev/null +++ b/.github/ISSUE_TEMPLATE/0_feature_parity_report.yml @@ -0,0 +1,24 @@ +# This is just a temporary template - we will delete this once we move preview to stable +name: Parity Report +description: "Report that a regression occurred in the transition between gpui-1 Zed and gpui-2 Zed" +labels: ["admin read", "triage", "enhancement", "defect", "parity"] +body: + - type: checkboxes + attributes: + label: Check for existing issues + description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it. + options: + - label: Completed + required: true + - type: textarea + attributes: + label: Describe the regression + validations: + required: true + - type: textarea + attributes: + label: | + If necessary, add screenshots of gpui-1 Zed to show the missing feature + description: Drag images into the text input below + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/0_feature_request.yml b/.github/ISSUE_TEMPLATE/0_feature_request.yml new file mode 100644 index 0000000000000000000000000000000000000000..c5e1fa9237e1473c37ec802b844ec7ebebf90b4a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/0_feature_request.yml @@ -0,0 +1,24 @@ +name: Feature Request +description: "Tip: open this issue template from within Zed with the `request feature` command palette action" +labels: ["admin read", "triage", "enhancement"] +body: + - type: checkboxes + attributes: + label: Check for existing issues + description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it. + options: + - label: Completed + required: true + - type: textarea + attributes: + label: Describe the feature + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: | + If applicable, add mockups / screenshots to help present your vision of the feature + description: Drag images into the text input below + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/1_language_support.yml b/.github/ISSUE_TEMPLATE/1_language_support.yml new file mode 100644 index 0000000000000000000000000000000000000000..d004c6c3bdcd9bdaa081b0f27a419803bc9567f6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_language_support.yml @@ -0,0 +1,47 @@ +name: Language Support +description: Request language support +title: " support" +labels: + [ + "admin read", + "triage", + "enhancement", + "language", + "unsupported language", + "potential plugin", + ] +body: + - type: checkboxes + attributes: + label: Check for existing issues + description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it. + options: + - label: Completed + required: true + - type: input + attributes: + label: Language + description: What language do you want support for? + placeholder: HTML + validations: + required: true + - type: input + attributes: + label: Tree Sitter parser link + description: If applicable, provide a link to the appropriate tree sitter parser. Look here first - https://tree-sitter.github.io/tree-sitter/#available-parsers + placeholder: https://github.com/tree-sitter/tree-sitter-html + validations: + required: false + - type: input + attributes: + label: Language server link + description: If applicable, provide a link to the appropriate language server. Look here first - https://microsoft.github.io/language-server-protocol/implementors/servers/ + placeholder: https://github.com/Microsoft/vscode/tree/main/extensions/html-language-features/server + validations: + required: false + - type: textarea + attributes: + label: Misc notes + description: Provide any additional things the team should consider when adding support for this language + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/2_bug_report.yml b/.github/ISSUE_TEMPLATE/2_bug_report.yml new file mode 100644 index 0000000000000000000000000000000000000000..bb8f6ccfcdb219202d257fec8b741c2c88617a62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_bug_report.yml @@ -0,0 +1,38 @@ +name: Bug Report +description: "Tip: open this issue template from within Zed with the `file bug report` command palette action" +labels: ["admin read", "triage", "defect"] +body: + - type: checkboxes + attributes: + label: Check for existing issues + description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it. + options: + - label: Completed + required: true + - type: textarea + attributes: + label: Describe the bug / provide steps to reproduce it + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: environment + attributes: + label: Environment + description: Run the `copy system specs into clipboard` command palette action and paste the output in the field below. + validations: + required: true + - type: textarea + attributes: + label: If applicable, add mockups / screenshots to help explain present your vision of the feature + description: Drag issues into the text input below + validations: + required: false + - type: textarea + attributes: + label: | + If applicable, attach your `~/Library/Logs/Zed/Zed.log` file to this issue. + If you only need the most recent lines, you can run the `zed: open log` command palette action to see the last 1000. + description: Drag Zed.log into the text input below + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..56c7f9bbc3d75fdab578f6cd5e1ba891edcc6115 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,13 @@ +contact_links: + - name: Open Source Checklist + url: https://github.com/zed-industries/community/issues/2197 + about: An issue tracking our progress towards open sourcing Zed + - name: Top-Ranking Issues + url: https://github.com/zed-industries/community/issues/52 + about: See an overview of the most popular Zed issues + - name: Platform Support + url: https://github.com/zed-industries/community/issues/174 + about: A quick note on platform support + - name: Postive Feedback + url: https://github.com/zed-industries/community/discussions/2337 + about: A central location for kind words about Zed diff --git a/.github/workflows/update_top_ranking_issues.yml b/.github/workflows/update_top_ranking_issues.yml new file mode 100644 index 0000000000000000000000000000000000000000..e45efb9c84e537e9c8efff33ab63c7dea4c1bed0 --- /dev/null +++ b/.github/workflows/update_top_ranking_issues.yml @@ -0,0 +1,17 @@ +on: + schedule: + - cron: "0 */12 * * *" + workflow_dispatch: + +jobs: + update_top_ranking_issues: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.10.5" + architecture: "x64" + cache: "pip" + - run: pip install -r scripts/update_top_ranking_issues/requirements.txt + - run: python scripts/update_top_ranking_issues/main.py --github-token ${{ secrets.GITHUB_TOKEN }} --prod