tray-controls
An enhanced menu management utility designed for the tray-icon crate.
It provides grouped management for Radio, CheckBox, and other menu item types, making it especially suitable for projects requiring single-selection menus (Radio) and complex tray menu systems.
Features
🎯 Core Advantages
-
Menu Management: Easily manage multiple types of menu items
-
Group Management: Automatically manages Radio menu groups to ensure correct single-selection behavior
-
Convenient Access: Directly access or modify any menu item and its properties by ID
-
Multi-Tray Menu Management: Supports grouped registration for menus from different tray icons, making it easier to manage multiple tray menus
🔧 Problems This Crate Solves
When using the tray-icon crate, menu event handlers only return the target menu ID instead of the actual menu item object. This makes it:
-
Difficult to directly access the target menu object
-
Inconvenient to modify menu properties (such as text or checked state)
-
Hard to synchronize grouped menu states (such as Radio menus)
-
Difficult to manage menus when multiple tray icons exist
This crate solves these problems through a unified menu manager.
Usage
Add the dependency to your Cargo.toml:
[]
= "0.2.0"
= ">=0.20.0"
Example using winit + tray-icon + tray-control:
Steps:
- Create a generic type
Gthat implementsClone + Copy + Eq + Hash + PartialEq + std::fmt::Debug.
This generic typeGis used for grouping Radio menus or CheckBox menus, making it easier to handle logic insidetray_icon::MenuEvent::set_event_handler, for example:
- Create a menu registry (
tray_controls::MenuRegistry<G>)
use MenuRegistry;
let mut menu_registry = new;
- Create tray menu items, convert them into
tray_icon::menu::MenuItemKind, and register them into the menu registry (tray_controls::MenuRegistry<G>).
Items can optionally be grouped.
- Standard menu items:
use MenuItem;
let mut menu_registry = new;
let tray_menu = new;
let quit_menu_item = with_id;
// Register as a normal menu item
menu_registry.register_normal;
let icon_menu_item = with_id;
// Register as a normal menu item
menu_registry.register_normal;
tray_menu.append;
tray_menu.append;
- Radio menu items:
use ;
use MenuRegistry;
let tray_menu = new;
let language_sub_menu_item = ;
// Append submenu to tray menu
tray_menu.append;
- After all menu items are created and registered, add the menu registry into global state management, such as inside a
winitApp:
let mut menu_registry = new;
let tray_menu = create_register_menu?;
let tray = create_tray;
let mut app = App ;
event_loop.run_app;
// fn create_registry_menu(menu_registry: &mut MenuRegistry<MenuGroup>)
// fn create_tray(tray_menu: Menu) -> tray_icon::TrayIcon
- Handle menu events, for example in
winitby setting an event handler for menu events:
use MenuRegistry;
use MenuItemKind;
MenuEvent =>