#desktop-applications #menu #windowing #utilities #gtk #items

muada

桌面应用程序菜单工具

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 日

#18GUI

Download history 19682/week @ 2024-05-02 18712/week @ 2024-05-09 19299/week @ 2024-05-16 18549/week @ 2024-05-23 20311/week @ 2024-05-30 14744/week @ 2024-06-06 16426/week @ 2024-06-13 16439/week @ 2024-06-20 18262/week @ 2024-06-27 16428/week @ 2024-07-04 18455/week @ 2024-07-11 15051/week @ 2024-07-18 20912/week @ 2024-07-25 24813/week @ 2024-08-01 26321/week @ 2024-08-08 24583/week @ 2024-08-15

每月 99,355 次下载
用于 86 个 (4 个直接)

Apache-2.0 OR MIT

295KB
7K SLoC

muada

桌面应用程序的菜单工具库。

Documentation

支持的平台

  • Windows
  • macOS
  • Linux (仅限 gtk)

特定平台说明

功能

  • common-controls-v6:在 Windows 上使用 TaskDialogIndirect API 从 ComCtl32.dll v6 显示预定义的 About 菜单项对话框。
  • libxdo:启用在 Linux 上链接到 libxdo,用于预定义的 CopyCutPasteSelectAll 菜单项。
  • serde:启用对 dpi 类型的序列化和反序列化。

依赖项(仅限 Linux)

gtk 用于菜单,libxdo 用于使预定义的 CopyCutPasteSelectAll 菜单项正常工作。在构建前确保安装以下软件包。

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(&gtk_window, Some(&vertical_gtk_box));
#[cfg(target_os = "macos")]
menu.init_for_nsapp();

上下文菜单(弹出菜单)

您还可以使用 MenuSubmenu 显示上下文菜单。

// --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(&gtk_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