diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index ddc7de4e41..525a94f258 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -11257,30 +11257,32 @@ impl Editor { None } + fn target_file<'a>(&self, cx: &'a AppContext) -> Option<&'a dyn language::LocalFile> { + self.active_excerpt(cx)? + .1 + .read(cx) + .file() + .and_then(|f| f.as_local()) + } + pub fn reveal_in_finder(&mut self, _: &RevealInFileManager, cx: &mut ViewContext) { - if let Some(buffer) = self.buffer().read(cx).as_singleton() { - if let Some(file) = buffer.read(cx).file().and_then(|f| f.as_local()) { - cx.reveal_path(&file.abs_path(cx)); - } + if let Some(target) = self.target_file(cx) { + cx.reveal_path(&target.abs_path(cx)); } } pub fn copy_path(&mut self, _: &CopyPath, cx: &mut ViewContext) { - if let Some(buffer) = self.buffer().read(cx).as_singleton() { - if let Some(file) = buffer.read(cx).file().and_then(|f| f.as_local()) { - if let Some(path) = file.abs_path(cx).to_str() { - cx.write_to_clipboard(ClipboardItem::new_string(path.to_string())); - } + if let Some(file) = self.target_file(cx) { + if let Some(path) = file.abs_path(cx).to_str() { + cx.write_to_clipboard(ClipboardItem::new_string(path.to_string())); } } } pub fn copy_relative_path(&mut self, _: &CopyRelativePath, cx: &mut ViewContext) { - if let Some(buffer) = self.buffer().read(cx).as_singleton() { - if let Some(file) = buffer.read(cx).file().and_then(|f| f.as_local()) { - if let Some(path) = file.path().to_str() { - cx.write_to_clipboard(ClipboardItem::new_string(path.to_string())); - } + if let Some(file) = self.target_file(cx) { + if let Some(path) = file.path().to_str() { + cx.write_to_clipboard(ClipboardItem::new_string(path.to_string())); } } } @@ -11491,12 +11493,10 @@ impl Editor { } pub fn copy_file_location(&mut self, _: &CopyFileLocation, cx: &mut ViewContext) { - if let Some(buffer) = self.buffer().read(cx).as_singleton() { - if let Some(file) = buffer.read(cx).file().and_then(|f| f.as_local()) { - if let Some(path) = file.path().to_str() { - let selection = self.selections.newest::(cx).start.row + 1; - cx.write_to_clipboard(ClipboardItem::new_string(format!("{path}:{selection}"))); - } + if let Some(file) = self.target_file(cx) { + if let Some(path) = file.path().to_str() { + let selection = self.selections.newest::(cx).start.row + 1; + cx.write_to_clipboard(ClipboardItem::new_string(format!("{path}:{selection}"))); } } } diff --git a/crates/editor/src/mouse_context_menu.rs b/crates/editor/src/mouse_context_menu.rs index 239d7955a0..936d95dccb 100644 --- a/crates/editor/src/mouse_context_menu.rs +++ b/crates/editor/src/mouse_context_menu.rs @@ -158,6 +158,12 @@ pub fn deploy_context_menu( } let focus = cx.focused(); + let has_reveal_target = editor.target_file(cx).is_some(); + let reveal_in_finder_label = if cfg!(target_os = "macos") { + "Reveal in Finder" + } else { + "Reveal in File Manager" + }; ui::ContextMenu::build(cx, |menu, _cx| { let builder = menu .on_blur_subscription(Subscription::new(|| {})) @@ -180,11 +186,13 @@ pub fn deploy_context_menu( .action("Copy", Box::new(Copy)) .action("Paste", Box::new(Paste)) .separator() - .when(cfg!(target_os = "macos"), |builder| { - builder.action("Reveal in Finder", Box::new(RevealInFileManager)) - }) - .when(cfg!(not(target_os = "macos")), |builder| { - builder.action("Reveal in File Manager", Box::new(RevealInFileManager)) + .map(|builder| { + if has_reveal_target { + builder.action(reveal_in_finder_label, Box::new(RevealInFileManager)) + } else { + builder + .disabled_action(reveal_in_finder_label, Box::new(RevealInFileManager)) + } }) .action("Open in Terminal", Box::new(OpenInTerminal)) .action("Copy Permalink", Box::new(CopyPermalinkToLine));