mirror of
https://github.com/italicsjenga/muda.git
synced 2024-12-23 20:11:29 +11:00
812ff0d37a
* refactor: rewrite * fix syncing check items and cleanup * clippy * Add `append`, `prepend` and `insert` * accept different menu items in `*_list` methods * add context menu for gtk * add `with_items` * add `items` getter * chore: unreachable! and typos * implement remove * `*_list` -> `*_items` * fix winit example * add `show_context_menu_for_gtk_window` on `Submenu` type * Add windows implementation * TextMenuItem -> MenuItem, MenuItem trait -> MenuEntry * Add `PredfinedMenuItem` * move internal mod into its own file * update tao example to latest tao's `muda` branch * fix build on linux with latest tao changes * Fix accelerators on Linux * update examples * remove recursive removal of submenus * remvoe gtk menu items recursively * fix tao example on macos * On Windows, remove parents hmenu when removing an item * Add documentation * update README.md * use insert_items with postion 0 for prepend_items * Add menu mnemonics in examples * Add `ContextMenu` trait * Add methods to `ContextMenu` trait necessary for tray icon * fix linux build * fix context menu on gtk * Expose gtk::Menu in ContextMenu trait * Revert context menu to create a gtk::Menu on each call * clippy lints * cleanup crate structure * update docs * Fix doc tests and links * more docs fixes * error handling * macOS implementation (#19) * partial macOS implementation * fix context menu examples * add accelerator support for macOS * strip ampersands from titles on macOS * add CMD_OR_CTRL shorthand for modifiers * implement actions for predefined menu items on macos * fix examples * more predefined items * implement insert for macos * refactor macOS implementation * menu state getters and setters on macOS * implement remove for macOS * code tweaks * add show_context_menu_for_nsview for Submenu on macOS * docs improvements * allow adding item to the same menu multiple times on macOS * implement `items` for macOS * strip only single ampersands from menu titles * add support for menu item actions on macOS * add app name to macOS About, Hide, Quit menu items * add methods to set app window and help menus on macOS * fix clickable submenu titles on macOS * refactor submenu for safe reuse on macOS * fmt & clippy * few cleanups * fix docs * clippy * fix docs * cleanup examples * fix tests * fix clippy?? * use cargo action instead * ??? * Replace popUpContextMenu with popUpMenuPositioningItem Co-authored-by: Caesar Schinas <caesar@caesarschinas.com> Co-authored-by: Wu Wayne <yuweiwu@pm.me>
90 lines
2.5 KiB
Markdown
90 lines
2.5 KiB
Markdown
muda is a Menu Utilities library for Desktop Applications.
|
|
|
|
## Example
|
|
|
|
Create the menu and add your items
|
|
|
|
```rs
|
|
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,
|
|
])
|
|
]);
|
|
|
|
```
|
|
|
|
Then Add your root menu to a Window on Windows and Linux Only or use it
|
|
as your global app menu on macOS
|
|
|
|
```rs
|
|
// --snip--
|
|
#[cfg(target_os = "windows")]
|
|
menu.init_for_hwnd(window.hwnd() as isize);
|
|
#[cfg(target_os = "linux")]
|
|
menu.init_for_gtk_window(>k_window);
|
|
#[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.
|
|
|
|
```rs
|
|
// --snip--
|
|
let x = 100;
|
|
let y = 120;
|
|
#[cfg(target_os = "windows")]
|
|
menu.show_context_menu_for_hwnd(window.hwnd() as isize, x, y);
|
|
#[cfg(target_os = "linux")]
|
|
menu.show_context_menu_for_gtk_window(>k_window, x, y);
|
|
#[cfg(target_os = "macos")]
|
|
menu.show_context_menu_for_nsview(nsview, x, y);
|
|
```
|
|
## Processing menu events
|
|
|
|
You can use [`menu_event_receiver`](https://docs.rs/muda/latest/muda/fn.menu_event_receiver.html) to get a reference to the [`MenuEventReceiver`](https://docs.rs/muda/latest/muda/type.MenuEventReceiver.html)
|
|
which you can use to listen to events when a menu item is activated
|
|
```rs
|
|
if let Ok(event) = menu_event_receiver().try_recv() {
|
|
match event.id {
|
|
_ if event.id == save_item.id() => {
|
|
println!("Save menu item activated");
|
|
},
|
|
_ => {}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Platform-specific notes:
|
|
|
|
### Accelerators 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)
|
|
|
|
See [`Menu::init_for_hwnd`](https://docs.rs/muda/latest/muda/struct.Menu.html#method.init_for_hwnd) for more details
|
|
|
|
### Linux
|
|
|
|
`libx` 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 xdotool
|
|
```
|
|
|
|
Debian / Ubuntu:
|
|
```sh
|
|
sudo apt install libxdo-dev
|
|
```
|