
Release Notes: - N/A --- In the same vein as #29538, the "Services" menu on macOS depended on the text being exactly "Services", not allowing for i18n of the menu name. This PR introduces a new menu type called `OsMenu` that defines a special menu that can be populated by the system. Currently, it takes one enum value, `ServicesMenu` that tells the system to populate its contents with the items it would usually populate the "Services" menu with. An example of this being used has been implemented in the `set_menus` example: `cargo run -p gpui --example set_menus` --- Point to consider: In `mac/platform.rs:414` the existing code for setting the "Services" menu remains for backwards compatibility. Should this remain now that this new method exists to set the menu, or should it be removed? --------- Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
49 lines
1.5 KiB
Rust
49 lines
1.5 KiB
Rust
use gpui::{
|
|
App, Application, Context, Menu, MenuItem, SystemMenuType, Window, WindowOptions, actions, div,
|
|
prelude::*, rgb,
|
|
};
|
|
|
|
struct SetMenus;
|
|
|
|
impl Render for SetMenus {
|
|
fn render(&mut self, _window: &mut Window, _cx: &mut Context<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() {
|
|
Application::new().run(|cx: &mut App| {
|
|
// 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".into(),
|
|
items: vec![
|
|
MenuItem::os_submenu("Services", SystemMenuType::Services),
|
|
MenuItem::separator(),
|
|
MenuItem::action("Quit", Quit),
|
|
],
|
|
}]);
|
|
cx.open_window(WindowOptions::default(), |_, cx| cx.new(|_| SetMenus {}))
|
|
.unwrap();
|
|
});
|
|
}
|
|
|
|
// Associate actions using the `actions!` macro (or `Action` derive macro)
|
|
actions!(set_menus, [Quit]);
|
|
|
|
// Define the quit function that is registered with the App
|
|
fn quit(_: &Quit, cx: &mut App) {
|
|
println!("Gracefully quitting the application . . .");
|
|
cx.quit();
|
|
}
|