Make inline and regular diagnostics more related (#34237)

Kirill Bulatov created

Release Notes:

- N/A

Change summary

crates/language_tools/src/lsp_tool.rs    |  1 +
crates/ui/src/components/context_menu.rs | 17 ++++++++++++++++-
crates/zed/src/zed/quick_action_bar.rs   | 17 +++++++++--------
3 files changed, 26 insertions(+), 9 deletions(-)

Detailed changes

crates/language_tools/src/lsp_tool.rs 🔗

@@ -110,6 +110,7 @@ impl LanguageServerHealthStatus {
 
 impl LanguageServerState {
     fn fill_menu(&self, mut menu: ContextMenu, cx: &mut Context<Self>) -> ContextMenu {
+        menu = menu.align_popover_bottom();
         let lsp_logs = cx
             .try_global::<GlobalLogStore>()
             .and_then(|lsp_logs| lsp_logs.0.upgrade());

crates/ui/src/components/context_menu.rs 🔗

@@ -159,6 +159,7 @@ pub struct ContextMenu {
     keep_open_on_confirm: bool,
     documentation_aside: Option<(usize, DocumentationAside)>,
     fixed_width: Option<DefiniteLength>,
+    align_popover_top: bool,
 }
 
 #[derive(Copy, Clone, PartialEq, Eq)]
@@ -215,6 +216,7 @@ impl ContextMenu {
                     key_context: "menu".into(),
                     _on_blur_subscription,
                     keep_open_on_confirm: false,
+                    align_popover_top: true,
                     documentation_aside: None,
                     fixed_width: None,
                     end_slot_action: None,
@@ -257,6 +259,7 @@ impl ContextMenu {
                     key_context: "menu".into(),
                     _on_blur_subscription,
                     keep_open_on_confirm: true,
+                    align_popover_top: true,
                     documentation_aside: None,
                     fixed_width: None,
                     end_slot_action: None,
@@ -297,6 +300,7 @@ impl ContextMenu {
                     |this: &mut ContextMenu, window, cx| this.cancel(&menu::Cancel, window, cx),
                 ),
                 keep_open_on_confirm: false,
+                align_popover_top: true,
                 documentation_aside: None,
                 fixed_width: None,
                 end_slot_action: None,
@@ -778,6 +782,11 @@ impl ContextMenu {
         self
     }
 
+    pub fn align_popover_bottom(mut self) -> Self {
+        self.align_popover_top = false;
+        self
+    }
+
     fn render_menu_item(
         &self,
         ix: usize,
@@ -1100,7 +1109,13 @@ impl Render for ContextMenu {
             .when(is_wide_window, |this| this.flex_row())
             .when(!is_wide_window, |this| this.flex_col())
             .w_full()
-            .items_start()
+            .map(|div| {
+                if self.align_popover_top {
+                    div.items_start()
+                } else {
+                    div.items_end()
+                }
+            })
             .gap_1()
             .child(div().children(aside.clone().and_then(|(_, aside)| {
                 (aside.side == DocumentationSide::Left).then(|| render_aside(aside, cx))

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

@@ -409,12 +409,10 @@ impl Render for QuickActionBar {
                                 );
 
                                 if supports_inline_diagnostics {
-                                    menu = menu.toggleable_entry(
-                                        "Inline Diagnostics",
-                                        inline_diagnostics_enabled,
-                                        IconPosition::Start,
-                                        Some(ToggleInlineDiagnostics.boxed_clone()),
-                                        {
+                                    let mut inline_diagnostics_item = ContextMenuEntry::new("Inline Diagnostics")
+                                        .toggleable(IconPosition::Start, diagnostics_enabled && inline_diagnostics_enabled)
+                                        .action(ToggleInlineDiagnostics.boxed_clone())
+                                        .handler({
                                             let editor = editor.clone();
                                             move |window, cx| {
                                                 editor
@@ -427,8 +425,11 @@ impl Render for QuickActionBar {
                                                     })
                                                     .ok();
                                             }
-                                        },
-                                    );
+                                        });
+                                    if !diagnostics_enabled {
+                                        inline_diagnostics_item = inline_diagnostics_item.disabled(true).documentation_aside(DocumentationSide::Left, |_|  Label::new("Inline diagnostics are not available until regular diagnostics are enabled.").into_any_element());
+                                    }
+                                    menu = menu.item(inline_diagnostics_item)
                                 }
 
                                 menu = menu.separator();