2022-11-24 03:29:52 +11:00
muda is a Menu Utilities library for Desktop Applications.
2022-05-07 06:57:58 +10:00
2023-02-09 06:00:29 +11:00
## Platforms supported:
- Windows
- macOS
- Linux (gtk Only)
## Platform-specific notes:
- On Windows, accelerators don't work unless the win32 message loop calls
[`TranslateAcceleratorW` ](https://docs.rs/windows-sys/latest/windows_sys/Win32/UI/WindowsAndMessaging/fn.TranslateAcceleratorW.html ).
2023-07-20 22:04:02 +10:00
See [`Menu::init_for_hwnd` ](https://docs.rs/muda/latest/x86_64-pc-windows-msvc/muda/struct.Menu.html#method.init_for_hwnd ) for more details
2023-02-09 06:00:29 +11:00
2023-06-20 03:59:10 +10:00
### Cargo Features
2023-06-20 04:58:45 +10:00
- `common-controls-v6` : Use `TaskDialogIndirect` API from `ComCtl32.dll` v6 on Windows for showing the predefined `About` menu item dialog.
- `libxdo` : Enables linking to `libxdo` on Linux which is used for the predfined `Copy` , `Cut` , `Paste` and `SelectAll` menu item.
2023-07-27 21:56:01 +10:00
- `serde` : Enables de/serializing the dpi types.
2023-06-20 03:59:10 +10:00
2023-02-09 06:00:29 +11:00
## 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:
```sh
pacman -S gtk3 xdotool
```
#### Debian / Ubuntu:
```sh
sudo apt install libgtk-3-dev libxdo-dev
```
2022-05-07 06:57:58 +10:00
## Example
2022-11-24 03:29:52 +11:00
Create the menu and add your items
2022-05-07 06:57:58 +10:00
```rs
2022-11-24 03:29:52 +11:00
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,
])
]);
2022-05-07 06:57:58 +10:00
2022-11-24 03:29:52 +11:00
```
2022-05-07 06:57:58 +10:00
2023-07-28 11:38:38 +10:00
Then add your root menu to a Window on Windows and Linux
or use it as your global app menu on macOS
2022-05-07 06:57:58 +10:00
2022-11-24 03:29:52 +11:00
```rs
// --snip--
2022-05-07 06:57:58 +10:00
#[cfg(target_os = "windows")]
menu.init_for_hwnd(window.hwnd() as isize);
#[cfg(target_os = "linux")]
2023-07-28 11:38:38 +10:00
menu.init_for_gtk_window(& gtk_window, Some(&vertical_gtk_box));
2022-05-08 16:32:31 +10:00
#[cfg(target_os = "macos")]
menu.init_for_nsapp();
2022-05-07 06:57:58 +10:00
```
2022-11-24 03:29:52 +11:00
## Context menus (Popup menus)
You can also use a [`Menu`] or a [`Submenu`] show a context menu.
```rs
// --snip--
2023-07-28 11:38:38 +10:00
let position = muda::PhysicalPosition { x: 100., y: 120. };
2022-11-24 03:29:52 +11:00
#[cfg(target_os = "windows")]
2023-07-28 11:38:38 +10:00
menu.show_context_menu_for_hwnd(window.hwnd() as isize, Some(position.into()));
2022-11-24 03:29:52 +11:00
#[cfg(target_os = "linux")]
2023-07-28 11:38:38 +10:00
menu.show_context_menu_for_gtk_window(& gtk_window, Some(position.into()));
2022-11-24 03:29:52 +11:00
#[cfg(target_os = "macos")]
2023-07-28 11:38:38 +10:00
menu.show_context_menu_for_nsview(nsview, Some(position.into()));
2022-11-24 03:29:52 +11:00
```
2023-02-09 06:00:29 +11:00
2022-11-24 03:29:52 +11:00
## Processing menu events
2023-01-03 13:07:07 +11:00
You can use `MenuEvent::receiver` to get a reference to the `MenuEventReceiver`
2022-11-24 03:29:52 +11:00
which you can use to listen to events when a menu item is activated
2023-02-09 06:00:29 +11:00
2022-05-07 06:57:58 +10:00
```rs
2023-01-03 13:07:07 +11:00
if let Ok(event) = MenuEvent::receiver().try_recv() {
2022-05-07 06:57:58 +10:00
match event.id {
_ if event.id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}
2022-05-07 08:52:41 +10:00
```
2022-11-24 03:29:52 +11:00
2022-12-09 05:50:24 +11:00
## License
Apache-2.0/MIT