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 4dbc7be652..b91d5381a0 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 4a4c328fd0..edd998c848 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 7376156231..a3ca3651fc 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 a3ca3651fc..aa325db454 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 0000000000..57e3cc7c59 --- /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 7c36aebf57..f1bfe7ef4e 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 268410245e..38caa1b260 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 7ccdf8c2bf..4a951fb48d 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 d196b19636..8c12c1c970 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 edd998c848..1ae632dfde 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 ed74bf4060..145597b039 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 dadc3d5ad3..caf7cddf69 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 4a951fb48d..a0bbf6fc79 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 13fc620076..2b5bf9166e 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 8ecfd8ad6d..5e5618721b 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 b8c152ae40..9dd41fa25d 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 dadcc62842..65d2e06d35 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 b2ed144a3f..6be7289d8a 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 e145946024..cb275eb944 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 5e5618721b..f821ba34ef 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 a01e73f5ef..b830d19fee 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 cb275eb944..1ced697986 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 f821ba34ef..4a1cf41193 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 1ced697986..9b087a9752 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 4a1cf41193..638e94de39 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 63ee1af759..e32e39a2d1 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 1ae632dfde..1bf0720459 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 6cc56e306b..15042cbf59 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 b3d7f9b0ec..4ddeaaff65 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 1bf0720459..4f49b4a716 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 10209f6e88..cc7eeb1a8a 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 c75ea2f52f..73ae0f9b7e 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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

s!UNnUhva~h|L=l& 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୬l%OjD z%@}MLoESV9{1`$Qq8Jhw(in0WilC}NBcy^1;taCjHBZ_Mh79HmwhYb;o(%pBp$yRs zi45rsxu7*&iHSKSOuNA3AuxFgOkM($x4`710nB0?Bnp?zt2uz*;ljp$X6)<@VOg_j5 znfVM%z5$b;z~m1w`42?0u;dq|z~nVBd8fG8z=Y)yn0x^y-+{?5VDcA;WMwEW zHZWyn1Cu;pQV2{+fJr$psZv~;RLrUcCJn%(8JM&IlTKjLqqwx7nAHzVhJeW^Fqr@* z)4*g-RccW_YY~{N0F!lKvIR_bfyoKrm13a&ET|t#EDc(P0#Z*L%?KXL!cT%uLk0EC ziKQ7CKz(OIB&fH}2p%KDO@hWF7(sj3!1E)Z5CGlC2`as?vq57CpnY#3SzK(;7#}0J zY{N~8fc7we_JuMq;v_-ib&TNEB3MaA1qMb2en!xWA$~>?Fq;oda)3$D2n9bQ$ejWV zzZe)91Q@=6$#-D#1((L;4s8Pf_5x{wk<_%Vbr#4)5X6fjgUG%$29OkkM7 zuz+C&!v=;O3%BP+AU3gIAt2FfxKxse|@=g+RsApmYk9PJ+@2PdzhDj)vN%kSO0^&V?Cx zL2D+NXEN_*p256_c`x%m=KahEm=7`^Vm{1#g!w4*G3MjUpc0gYF@iCX@fQ4l*Nw3d+BoY{c^RKGGZJ2HELSxhMELF3Kt4DJjJ z3|bg&2hyMHodv z`Wa&wK;!Qay`UK)MzDQM3?N&W!KSf*$33LMtKH~c`%*?^e!Jq=}U#c?mGYc}PF$*(`F=&ET zp)%-#dzSjl%FL<^2Fx1FnheIEb*T)d%=*m63>FNaJ`yC3K 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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 diff --git a/assets/fonts/plex/IBMPlexSans-Regular.ttf b/assets/fonts/plex/IBMPlexSans-Regular.ttf deleted file mode 100644 index 9e4b0a754a9e211c119c3727d330f5a46120fc67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192980 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 diff --git a/assets/fonts/plex/LICENSE.txt b/assets/fonts/plex/LICENSE.txt deleted file mode 100644 index c35c4c618f..0000000000 --- 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 b94881d1b0..3c714ad5da 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 191cadf293..e7377373fe 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 dd7b7b571e..95b41c3b2c 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(), - }); + 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))) + } } - - 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 - } - }) - .boxed() - .shared(); + .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 | 132 ++++++++++-------- crates/semantic_index/src/semantic_index.rs | 7 +- 4 files changed, 83 insertions(+), 69 deletions(-) diff --git a/crates/ai/src/providers/open_ai/completion.rs b/crates/ai/src/providers/open_ai/completion.rs index 0e325ee624..fda4d69816 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 0a9b6ba969..1dca571733 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 1f57e52032..097c6424d7 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!( - messages(&deserialized_conversation, cx), + deserialized_buffer.read_with(cx, |buffer, _| buffer.text()), + "a\nb\nc\n" + ); + assert_eq!( + 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 a556986f9b..475ab079dc 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 cc7eeb1a8a..dd134576f5 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 dd134576f5..ab8e248ac0 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 ab8e248ac0..7f164c6e69 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 | 81 ++++++--- 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 | 171 ++++++++++-------- crates/gpui/src/platform/test/platform.rs | 15 +- crates/semantic_index/src/semantic_index.rs | 42 ++++- crates/zed/src/main.rs | 2 +- 12 files changed, 370 insertions(+), 214 deletions(-) diff --git a/crates/ai/src/auth.rs b/crates/ai/src/auth.rs index 1ea49bd615..62556d7183 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 fda4d69816..aa58950113 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 1dca571733..89aebb1b76 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 - } - - fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential) { - *self.credential.write() = credential.clone(); - match credential { - ProviderCredential::Credentials { api_key } => { - cx.write_credentials(OPENAI_API_URL, "Bearer", api_key.as_bytes()) - .log_err(); - } - _ => {} + async move { + let retrieved_credential = retrieved_credential.await; + *self.credential.write() = retrieved_credential.clone(); + retrieved_credential } + .boxed() } - fn delete_credentials(&self, cx: &mut AppContext) { - cx.delete_credentials(OPENAI_API_URL).log_err(); + fn save_credentials( + &self, + cx: &mut AppContext, + credential: ProviderCredential, + ) -> BoxFuture<()> { + *self.credential.write() = credential.clone(); + let credential = credential.clone(); + let write_credentials = match credential { + ProviderCredential::Credentials { api_key } => { + 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) -> 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 3d59febbe9..89edc71b0b 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 097c6424d7..b2c539fcc2 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 844c9a5eb6..370a2ba6ff 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 dfecffb80a..6f75eafaf2 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 900b17bb2c..3d2679dd7e 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 e4a688c2fd..58a759865e 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); + 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::*; - 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()); + // 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 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(), - ); + 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(()) + Ok(()) + }) } - fn read_credentials(&self, url: &str) -> Result)>> { - let url = CFString::from(url); - let cf_true = CFBoolean::true_value().as_CFTypeRef(); + 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::*; + 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); + // 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 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 9a33b4b3b5..5aadc4b760 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 475ab079dc..62773cced8 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); - } else { - return true; - } + 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; + } - self.embedding_provider.has_credentials() + embedding_provider.has_credentials() + }) + } else { + Task::ready(true) + } } 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 6486fc5db4..5abb046165 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 debf7fa299..1049626d1e 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 cb6c7ab5ea..020daaa107 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 dedab12cd5..9203392cf4 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 0000000000..7ea5f3f02d --- /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 0000000000..c5e1fa9237 --- /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 0000000000..d004c6c3bd --- /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 0000000000..bb8f6ccfcd --- /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 0000000000..56c7f9bbc3 --- /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 0000000000..e45efb9c84 --- /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