@@ -137,7 +137,7 @@ pub use proposed_changes_editor::{
ProposedChangeLocation, ProposedChangesEditor, ProposedChangesEditorToolbar,
};
use smallvec::smallvec;
-use std::{cell::OnceCell, iter::Peekable};
+use std::{cell::OnceCell, iter::Peekable, ops::Not};
use task::{ResolvedTask, RunnableTag, TaskTemplate, TaskVariables};
pub use lsp::CompletionContext;
@@ -184,7 +184,7 @@ use std::{
cmp::{self, Ordering, Reverse},
mem,
num::NonZeroU32,
- ops::{ControlFlow, Deref, DerefMut, Not as _, Range, RangeInclusive},
+ ops::{ControlFlow, Deref, DerefMut, Range, RangeInclusive},
path::{Path, PathBuf},
rc::Rc,
time::{Duration, Instant},
@@ -711,6 +711,43 @@ impl ScrollbarMarkerState {
}
}
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum MinimapVisibility {
+ Disabled,
+ Enabled(bool),
+}
+
+impl MinimapVisibility {
+ fn for_mode(mode: &EditorMode, cx: &App) -> Self {
+ if mode.is_full() {
+ Self::Enabled(EditorSettings::get_global(cx).minimap.minimap_enabled())
+ } else {
+ Self::Disabled
+ }
+ }
+
+ fn disabled(&self) -> bool {
+ match *self {
+ Self::Disabled => true,
+ _ => false,
+ }
+ }
+
+ fn visible(&self) -> bool {
+ match *self {
+ Self::Enabled(visible) => visible,
+ _ => false,
+ }
+ }
+
+ fn toggle_visibility(&self) -> Self {
+ match *self {
+ Self::Enabled(visible) => Self::Enabled(!visible),
+ Self::Disabled => Self::Disabled,
+ }
+ }
+}
+
#[derive(Clone, Debug)]
struct RunnableTasks {
templates: Vec<(TaskSourceKind, TaskTemplate)>,
@@ -883,7 +920,7 @@ pub struct Editor {
show_breadcrumbs: bool,
show_gutter: bool,
show_scrollbars: bool,
- show_minimap: bool,
+ minimap_visibility: MinimapVisibility,
disable_expand_excerpt_buttons: bool,
show_line_numbers: Option<bool>,
use_relative_line_numbers: Option<bool>,
@@ -1721,7 +1758,7 @@ impl Editor {
blink_manager: blink_manager.clone(),
show_local_selections: true,
show_scrollbars: full_mode,
- show_minimap: full_mode,
+ minimap_visibility: MinimapVisibility::for_mode(&mode, cx),
show_breadcrumbs: EditorSettings::get_global(cx).toolbar.breadcrumbs,
show_gutter: mode.is_full(),
show_line_numbers: None,
@@ -6138,8 +6175,8 @@ impl Editor {
}
}
- pub fn supports_minimap(&self) -> bool {
- self.mode.is_full()
+ pub fn supports_minimap(&self, cx: &App) -> bool {
+ !self.minimap_visibility.disabled() && self.is_singleton(cx)
}
fn edit_predictions_enabled_in_buffer(
@@ -15169,8 +15206,8 @@ impl Editor {
window: &mut Window,
cx: &mut Context<Editor>,
) {
- if self.supports_minimap() {
- self.set_show_minimap(!self.show_minimap, window, cx);
+ if self.supports_minimap(cx) {
+ self.set_minimap_visibility(self.minimap_visibility.toggle_visibility(), window, cx);
}
}
@@ -16441,7 +16478,9 @@ impl Editor {
}
pub fn minimap(&self) -> Option<&Entity<Self>> {
- self.minimap.as_ref().filter(|_| self.show_minimap)
+ self.minimap
+ .as_ref()
+ .filter(|_| self.minimap_visibility.visible())
}
pub fn wrap_guides(&self, cx: &App) -> SmallVec<[(usize, bool); 2]> {
@@ -16638,27 +16677,26 @@ impl Editor {
cx.notify();
}
- pub fn set_show_minimap(
+ pub fn set_minimap_visibility(
&mut self,
- show_minimap: bool,
+ minimap_visibility: MinimapVisibility,
window: &mut Window,
cx: &mut Context<Self>,
) {
- if self.show_minimap != show_minimap {
- self.show_minimap = show_minimap;
- if show_minimap {
+ if self.minimap_visibility != minimap_visibility {
+ if minimap_visibility.visible() && self.minimap.is_none() {
let minimap_settings = EditorSettings::get_global(cx).minimap;
- self.minimap = self.create_minimap(minimap_settings, window, cx);
- } else {
- self.minimap = None;
+ self.minimap =
+ self.create_minimap(minimap_settings.with_show_override(), window, cx);
}
+ self.minimap_visibility = minimap_visibility;
cx.notify();
}
}
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, window, cx);
+ self.set_minimap_visibility(MinimapVisibility::Disabled, window, cx);
}
pub fn set_show_line_numbers(&mut self, show_line_numbers: bool, cx: &mut Context<Self>) {
@@ -18160,8 +18198,12 @@ impl Editor {
}
let minimap_settings = EditorSettings::get_global(cx).minimap;
- if self.show_minimap != minimap_settings.minimap_enabled() {
- self.set_show_minimap(!self.show_minimap, window, cx);
+ if self.minimap_visibility.visible() != minimap_settings.minimap_enabled() {
+ self.set_minimap_visibility(
+ self.minimap_visibility.toggle_visibility(),
+ 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)