activity indicator: fix popover menu appearing for empty lists (#16734)

Piotr Osiewicz and Kirill Bulatov created

Release Notes:

- N/A

---------

Co-authored-by: Kirill Bulatov <kirill@zed.dev>

Change summary

crates/activity_indicator/src/activity_indicator.rs | 26 ++++++++------
1 file changed, 14 insertions(+), 12 deletions(-)

Detailed changes

crates/activity_indicator/src/activity_indicator.rs 🔗

@@ -377,34 +377,36 @@ impl Render for ActivityIndicator {
     fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
         let content = self.content_to_render(cx);
 
-        let mut result = h_flex()
+        let result = h_flex()
             .id("activity-indicator")
             .on_action(cx.listener(Self::show_error_message))
             .on_action(cx.listener(Self::dismiss_error_message));
 
-        if let Some(on_click) = content.on_click {
-            result = result
-                .cursor(CursorStyle::PointingHand)
-                .on_click(cx.listener(move |this, _, cx| {
-                    on_click(this, cx);
-                }))
-        }
         let this = cx.view().downgrade();
         result.gap_2().child(
             PopoverMenu::new("activity-indicator-popover")
                 .trigger(
                     ButtonLike::new("activity-indicator-trigger").child(
                         h_flex()
+                            .id("activity-indicator-status")
                             .gap_2()
                             .children(content.icon)
-                            .child(Label::new(content.message).size(LabelSize::Small)),
+                            .child(Label::new(content.message).size(LabelSize::Small))
+                            .when_some(content.on_click, |this, handler| {
+                                this.on_click(cx.listener(move |this, _, cx| {
+                                    handler(this, cx);
+                                }))
+                                .cursor(CursorStyle::PointingHand)
+                            }),
                     ),
                 )
                 .anchor(gpui::AnchorCorner::BottomLeft)
                 .menu(move |cx| {
                     let strong_this = this.upgrade()?;
-                    ContextMenu::build(cx, |mut menu, cx| {
+                    let mut has_work = false;
+                    let menu = ContextMenu::build(cx, |mut menu, cx| {
                         for work in strong_this.read(cx).pending_language_server_work(cx) {
+                            has_work = true;
                             let this = this.clone();
                             let mut title = work
                                 .progress
@@ -451,8 +453,8 @@ impl Render for ActivityIndicator {
                             }
                         }
                         menu
-                    })
-                    .into()
+                    });
+                    has_work.then_some(menu)
                 }),
         )
     }