From 2b6280ad5675bbd183e14f9fb63c889b77fb1a4e Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 8 May 2025 20:58:24 +0300 Subject: [PATCH] Add minimap into the editor controls (#30285) Follow-up of https://github.com/zed-industries/zed/pull/26893 Release Notes: - N/A --- crates/agent/src/inline_assistant.rs | 2 +- .../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(-) diff --git a/crates/agent/src/inline_assistant.rs b/crates/agent/src/inline_assistant.rs index 075d5a588c..7bb04f2132 100644 --- a/crates/agent/src/inline_assistant.rs +++ b/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); diff --git a/crates/assistant_context_editor/src/context_editor.rs b/crates/assistant_context_editor/src/context_editor.rs index 74f09b8c72..d725943655 100644 --- a/crates/assistant_context_editor/src/context_editor.rs +++ b/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); diff --git a/crates/assistant_tools/src/edit_file_tool.rs b/crates/assistant_tools/src/edit_file_tool.rs index 3499a20f98..acad0133ed 100644 --- a/crates/assistant_tools/src/edit_file_tool.rs +++ b/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); diff --git a/crates/editor/src/actions.rs b/crates/editor/src/actions.rs index 3c3033c491..38ee4148f2 100644 --- a/crates/editor/src/actions.rs +++ b/crates/editor/src/actions.rs @@ -431,6 +431,7 @@ actions!( ToggleInlineDiagnostics, ToggleEditPrediction, ToggleLineNumbers, + ToggleMinimap, SwapSelectionEnds, SetMark, ToggleRelativeLineNumbers, diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 92f92a3d1c..8690f06ba6 100644 --- a/crates/editor/src/editor.rs +++ b/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, @@ -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, + ) { + 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.show_minimap = show_minimap; - cx.notify(); + pub fn set_show_minimap( + &mut self, + show_minimap: bool, + window: &mut Window, + cx: &mut Context, + ) { + 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) { + pub fn disable_scrollbars_and_minimap(&mut self, window: &mut Window, cx: &mut Context) { 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) { @@ -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) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index e44f3b1893..7dda55f693 100644 --- a/crates/editor/src/element.rs +++ b/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); diff --git a/crates/zed/src/zed/quick_action_bar.rs b/crates/zed/src/zed/quick_action_bar.rs index 07623b508f..e75acc2d0c 100644 --- a/crates/zed/src/zed/quick_action_bar.rs +++ b/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) diff --git a/crates/zeta/src/rate_completion_modal.rs b/crates/zeta/src/rate_completion_modal.rs index c99a75acf4..811b838ebc 100644 --- a/crates/zeta/src/rate_completion_modal.rs +++ b/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);