Merge branch 'main' into implicit-ancestry

Antonio Scandurra created

Change summary

crates/editor/src/editor.rs       | 44 +++++++++++++++++---------------
crates/vim/src/editor_events.rs   |  4 --
crates/vim/src/vim.rs             |  7 ++++
crates/workspace/src/sidebar.rs   | 28 +++++++++++++++-----
crates/workspace/src/workspace.rs |  5 ++-
5 files changed, 54 insertions(+), 34 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -5682,28 +5682,30 @@ impl Editor {
             }
         } else if !definitions.is_empty() {
             let replica_id = self.replica_id(cx);
-            let title = definitions
-                .iter()
-                .find(|definition| definition.origin.is_some())
-                .and_then(|definition| {
-                    definition.origin.as_ref().map(|origin| {
-                        let buffer = origin.buffer.read(cx);
-                        format!(
-                            "Definitions for {}",
-                            buffer
-                                .text_for_range(origin.range.clone())
-                                .collect::<String>()
-                        )
+            cx.window_context().defer(move |cx| {
+                let title = definitions
+                    .iter()
+                    .find(|definition| definition.origin.is_some())
+                    .and_then(|definition| {
+                        definition.origin.as_ref().map(|origin| {
+                            let buffer = origin.buffer.read(cx);
+                            format!(
+                                "Definitions for {}",
+                                buffer
+                                    .text_for_range(origin.range.clone())
+                                    .collect::<String>()
+                            )
+                        })
                     })
-                })
-                .unwrap_or("Definitions".to_owned());
-            let locations = definitions
-                .into_iter()
-                .map(|definition| definition.target)
-                .collect();
-            workspace.update(cx, |workspace, cx| {
-                Self::open_locations_in_multibuffer(workspace, locations, replica_id, title, cx)
-            })
+                    .unwrap_or("Definitions".to_owned());
+                let locations = definitions
+                    .into_iter()
+                    .map(|definition| definition.target)
+                    .collect();
+                workspace.update(cx, |workspace, cx| {
+                    Self::open_locations_in_multibuffer(workspace, locations, replica_id, title, cx)
+                });
+            });
         }
     }
 

crates/vim/src/editor_events.rs 🔗

@@ -35,9 +35,7 @@ fn blurred(EditorBlurred(editor): &EditorBlurred, cx: &mut AppContext) {
                 }
             }
 
-            cx.update_window(editor.window_id(), |cx| {
-                editor.update(cx, |editor, cx| Vim::unhook_vim_settings(editor, cx))
-            });
+            editor.update(cx, |editor, cx| Vim::unhook_vim_settings(editor, cx))
         });
     });
 }

crates/vim/src/vim.rs 🔗

@@ -84,7 +84,12 @@ pub fn init(cx: &mut AppContext) {
         Vim::active_editor_input_ignored("\n".into(), cx)
     });
 
-    // Any time settings change, update vim mode to match.
+    // Any time settings change, update vim mode to match. The Vim struct
+    // will be initialized as disabled by default, so we filter its commands
+    // out when starting up.
+    cx.update_default_global::<CommandPaletteFilter, _, _>(|filter, _| {
+        filter.filtered_namespaces.insert("vim");
+    });
     cx.update_default_global(|vim: &mut Vim, cx: &mut AppContext| {
         vim.set_enabled(cx.global::<Settings>().vim_mode, cx)
     });

crates/workspace/src/sidebar.rs 🔗

@@ -1,7 +1,7 @@
-use crate::StatusItemView;
+use crate::{StatusItemView, Workspace};
 use gpui::{
     elements::*, impl_actions, platform::CursorStyle, platform::MouseButton, AnyViewHandle,
-    AppContext, Entity, Subscription, View, ViewContext, ViewHandle, WindowContext,
+    AppContext, Entity, Subscription, View, ViewContext, ViewHandle, WeakViewHandle, WindowContext,
 };
 use serde::Deserialize;
 use settings::Settings;
@@ -84,6 +84,7 @@ struct Item {
 
 pub struct SidebarButtons {
     sidebar: ViewHandle<Sidebar>,
+    workspace: WeakViewHandle<Workspace>,
 }
 
 #[derive(Clone, Debug, Deserialize, PartialEq)]
@@ -210,9 +211,13 @@ impl View for Sidebar {
 }
 
 impl SidebarButtons {
-    pub fn new(sidebar: ViewHandle<Sidebar>, cx: &mut ViewContext<Self>) -> Self {
+    pub fn new(
+        sidebar: ViewHandle<Sidebar>,
+        workspace: WeakViewHandle<Workspace>,
+        cx: &mut ViewContext<Self>,
+    ) -> Self {
         cx.observe(&sidebar, |_, _, cx| cx.notify()).detach();
-        Self { sidebar }
+        Self { sidebar, workspace }
     }
 }
 
@@ -279,9 +284,18 @@ impl View for SidebarButtons {
                             .with_style(style.container)
                     })
                     .with_cursor_style(CursorStyle::PointingHand)
-                    .on_click(MouseButton::Left, move |_, this, cx| {
-                        this.sidebar
-                            .update(cx, |sidebar, cx| sidebar.toggle_item(ix, cx));
+                    .on_click(MouseButton::Left, {
+                        let action = action.clone();
+                        move |_, this, cx| {
+                            if let Some(workspace) = this.workspace.upgrade(cx) {
+                                let action = action.clone();
+                                cx.window_context().defer(move |cx| {
+                                    workspace.update(cx, |workspace, cx| {
+                                        workspace.toggle_sidebar_item(&action, cx)
+                                    });
+                                });
+                            }
+                        }
                     })
                     .with_tooltip::<Self>(
                         ix,

crates/workspace/src/workspace.rs 🔗

@@ -579,10 +579,11 @@ impl Workspace {
 
         let left_sidebar = cx.add_view(|_| Sidebar::new(SidebarSide::Left));
         let right_sidebar = cx.add_view(|_| Sidebar::new(SidebarSide::Right));
-        let left_sidebar_buttons = cx.add_view(|cx| SidebarButtons::new(left_sidebar.clone(), cx));
+        let left_sidebar_buttons =
+            cx.add_view(|cx| SidebarButtons::new(left_sidebar.clone(), weak_handle.clone(), cx));
         let toggle_dock = cx.add_view(|cx| ToggleDockButton::new(handle, cx));
         let right_sidebar_buttons =
-            cx.add_view(|cx| SidebarButtons::new(right_sidebar.clone(), cx));
+            cx.add_view(|cx| SidebarButtons::new(right_sidebar.clone(), weak_handle.clone(), cx));
         let status_bar = cx.add_view(|cx| {
             let mut status_bar = StatusBar::new(&center_pane.clone(), cx);
             status_bar.add_left_item(left_sidebar_buttons, cx);