Skip to content

Menu creation improvements #2807

@probablykasper

Description

@probablykasper

Currently, this is how you would define a fairly standard menu. It's pretty awkward because you can't completely use the builder pattern if you have any platform differences:

.menu({
  let mut menu = Menu::new();
  #[cfg(target_os = "macos")]
  {
    menu = menu.add_submenu(Submenu::new(
      &ctx.package_info().name,
      Menu::new()
        .add_native_item(MenuItem::About(ctx.package_info().name.clone()))
        .add_native_item(MenuItem::Separator)
        .add_item(CustomMenuItem::new("Preferences...", "Preferences...").accelerator("CmdOrCtrl+,"))
        .add_native_item(MenuItem::Separator),
        // ...
    ))
  }
  menu = menu
    .add_submenu(/* File submenu */)
    .add_submenu(/* Edit submenu */)
    .add_submenu(/* View submenu */)
    .add_submenu(/* Window submenu */)
    .add_submenu(/* Help submenu */);
  menu
})

If you could pass a list of submenus instead, it becomes more intuitive because you can directly add attributes to the items:

.menu(Menu::new(vec![
  #[cfg(target_os = "macos")]
  MenuItem::Submenu(Submenu::new(
    &ctx.package_info().name,
    Menu::new(vec![
      MenuItem::About("My App".to_string()),
      MenuItem::Separator,
      MenuItem::Custom(CustomMenuItem::new("Preferences...", "Preferences...").accelerator("CmdOrCtrl+,")),
      MenuItem::Separator,
    ]),
  )),
  MenuItem::Submenu(Submenu::new(/* File submenu */)),
  MenuItem::Submenu(Submenu::new(/* Edit submenu */)),
  MenuItem::Submenu(Submenu::new(/* View submenu */)),
  MenuItem::Submenu(Submenu::new(/* Window submenu */)),
  MenuItem::Submenu(Submenu::new(/* Help submenu */)),
]))

The differences here are:

  • Menu::new() takes Vec<MenuItem>
  • New MenuItem variant: MenuItem::Custom(CustomMenuItem)
  • New MenuItem variant: MenuItem::Submenu(Submenu)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions