gpui: add set menus example (#9131)

Andrew created

Add an example showing how to add a menu item, register an action with
the `AppContext`, and successfully call the action.

Release Notes:

- N/A

Change summary

crates/gpui/Cargo.toml            |  6 +++
crates/gpui/examples/set_menus.rs | 43 +++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 1 deletion(-)

Detailed changes

crates/gpui/Cargo.toml 🔗

@@ -132,4 +132,8 @@ path = "examples/hello_world.rs"
 
 [[example]]
 name = "image"
-path = "examples/image/image.rs"
+path = "examples/image/image.rs"
+
+[[example]]
+name = "set_menus"
+path = "examples/set_menus.rs"

crates/gpui/examples/set_menus.rs 🔗

@@ -0,0 +1,43 @@
+use gpui::*;
+
+struct SetMenus;
+
+impl Render for SetMenus {
+    fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
+        div()
+            .flex()
+            .bg(rgb(0x2e7d32))
+            .size_full()
+            .justify_center()
+            .items_center()
+            .text_xl()
+            .text_color(rgb(0xffffff))
+            .child("Set Menus Example")
+    }
+}
+
+fn main() {
+    App::new().run(|cx: &mut AppContext| {
+        // Bring the menu bar to the foreground (so you can see the menu bar)
+        cx.activate(true);
+        // Register the `quit` function so it can be referenced by the `MenuItem::action` in the menu bar
+        cx.on_action(quit);
+        // Add menu items
+        cx.set_menus(vec![Menu {
+            name: "set_menus",
+            items: vec![MenuItem::action("Quit", Quit)],
+        }]);
+        cx.open_window(WindowOptions::default(), |cx| {
+            cx.new_view(|_cx| SetMenus {})
+        });
+    });
+}
+
+// Associate actions using the `actions!` macro (or `impl_actions!` macro)
+actions!(set_menus, [Quit]);
+
+// Define the quit function that is registered with the AppContext
+fn quit(_: &Quit, cx: &mut AppContext) {
+    println!("Gracefully quitting the application . . .");
+    cx.quit();
+}