github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/menumanager/menuitemmap.go (about) 1 package menumanager 2 3 import ( 4 "fmt" 5 "strconv" 6 "sync" 7 8 "github.com/AlpineAIO/wails/v2/pkg/menu" 9 ) 10 11 // MenuItemMap holds a mapping between menuIDs and menu items 12 type MenuItemMap struct { 13 idToMenuItemMap map[string]*menu.MenuItem 14 menuItemToIDMap map[*menu.MenuItem]string 15 16 // We use a simple counter to keep track of unique menu IDs 17 menuIDCounter int64 18 menuIDCounterMutex sync.Mutex 19 } 20 21 func NewMenuItemMap() *MenuItemMap { 22 result := &MenuItemMap{ 23 idToMenuItemMap: make(map[string]*menu.MenuItem), 24 menuItemToIDMap: make(map[*menu.MenuItem]string), 25 } 26 27 return result 28 } 29 30 func (m *MenuItemMap) AddMenu(menu *menu.Menu) { 31 if menu == nil { 32 return 33 } 34 for _, item := range menu.Items { 35 m.processMenuItem(item) 36 } 37 } 38 39 func (m *MenuItemMap) Dump() { 40 println("idToMenuItemMap:") 41 for key, value := range m.idToMenuItemMap { 42 fmt.Printf(" %s\t%p\n", key, value) 43 } 44 println("\nmenuItemToIDMap") 45 for key, value := range m.menuItemToIDMap { 46 fmt.Printf(" %p\t%s\n", key, value) 47 } 48 } 49 50 // GenerateMenuID returns a unique string ID for a menu item 51 func (m *MenuItemMap) generateMenuID() string { 52 m.menuIDCounterMutex.Lock() 53 result := strconv.FormatInt(m.menuIDCounter, 10) 54 m.menuIDCounter++ 55 m.menuIDCounterMutex.Unlock() 56 return result 57 } 58 59 func (m *MenuItemMap) processMenuItem(item *menu.MenuItem) { 60 if item.SubMenu != nil { 61 for _, submenuitem := range item.SubMenu.Items { 62 m.processMenuItem(submenuitem) 63 } 64 } 65 66 // Create a unique ID for this menu item 67 menuID := m.generateMenuID() 68 69 // Store references 70 m.idToMenuItemMap[menuID] = item 71 m.menuItemToIDMap[item] = menuID 72 } 73 74 func (m *MenuItemMap) getMenuItemByID(menuId string) *menu.MenuItem { 75 return m.idToMenuItemMap[menuId] 76 }