ui: Make hitting enter also open the context menu submenu (#46032)

Danilo Leal created

This PR makes hitting `enter`/`return` in a submenu trigger also open
and focus the submenu instead of closing the parent menu. Building on
feedback from @SomeoneToIgnore:
https://github.com/zed-industries/zed/pull/45882#issuecomment-3708275031.

Release Notes:

- N/A

Change summary

crates/ui/src/components/context_menu.rs | 28 +++++++++++++++++++++++++
1 file changed, 27 insertions(+), 1 deletion(-)

Detailed changes

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

@@ -834,7 +834,33 @@ impl ContextMenu {
     }
 
     pub fn confirm(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context<Self>) {
+        let Some(ix) = self.selected_index else {
+            return;
+        };
+
+        if let Some(ContextMenuItem::Submenu { builder, .. }) = self.items.get(ix) {
+            self.open_submenu(
+                ix,
+                builder.clone(),
+                SubmenuOpenTrigger::Keyboard,
+                window,
+                cx,
+            );
+
+            if let SubmenuState::Open(open_submenu) = &self.submenu_state {
+                let focus_handle = open_submenu.entity.read(cx).focus_handle.clone();
+                window.focus(&focus_handle, cx);
+                open_submenu.entity.update(cx, |submenu, cx| {
+                    submenu.select_first(&SelectFirst, window, cx);
+                });
+            }
+
+            cx.notify();
+            return;
+        }
+
         let context = self.action_context.as_ref();
+
         if let Some(
             ContextMenuItem::Entry(ContextMenuEntry {
                 handler,
@@ -842,7 +868,7 @@ impl ContextMenu {
                 ..
             })
             | ContextMenuItem::CustomEntry { handler, .. },
-        ) = self.selected_index.and_then(|ix| self.items.get(ix))
+        ) = self.items.get(ix)
         {
             (handler)(context, window, cx)
         }