From 181ba423a3dfb1b4866e7408d09ea7616622c174 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 6 Oct 2022 23:13:42 +1100 Subject: [PATCH] Support submenus --- v2/internal/platform/systray/menu.go | 33 ++++++++++++++++++---------- v2/internal/platform/win32/consts.go | 1 + 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/v2/internal/platform/systray/menu.go b/v2/internal/platform/systray/menu.go index 23ad949fa..685356c49 100644 --- a/v2/internal/platform/systray/menu.go +++ b/v2/internal/platform/systray/menu.go @@ -13,11 +13,10 @@ type PopupMenu struct { menuData *menu.Menu } -func buildMenu(parentMenu win32.HMENU, inputMenu *menu.Menu) (map[int]*menu.MenuItem, error) { - menuMapping := make(map[int]*menu.MenuItem) +func (p *PopupMenu) buildMenu(parentMenu win32.HMENU, inputMenu *menu.Menu, startindex int) error { for index, item := range inputMenu.Items { var ret bool - itemID := win32.MenuItemMsgID + index + itemID := index + startindex flags := win32.MF_STRING if item.Disabled { flags = flags | win32.MF_GRAYED @@ -31,27 +30,39 @@ func buildMenu(parentMenu win32.HMENU, inputMenu *menu.Menu) (map[int]*menu.Menu if item.IsSeparator() { flags = flags | win32.MF_SEPARATOR } + if item.SubMenu != nil { + flags = flags | win32.MF_POPUP + submenu := win32.CreatePopupMenu() + err := p.buildMenu(submenu, item.SubMenu, itemID) + if err != nil { + return err + } + ret = win32.AppendMenu(parentMenu, uintptr(flags), uintptr(submenu), item.Label) + if ret == false { + return errors.New("AppendMenu failed") + } + continue + } - menuMapping[itemID] = item + p.menuMapping[itemID] = item ret = win32.AppendMenu(parentMenu, uintptr(flags), uintptr(itemID), item.Label) if ret == false { - return nil, errors.New("AppendMenu failed") + return errors.New("AppendMenu failed") } } - return menuMapping, nil + return nil } func (p *PopupMenu) Update() error { - var err error p.menu = win32.CreatePopupMenu() - p.menuMapping, err = buildMenu(p.menu, p.menuData) - return err + return p.buildMenu(p.menu, p.menuData, win32.MenuItemMsgID) } func NewPopupMenu(parent win32.HWND, inputMenu *menu.Menu) (*PopupMenu, error) { result := &PopupMenu{ - parent: parent, - menuData: inputMenu, + parent: parent, + menuData: inputMenu, + menuMapping: make(map[int]*menu.MenuItem), } err := result.Update() return result, err diff --git a/v2/internal/platform/win32/consts.go b/v2/internal/platform/win32/consts.go index b577bd011..0c9435260 100644 --- a/v2/internal/platform/win32/consts.go +++ b/v2/internal/platform/win32/consts.go @@ -105,6 +105,7 @@ const ( MF_DISABLED = 0x00000002 MF_SEPARATOR = 0x00000800 MF_CHECKED = 0x00000008 + MF_POPUP = 0x00000010 MF_MENUBARBREAK = 0x00000020 TPM_LEFTALIGN = 0x0000