From c62d47555ec31baa1a7094491e2977a832f4cfcc Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Sun, 25 Feb 2024 17:59:03 +0000 Subject: [PATCH] fix(tray): submenus not working Fixes a regression from previous tray fixes that caused submenus within the main tray menu to never show. Fixes #455 --- src/modules/tray/interface.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/modules/tray/interface.rs b/src/modules/tray/interface.rs index 3b9d988..d35a1bf 100644 --- a/src/modules/tray/interface.rs +++ b/src/modules/tray/interface.rs @@ -188,8 +188,23 @@ enum TrayMenuWidget { impl TrayMenuItem { fn new(info: &MenuItemInfo, tx: mpsc::Sender) -> Self { + let mut submenu = HashMap::new(); let menu = Menu::new(); + macro_rules! add_submenu { + ($menu:expr, $widget:expr) => { + if !info.submenu.is_empty() { + for sub_item in &info.submenu { + let sub_item = TrayMenuItem::new(sub_item, tx.clone()); + call!($menu, add, sub_item.widget); + submenu.insert(sub_item.id, sub_item); + } + + $widget.set_submenu(Some(&menu)); + } + }; + } + let widget = match (info.menu_type, info.toggle_type) { (MenuType::Separator, _) => TrayMenuWidget::Separator(SeparatorMenuItem::new()), (MenuType::Standard, ToggleType::Checkmark) => { @@ -200,6 +215,8 @@ impl TrayMenuItem { .active(info.toggle_state == ToggleState::On) .build(); + add_submenu!(menu, widget); + { let tx = tx.clone(); let id = info.id; @@ -212,12 +229,13 @@ impl TrayMenuItem { TrayMenuWidget::Checkbox(widget) } (MenuType::Standard, _) => { - let builder = MenuItem::builder() + let widget = MenuItem::builder() .label(&info.label) .visible(info.visible) - .sensitive(info.enabled); + .sensitive(info.enabled) + .build(); - let widget = builder.build(); + add_submenu!(menu, widget); { let tx = tx.clone(); @@ -236,7 +254,7 @@ impl TrayMenuItem { id: info.id, widget, menu_widget: menu, - submenu: HashMap::new(), + submenu, tx, } }