Add minimap into the editor controls (#30285)

Kirill Bulatov created

Follow-up of https://github.com/zed-industries/zed/pull/26893

Release Notes:

- N/A

Change summary

crates/agent/src/inline_assistant.rs                  |  2 
crates/assistant_context_editor/src/context_editor.rs |  2 
crates/assistant_tools/src/edit_file_tool.rs          |  2 
crates/editor/src/actions.rs                          |  1 
crates/editor/src/editor.rs                           | 42 ++++++++++--
crates/editor/src/element.rs                          |  1 
crates/zed/src/zed/quick_action_bar.rs                | 20 +++++
crates/zeta/src/rate_completion_modal.rs              |  2 
8 files changed, 60 insertions(+), 12 deletions(-)

Detailed changes

crates/agent/src/inline_assistant.rs 🔗

@@ -1407,7 +1407,7 @@ impl InlineAssistant {
 
                     enum DeletedLines {}
                     let mut editor = Editor::for_multibuffer(multi_buffer, None, window, cx);
-                    editor.disable_scrollbars_and_minimap(cx);
+                    editor.disable_scrollbars_and_minimap(window, cx);
                     editor.set_soft_wrap_mode(language::language_settings::SoftWrap::None, cx);
                     editor.set_show_wrap_guides(false, cx);
                     editor.set_show_gutter(false, cx);

crates/assistant_context_editor/src/context_editor.rs 🔗

@@ -226,7 +226,7 @@ impl ContextEditor {
         let editor = cx.new(|cx| {
             let mut editor =
                 Editor::for_buffer(context.read(cx).buffer().clone(), None, window, cx);
-            editor.disable_scrollbars_and_minimap(cx);
+            editor.disable_scrollbars_and_minimap(window, cx);
             editor.set_soft_wrap_mode(SoftWrap::EditorWidth, cx);
             editor.set_show_line_numbers(false, cx);
             editor.set_show_git_diff_gutter(false, cx);

crates/assistant_tools/src/edit_file_tool.rs 🔗

@@ -359,7 +359,7 @@ impl EditFileToolCard {
             editor.set_show_gutter(false, cx);
             editor.disable_inline_diagnostics();
             editor.disable_expand_excerpt_buttons(cx);
-            editor.disable_scrollbars_and_minimap(cx);
+            editor.disable_scrollbars_and_minimap(window, cx);
             editor.set_soft_wrap_mode(SoftWrap::None, cx);
             editor.scroll_manager.set_forbid_vertical_scroll(true);
             editor.set_show_indent_guides(false, cx);

crates/editor/src/actions.rs 🔗

@@ -431,6 +431,7 @@ actions!(
         ToggleInlineDiagnostics,
         ToggleEditPrediction,
         ToggleLineNumbers,
+        ToggleMinimap,
         SwapSelectionEnds,
         SetMark,
         ToggleRelativeLineNumbers,

crates/editor/src/editor.rs 🔗

@@ -6107,6 +6107,10 @@ impl Editor {
         }
     }
 
+    pub fn supports_minimap(&self) -> bool {
+        self.mode.is_full()
+    }
+
     fn edit_predictions_enabled_in_buffer(
         &self,
         buffer: &Entity<Buffer>,
@@ -15087,6 +15091,17 @@ impl Editor {
         self.refresh_inline_diagnostics(false, window, cx);
     }
 
+    pub fn toggle_minimap(
+        &mut self,
+        _: &ToggleMinimap,
+        window: &mut Window,
+        cx: &mut Context<Editor>,
+    ) {
+        if self.supports_minimap() {
+            self.set_show_minimap(!self.show_minimap, window, cx);
+        }
+    }
+
     fn refresh_inline_diagnostics(
         &mut self,
         debounce: bool,
@@ -16544,14 +16559,27 @@ impl Editor {
         cx.notify();
     }
 
-    pub fn set_show_minimap(&mut self, show_minimap: bool, cx: &mut Context<Self>) {
-        self.show_minimap = show_minimap;
-        cx.notify();
+    pub fn set_show_minimap(
+        &mut self,
+        show_minimap: bool,
+        window: &mut Window,
+        cx: &mut Context<Self>,
+    ) {
+        if self.show_minimap != show_minimap {
+            self.show_minimap = show_minimap;
+            if show_minimap {
+                let minimap_settings = EditorSettings::get_global(cx).minimap;
+                self.minimap = self.create_minimap(minimap_settings, window, cx);
+            } else {
+                self.minimap = None;
+            }
+            cx.notify();
+        }
     }
 
-    pub fn disable_scrollbars_and_minimap(&mut self, cx: &mut Context<Self>) {
+    pub fn disable_scrollbars_and_minimap(&mut self, window: &mut Window, cx: &mut Context<Self>) {
         self.set_show_scrollbars(false, cx);
-        self.set_show_minimap(false, cx);
+        self.set_show_minimap(false, window, cx);
     }
 
     pub fn set_show_line_numbers(&mut self, show_line_numbers: bool, cx: &mut Context<Self>) {
@@ -18045,8 +18073,8 @@ impl Editor {
             }
 
             let minimap_settings = EditorSettings::get_global(cx).minimap;
-            if self.minimap.as_ref().is_some() != minimap_settings.minimap_enabled() {
-                self.minimap = self.create_minimap(minimap_settings, window, cx);
+            if self.show_minimap != minimap_settings.minimap_enabled() {
+                self.set_show_minimap(!self.show_minimap, window, cx);
             } else if let Some(minimap_entity) = self.minimap.as_ref() {
                 minimap_entity.update(cx, |minimap_editor, cx| {
                     minimap_editor.update_minimap_configuration(minimap_settings, cx)

crates/editor/src/element.rs 🔗

@@ -428,6 +428,7 @@ impl EditorElement {
         register_action(editor, window, Editor::toggle_inlay_hints);
         register_action(editor, window, Editor::toggle_edit_predictions);
         register_action(editor, window, Editor::toggle_inline_diagnostics);
+        register_action(editor, window, Editor::toggle_minimap);
         register_action(editor, window, hover_popover::hover);
         register_action(editor, window, Editor::reveal_in_finder);
         register_action(editor, window, Editor::copy_path);

crates/zed/src/zed/quick_action_bar.rs 🔗

@@ -101,6 +101,8 @@ impl Render for QuickActionBar {
         let show_edit_predictions = editor_value.edit_predictions_enabled();
         let edit_predictions_enabled_at_cursor =
             editor_value.edit_predictions_enabled_at_cursor(cx);
+        let supports_minimap = editor_value.supports_minimap();
+        let minimap_enabled = supports_minimap && editor_value.minimap().is_some();
 
         let focus_handle = editor_value.focus_handle(cx);
 
@@ -244,7 +246,6 @@ impl Render for QuickActionBar {
                                         }
                                     }
                                 );
-
                             }
 
                             if supports_inline_diagnostics {
@@ -270,6 +271,23 @@ impl Render for QuickActionBar {
                                 );
                             }
 
+                            if supports_minimap {
+                                menu = menu.toggleable_entry("Minimap", minimap_enabled, IconPosition::Start, Some(editor::actions::ToggleMinimap.boxed_clone()), {
+                                    let editor = editor.clone();
+                                    move |window, cx| {
+                                        editor
+                                            .update(cx, |editor, cx| {
+                                                editor.toggle_minimap(
+                                                    &editor::actions::ToggleMinimap,
+                                                    window,
+                                                    cx,
+                                                );
+                                            })
+                                            .ok();
+                                    }
+                                },)
+                            }
+
                             if has_edit_prediction_provider {
                                 let mut inline_completion_entry = ContextMenuEntry::new("Edit Predictions")
                                     .toggleable(IconPosition::Start, edit_predictions_enabled_at_cursor && show_edit_predictions)

crates/zeta/src/rate_completion_modal.rs 🔗

@@ -275,7 +275,7 @@ impl RateCompletionModal {
             completion,
             feedback_editor: cx.new(|cx| {
                 let mut editor = Editor::multi_line(window, cx);
-                editor.disable_scrollbars_and_minimap(cx);
+                editor.disable_scrollbars_and_minimap(window, cx);
                 editor.set_soft_wrap_mode(language_settings::SoftWrap::EditorWidth, cx);
                 editor.set_show_line_numbers(false, cx);
                 editor.set_show_git_diff_gutter(false, cx);