gpui: Update Menu name to use `SharedString` type to support more types (#14791)

Jason Lee created

Release Notes:

- N/A

Change summary

crates/gpui/examples/image/image.rs         |  2 
crates/gpui/examples/set_menus.rs           |  2 
crates/gpui/src/platform/app_menu.rs        | 36 ++++++++++++----------
crates/gpui/src/platform/mac/platform.rs    |  8 ++--
crates/live_kit_client/examples/test_app.rs |  4 +-
crates/storybook/src/app_menus.rs           |  4 +-
crates/zed/src/zed/app_menus.rs             | 22 +++++++-------
7 files changed, 40 insertions(+), 38 deletions(-)

Detailed changes

crates/gpui/examples/image/image.rs 🔗

@@ -68,7 +68,7 @@ fn main() {
         cx.on_action(|_: &Quit, cx| cx.quit());
         cx.bind_keys([KeyBinding::new("cmd-q", Quit, None)]);
         cx.set_menus(vec![Menu {
-            name: "Image",
+            name: "Image".into(),
             items: vec![MenuItem::action("Quit", Quit)],
         }]);
 

crates/gpui/examples/set_menus.rs 🔗

@@ -24,7 +24,7 @@ fn main() {
         cx.on_action(quit);
         // Add menu items
         cx.set_menus(vec![Menu {
-            name: "set_menus",
+            name: "set_menus".into(),
             items: vec![MenuItem::action("Quit", Quit)],
         }]);
         cx.open_window(WindowOptions::default(), |cx| {

crates/gpui/src/platform/app_menu.rs 🔗

@@ -1,18 +1,16 @@
-use std::borrow::Cow;
-
-use crate::{Action, AppContext, Platform};
+use crate::{Action, AppContext, Platform, SharedString};
 use util::ResultExt;
 
 /// A menu of the application, either a main menu or a submenu
-pub struct Menu<'a> {
+pub struct Menu {
     /// The name of the menu
-    pub name: &'a str,
+    pub name: SharedString,
 
     /// The items in the menu
-    pub items: Vec<MenuItem<'a>>,
+    pub items: Vec<MenuItem>,
 }
 
-impl<'a> Menu<'a> {
+impl Menu {
     /// Create an OwnedMenu from this Menu
     pub fn owned(self) -> OwnedMenu {
         OwnedMenu {
@@ -23,17 +21,17 @@ impl<'a> Menu<'a> {
 }
 
 /// The different kinds of items that can be in a menu
-pub enum MenuItem<'a> {
+pub enum MenuItem {
     /// A separator between items
     Separator,
 
     /// A submenu
-    Submenu(Menu<'a>),
+    Submenu(Menu),
 
     /// An action that can be performed
     Action {
         /// The name of this menu item
-        name: &'a str,
+        name: SharedString,
 
         /// the action to perform when this menu item is selected
         action: Box<dyn Action>,
@@ -44,30 +42,34 @@ pub enum MenuItem<'a> {
     },
 }
 
-impl<'a> MenuItem<'a> {
+impl MenuItem {
     /// Creates a new menu item that is a separator
     pub fn separator() -> Self {
         Self::Separator
     }
 
     /// Creates a new menu item that is a submenu
-    pub fn submenu(menu: Menu<'a>) -> Self {
+    pub fn submenu(menu: Menu) -> Self {
         Self::Submenu(menu)
     }
 
     /// Creates a new menu item that invokes an action
-    pub fn action(name: &'a str, action: impl Action) -> Self {
+    pub fn action(name: impl Into<SharedString>, action: impl Action) -> Self {
         Self::Action {
-            name,
+            name: name.into(),
             action: Box::new(action),
             os_action: None,
         }
     }
 
     /// Creates a new menu item that invokes an action and has an OS action
-    pub fn os_action(name: &'a str, action: impl Action, os_action: OsAction) -> Self {
+    pub fn os_action(
+        name: impl Into<SharedString>,
+        action: impl Action,
+        os_action: OsAction,
+    ) -> Self {
         Self::Action {
-            name,
+            name: name.into(),
             action: Box::new(action),
             os_action: Some(os_action),
         }
@@ -95,7 +97,7 @@ impl<'a> MenuItem<'a> {
 #[derive(Clone)]
 pub struct OwnedMenu {
     /// The name of the menu
-    pub name: Cow<'static, str>,
+    pub name: SharedString,
 
     /// The items in the menu
     pub items: Vec<OwnedMenuItem>,

crates/gpui/src/platform/mac/platform.rs 🔗

@@ -206,7 +206,7 @@ impl MacPlatform {
 
         for menu_config in menus {
             let menu = NSMenu::new(nil).autorelease();
-            menu.setTitle_(ns_string(menu_config.name));
+            menu.setTitle_(ns_string(&menu_config.name));
             menu.setDelegate_(delegate);
 
             for item_config in menu_config.items {
@@ -310,7 +310,7 @@ impl MacPlatform {
 
                         item = NSMenuItem::alloc(nil)
                             .initWithTitle_action_keyEquivalent_(
-                                ns_string(name),
+                                ns_string(&name),
                                 selector,
                                 ns_string(key_to_native(&keystroke.key).as_ref()),
                             )
@@ -341,7 +341,7 @@ impl MacPlatform {
                 } else {
                     item = NSMenuItem::alloc(nil)
                         .initWithTitle_action_keyEquivalent_(
-                            ns_string(name),
+                            ns_string(&name),
                             selector,
                             ns_string(""),
                         )
@@ -361,7 +361,7 @@ impl MacPlatform {
                     submenu.addItem_(Self::create_menu_item(item, delegate, actions, keymap));
                 }
                 item.setSubmenu_(submenu);
-                item.setTitle_(ns_string(name));
+                item.setTitle_(ns_string(&name));
                 item
             }
         }

crates/live_kit_client/examples/test_app.rs 🔗

@@ -25,9 +25,9 @@ fn main() {
         cx.bind_keys([KeyBinding::new("cmd-q", Quit, None)]);
 
         cx.set_menus(vec![Menu {
-            name: "Zed",
+            name: "Zed".into(),
             items: vec![MenuItem::Action {
-                name: "Quit",
+                name: "Quit".into(),
                 action: Box::new(Quit),
                 os_action: None,
             }],

crates/storybook/src/app_menus.rs 🔗

@@ -1,10 +1,10 @@
 use gpui::{Menu, MenuItem};
 
-pub fn app_menus() -> Vec<Menu<'static>> {
+pub fn app_menus() -> Vec<Menu> {
     use crate::actions::Quit;
 
     vec![Menu {
-        name: "Storybook",
+        name: "Storybook".into(),
         items: vec![MenuItem::action("Quit", Quit)],
     }]
 }

crates/zed/src/zed/app_menus.rs 🔗

@@ -2,18 +2,18 @@ use collab_ui::collab_panel;
 use gpui::{Menu, MenuItem, OsAction};
 use terminal_view::terminal_panel;
 
-pub fn app_menus() -> Vec<Menu<'static>> {
+pub fn app_menus() -> Vec<Menu> {
     use zed_actions::Quit;
 
     vec![
         Menu {
-            name: "Zed",
+            name: "Zed".into(),
             items: vec![
                 MenuItem::action("About Zed…", zed_actions::About),
                 MenuItem::action("Check for Updates", auto_update::Check),
                 MenuItem::separator(),
                 MenuItem::submenu(Menu {
-                    name: "Preferences",
+                    name: "Preferences".into(),
                     items: vec![
                         MenuItem::action("Open Settings", super::OpenSettings),
                         MenuItem::action("Open Key Bindings", zed_actions::OpenKeymap),
@@ -33,7 +33,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "File",
+            name: "File".into(),
             items: vec![
                 MenuItem::action("New", workspace::NewFile),
                 MenuItem::action("New Window", workspace::NewWindow),
@@ -58,7 +58,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "Edit",
+            name: "Edit".into(),
             items: vec![
                 MenuItem::os_action("Undo", editor::actions::Undo, OsAction::Undo),
                 MenuItem::os_action("Redo", editor::actions::Redo, OsAction::Redo),
@@ -77,7 +77,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "Selection",
+            name: "Selection".into(),
             items: vec![
                 MenuItem::os_action(
                     "Select All",
@@ -102,7 +102,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "View",
+            name: "View".into(),
             items: vec![
                 MenuItem::action("Zoom In", zed_actions::IncreaseBufferFontSize),
                 MenuItem::action("Zoom Out", zed_actions::DecreaseBufferFontSize),
@@ -113,7 +113,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
                 MenuItem::action("Toggle Bottom Dock", workspace::ToggleBottomDock),
                 MenuItem::action("Close All Docks", workspace::CloseAllDocks),
                 MenuItem::submenu(Menu {
-                    name: "Editor Layout",
+                    name: "Editor Layout".into(),
                     items: vec![
                         MenuItem::action("Split Up", workspace::SplitUp),
                         MenuItem::action("Split Down", workspace::SplitDown),
@@ -132,7 +132,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "Go",
+            name: "Go".into(),
             items: vec![
                 MenuItem::action("Back", workspace::GoBack),
                 MenuItem::action("Forward", workspace::GoForward),
@@ -153,7 +153,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "Window",
+            name: "Window".into(),
             items: vec![
                 MenuItem::action("Minimize", super::Minimize),
                 MenuItem::action("Zoom", super::Zoom),
@@ -161,7 +161,7 @@ pub fn app_menus() -> Vec<Menu<'static>> {
             ],
         },
         Menu {
-            name: "Help",
+            name: "Help".into(),
             items: vec![
                 MenuItem::action("View Telemetry", zed_actions::OpenTelemetryLog),
                 MenuItem::action("View Dependency Licenses", zed_actions::OpenLicenses),