diff --git a/crates/diagnostics/src/diagnostics.rs b/crates/diagnostics/src/diagnostics.rs index 1076c7da3b..c78d54e424 100644 --- a/crates/diagnostics/src/diagnostics.rs +++ b/crates/diagnostics/src/diagnostics.rs @@ -28,7 +28,7 @@ use std::{ sync::Arc, }; use util::TryFutureExt; -use workspace::{ItemNavHistory, Workspace}; +use workspace::{ItemNavHistory, ItemViewHandle as _, Workspace}; action!(Deploy); action!(OpenExcerpts); @@ -573,7 +573,7 @@ impl workspace::ItemView for ProjectDiagnosticsEditor { } fn save(&mut self, cx: &mut ViewContext) -> Task> { - self.excerpts.update(cx, |excerpts, cx| excerpts.save(cx)) + self.editor.save(cx) } fn can_save_as(&self, _: &AppContext) -> bool { diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 964039762a..d18feca2b9 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -883,16 +883,7 @@ impl Editor { } pub fn title(&self, cx: &AppContext) -> String { - let filename = self - .buffer() - .read(cx) - .file(cx) - .map(|file| file.file_name(cx)); - if let Some(name) = filename { - name.to_string_lossy().into() - } else { - "untitled".into() - } + self.buffer().read(cx).title(cx) } pub fn snapshot(&mut self, cx: &mut MutableAppContext) -> EditorSnapshot { @@ -2120,6 +2111,7 @@ impl Editor { }; let action_ix = action_ix.unwrap_or(actions_menu.selected_item); let action = actions_menu.actions.get(action_ix)?.clone(); + let title = action.lsp_action.title.clone(); let buffer = actions_menu.buffer; let replica_id = editor.read(cx).replica_id(cx); @@ -2131,7 +2123,7 @@ impl Editor { let mut ranges_to_highlight = Vec::new(); let excerpt_buffer = cx.add_model(|cx| { - let mut multibuffer = MultiBuffer::new(replica_id); + let mut multibuffer = MultiBuffer::new(replica_id).with_title(title); for (buffer, transaction) in &project_transaction.0 { let snapshot = buffer.read(cx).snapshot(); ranges_to_highlight.extend( @@ -2152,7 +2144,12 @@ impl Editor { let editor = workspace.open_item(MultiBufferItemHandle(excerpt_buffer), cx); if let Some(editor) = editor.act_as::(cx) { editor.update(cx, |editor, cx| { - editor.highlight_ranges::(ranges_to_highlight, Color::blue(), cx); + let settings = (editor.build_settings)(cx); + editor.highlight_ranges::( + ranges_to_highlight, + settings.style.highlighted_line_background, + cx, + ); }); } }); diff --git a/crates/editor/src/items.rs b/crates/editor/src/items.rs index 9f868c2764..d27f607d1d 100644 --- a/crates/editor/src/items.rs +++ b/crates/editor/src/items.rs @@ -218,7 +218,7 @@ impl ItemView for Editor { } fn can_save(&self, cx: &AppContext) -> bool { - self.project_path(cx).is_some() + !self.buffer().read(cx).is_singleton() || self.project_path(cx).is_some() } fn save(&mut self, cx: &mut ViewContext) -> Task> { @@ -235,8 +235,8 @@ impl ItemView for Editor { }) } - fn can_save_as(&self, _: &AppContext) -> bool { - true + fn can_save_as(&self, cx: &AppContext) -> bool { + self.buffer().read(cx).is_singleton() } fn save_as( diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index cd9fbfd382..b96789915d 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -39,6 +39,7 @@ pub struct MultiBuffer { singleton: bool, replica_id: ReplicaId, history: History, + title: Option, } struct History { @@ -167,9 +168,15 @@ impl MultiBuffer { transaction_depth: 0, group_interval: Duration::from_millis(300), }, + title: Default::default(), } } + pub fn with_title(mut self, title: String) -> Self { + self.title = Some(title); + self + } + pub fn singleton(buffer: ModelHandle, cx: &mut ModelContext) -> Self { let mut this = Self::new(buffer.read(cx).replica_id()); this.singleton = true; @@ -227,6 +234,10 @@ impl MultiBuffer { } } + pub fn is_singleton(&self) -> bool { + self.singleton + } + pub fn subscribe(&mut self) -> Subscription { self.subscriptions.subscribe() } @@ -945,6 +956,16 @@ impl MultiBuffer { self.as_singleton()?.read(cx).file() } + pub fn title(&self, cx: &AppContext) -> String { + if let Some(title) = self.title.clone() { + title + } else if let Some(file) = self.file(cx) { + file.file_name(cx).to_string_lossy().into() + } else { + "untitled".into() + } + } + #[cfg(test)] pub fn is_parsing(&self, cx: &AppContext) -> bool { self.as_singleton().unwrap().read(cx).is_parsing()