48 个版本
新增 0.14.1 | 2024 年 8 月 22 日 |
---|---|
0.13.5 | 2024 年 5 月 27 日 |
0.13.0 | 2024 年 3 月 26 日 |
0.11.2 | 2023 年 11 月 18 日 |
0.0.0 | 2022 年 5 月 7 日 |
#18 在 GUI
每月 99,355 次下载
用于 86 个 (4 个直接) 库
295KB
7K SLoC
muada
桌面应用程序的菜单工具库。
支持的平台
- Windows
- macOS
- Linux (仅限 gtk)
特定平台说明
- 在 Windows 上,除非 win32 消息循环调用
TranslateAcceleratorW
,否则加速键不起作用。请参阅Menu::init_for_hwnd
获取更多信息。
功能
common-controls-v6
:在 Windows 上使用TaskDialogIndirect
API 从ComCtl32.dll
v6 显示预定义的About
菜单项对话框。libxdo
:启用在 Linux 上链接到libxdo
,用于预定义的Copy
、Cut
、Paste
和SelectAll
菜单项。serde
:启用对 dpi 类型的序列化和反序列化。
依赖项(仅限 Linux)
gtk
用于菜单,libxdo
用于使预定义的 Copy
、Cut
、Paste
和 SelectAll
菜单项正常工作。在构建前确保安装以下软件包。
Arch Linux / Manjaro
pacman -S gtk3 xdotool
Debian / Ubuntu
sudo apt install libgtk-3-dev libxdo-dev
示例
创建菜单并添加项目
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,
])
]);
然后将根菜单添加到 Windows 和 Linux 的窗口或用作 macOS 上的全局应用程序菜单
// --snip--
#[cfg(target_os = "windows")]
menu.init_for_hwnd(window.hwnd() as isize);
#[cfg(target_os = "linux")]
menu.init_for_gtk_window(>k_window, Some(&vertical_gtk_box));
#[cfg(target_os = "macos")]
menu.init_for_nsapp();
上下文菜单(弹出菜单)
您还可以使用 Menu
或 Submenu
显示上下文菜单。
// --snip--
let position = muda::PhysicalPosition { x: 100., y: 120. };
#[cfg(target_os = "windows")]
menu.show_context_menu_for_hwnd(window.hwnd() as isize, 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()));
处理菜单事件
您可以使用 MenuEvent::receiver
获取对 MenuEventReceiver
的引用,该引用可用于在菜单项被激活时监听事件
if let Ok(event) = MenuEvent::receiver().try_recv() {
match event.id {
_ if event.id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}
许可证
Apache-2.0/MIT
依赖项
~1–13MB
~172K SLoC