Expand description
muda is a Menu Utilities library for Desktop Applications.
Platforms supported:
- Windows
- macOS
- Linux (gtk Only)
Platform-specific notes:
- On Windows, accelerators don’t work unless the win32 message loop calls
TranslateAcceleratorW. SeeMenu::init_for_hwndfor more details
Dependencies (Linux Only)
gtk is used for menus and libxdo is used to make the predfined Copy, Cut, Paste and SelectAll menu items work. Be sure to install following packages before building:
Arch Linux / Manjaro:
pacman -S gtk3 xdotool
Debian / Ubuntu:
sudo apt install libgtk-3-dev libxdo-dev
Example
Create the menu and add your items
let menu = Menu::new();
let menu_item2 = MenuItem::new("Menu item #2", false, None);
let submenu = Submenu::with_items(
"Submenu Outer",
true,
&[
&MenuItem::new(
"Menu item #1",
true,
Some(Accelerator::new(Some(Modifiers::ALT), Code::KeyD)),
),
&PredefinedMenuItem::separator(),
&menu_item2,
&MenuItem::new("Menu item #3", true, None),
&PredefinedMenuItem::separator(),
&Submenu::with_items(
"Submenu Inner",
true,
&[
&MenuItem::new("Submenu item #1", true, None),
&PredefinedMenuItem::separator(),
&menu_item2,
],
).unwrap(),
],
);Then add your root menu to a Window on Windows and Linux or use it as your global app menu on macOS
// --snip--
#[cfg(target_os = "windows")]
menu.init_for_hwnd(window_hwnd);
#[cfg(target_os = "linux")]
menu.init_for_gtk_window(>k_window, Some(&vertical_gtk_box));
#[cfg(target_os = "macos")]
menu.init_for_nsapp();Context menus (Popup menus)
You can also use a Menu or a Submenu show a context menu.
use muda::ContextMenu;
// --snip--
let position = muda::PhysicalPosition { x: 100., y: 120. };
#[cfg(target_os = "windows")]
menu.show_context_menu_for_hwnd(window_hwnd, Some(position.into()));
#[cfg(target_os = "linux")]
menu.show_context_menu_for_gtk_window(>k_window, Some(position.into()));
#[cfg(target_os = "macos")]
menu.show_context_menu_for_nsview(nsview, Some(position.into()));Processing menu events
You can use MenuEvent::receiver to get a reference to the MenuEventReceiver
which you can use to listen to events when a menu item is activated
if let Ok(event) = MenuEvent::receiver().try_recv() {
match event.id {
id if id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}Modules
- Accelerators describe keyboard shortcuts for menu items.
Structs
- Application metadata for the
PredefinedMenuItem::about. - A builder type for
AboutMetadata. - A builder type for
CheckMenuItem - An icon used for the window titlebar, taskbar, etc.
- A builder type for
IconMenuItem - A position represented in logical pixels.
- A root menu that can be added to a Window on Windows and Linux and used as the app global menu on macOS.
- Describes a menu event emitted when a menu item is activated
- An unique id that is associated with a menu item.
- A builder type for
MenuItem - A position represented in physical pixels.
- A predefined (native) menu item which has a predfined behavior by the OS or by this crate.
- A builder type for
Submenu
Enums
- An error produced when using
Icon::from_rgbawith invalid arguments. - Errors returned by muda.
- An enumeration of all available menu types, useful to match against the items returned from
Menu::itemsorSubmenu::items - A native Icon to be used for the menu item
- A position that’s either physical or logical.
Traits
- A helper trait with methods to help creating a context menu.
- A trait that defines a generic item in a menu, which may be one of
MenuItemKind
Functions
- Checks that the scale factor is a normal positive
f64.
Type Definitions
- A reciever that could be used to listen to menu events.
- Convenient type alias of Result type for muda.