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  }