Optimize user menu trigger

Piotr Osiewicz created

Change summary

crates/collab_ui/src/collab_titlebar_item.rs | 34 +++++++++++----------
1 file changed, 18 insertions(+), 16 deletions(-)

Detailed changes

crates/collab_ui/src/collab_titlebar_item.rs 🔗

@@ -49,7 +49,8 @@ pub struct CollabTitlebarItem {
     client: Arc<Client>,
     workspace: WeakViewHandle<Workspace>,
     contacts_popover: Option<ViewHandle<ContactsPopover>>,
-    user_menu: Option<ViewHandle<ContextMenu>>,
+    user_menu: ViewHandle<ContextMenu>,
+    user_menu_is_visible: bool,
     _subscriptions: Vec<Subscription>,
 }
 
@@ -176,7 +177,13 @@ impl CollabTitlebarItem {
             user_store,
             client,
             contacts_popover: None,
-            user_menu: None,
+            user_menu: cx.add_view(|cx| {
+                let view_id = cx.view_id();
+                let mut menu = ContextMenu::new(view_id, cx);
+                menu.set_position_mode(OverlayPositionMode::Local);
+                menu
+            }),
+            user_menu_is_visible: false,
             _subscriptions: subscriptions,
         }
     }
@@ -289,14 +296,8 @@ impl CollabTitlebarItem {
     }
 
     pub fn toggle_user_menu(&mut self, _: &ToggleUserMenu, cx: &mut ViewContext<Self>) {
-        if self.user_menu.take().is_none() {
-            let user_menu = cx.add_view(|cx| {
-                let view_id = cx.view_id();
-                let mut menu = ContextMenu::new(view_id, cx);
-                menu.set_position_mode(OverlayPositionMode::Local);
-                menu
-            });
-            user_menu.update(cx, |user_menu, cx| {
+        if !self.user_menu_is_visible {
+            self.user_menu.update(cx, |user_menu, cx| {
                 let items = if let Some(_) = self.user_store.read(cx).current_user() {
                     vec![
                         ContextMenuItem::action("Settings", zed_actions::OpenSettings),
@@ -322,8 +323,8 @@ impl CollabTitlebarItem {
 
                 user_menu.show(Default::default(), AnchorCorner::TopRight, items, cx);
             });
-            self.user_menu = Some(user_menu);
         }
+        self.user_menu_is_visible = !self.user_menu_is_visible;
     }
 
     fn render_toggle_contacts_button(
@@ -699,11 +700,12 @@ impl CollabTitlebarItem {
                 )
                 .contained(),
             )
-            .with_children(
-                self.user_menu
-                    .as_ref()
-                    .map(|menu| ChildView::new(&menu, cx).aligned().bottom().right()),
-            )
+            .with_children(self.user_menu_is_visible.then(|| {
+                ChildView::new(&self.user_menu, cx)
+                    .aligned()
+                    .bottom()
+                    .right()
+            }))
             .into_any()
     }