github.com/secoba/wails/v2@v2.6.4/internal/frontend/desktop/windows/menu.go (about) 1 //go:build windows 2 // +build windows 3 4 package windows 5 6 import ( 7 "github.com/secoba/wails/v2/internal/frontend/desktop/windows/winc" 8 "github.com/secoba/wails/v2/pkg/menu" 9 ) 10 11 var checkboxMap = map[*menu.MenuItem][]*winc.MenuItem{} 12 var radioGroupMap = map[*menu.MenuItem][]*winc.MenuItem{} 13 14 func toggleCheckBox(menuItem *menu.MenuItem) { 15 menuItem.Checked = !menuItem.Checked 16 for _, wincMenu := range checkboxMap[menuItem] { 17 wincMenu.SetChecked(menuItem.Checked) 18 } 19 } 20 21 func addCheckBoxToMap(menuItem *menu.MenuItem, wincMenuItem *winc.MenuItem) { 22 if checkboxMap[menuItem] == nil { 23 checkboxMap[menuItem] = []*winc.MenuItem{} 24 } 25 checkboxMap[menuItem] = append(checkboxMap[menuItem], wincMenuItem) 26 } 27 28 func toggleRadioItem(menuItem *menu.MenuItem) { 29 menuItem.Checked = !menuItem.Checked 30 for _, wincMenu := range radioGroupMap[menuItem] { 31 wincMenu.SetChecked(menuItem.Checked) 32 } 33 } 34 35 func addRadioItemToMap(menuItem *menu.MenuItem, wincMenuItem *winc.MenuItem) { 36 if radioGroupMap[menuItem] == nil { 37 radioGroupMap[menuItem] = []*winc.MenuItem{} 38 } 39 radioGroupMap[menuItem] = append(radioGroupMap[menuItem], wincMenuItem) 40 } 41 42 func (w *Window) SetApplicationMenu(menu *menu.Menu) { 43 w.applicationMenu = menu 44 processMenu(w, menu) 45 } 46 47 func processMenu(window *Window, menu *menu.Menu) { 48 mainMenu := window.NewMenu() 49 for _, menuItem := range menu.Items { 50 submenu := mainMenu.AddSubMenu(menuItem.Label) 51 if menuItem.SubMenu != nil { 52 for _, menuItem := range menuItem.SubMenu.Items { 53 processMenuItem(submenu, menuItem) 54 } 55 } 56 } 57 mainMenu.Show() 58 } 59 60 func processMenuItem(parent *winc.MenuItem, menuItem *menu.MenuItem) { 61 if menuItem.Hidden { 62 return 63 } 64 switch menuItem.Type { 65 case menu.SeparatorType: 66 parent.AddSeparator() 67 case menu.TextType: 68 shortcut := acceleratorToWincShortcut(menuItem.Accelerator) 69 newItem := parent.AddItem(menuItem.Label, shortcut) 70 //if menuItem.Tooltip != "" { 71 // newItem.SetToolTip(menuItem.Tooltip) 72 //} 73 if menuItem.Click != nil { 74 newItem.OnClick().Bind(func(e *winc.Event) { 75 menuItem.Click(&menu.CallbackData{ 76 MenuItem: menuItem, 77 }) 78 }) 79 } 80 newItem.SetEnabled(!menuItem.Disabled) 81 82 case menu.CheckboxType: 83 shortcut := acceleratorToWincShortcut(menuItem.Accelerator) 84 newItem := parent.AddItem(menuItem.Label, shortcut) 85 newItem.SetCheckable(true) 86 newItem.SetChecked(menuItem.Checked) 87 //if menuItem.Tooltip != "" { 88 // newItem.SetToolTip(menuItem.Tooltip) 89 //} 90 if menuItem.Click != nil { 91 newItem.OnClick().Bind(func(e *winc.Event) { 92 toggleCheckBox(menuItem) 93 menuItem.Click(&menu.CallbackData{ 94 MenuItem: menuItem, 95 }) 96 }) 97 } 98 newItem.SetEnabled(!menuItem.Disabled) 99 addCheckBoxToMap(menuItem, newItem) 100 case menu.RadioType: 101 shortcut := acceleratorToWincShortcut(menuItem.Accelerator) 102 newItem := parent.AddItemRadio(menuItem.Label, shortcut) 103 newItem.SetCheckable(true) 104 newItem.SetChecked(menuItem.Checked) 105 //if menuItem.Tooltip != "" { 106 // newItem.SetToolTip(menuItem.Tooltip) 107 //} 108 if menuItem.Click != nil { 109 newItem.OnClick().Bind(func(e *winc.Event) { 110 toggleRadioItem(menuItem) 111 menuItem.Click(&menu.CallbackData{ 112 MenuItem: menuItem, 113 }) 114 }) 115 } 116 newItem.SetEnabled(!menuItem.Disabled) 117 addRadioItemToMap(menuItem, newItem) 118 case menu.SubmenuType: 119 submenu := parent.AddSubMenu(menuItem.Label) 120 for _, menuItem := range menuItem.SubMenu.Items { 121 processMenuItem(submenu, menuItem) 122 } 123 } 124 } 125 126 func (f *Frontend) MenuSetApplicationMenu(menu *menu.Menu) { 127 f.mainWindow.SetApplicationMenu(menu) 128 } 129 130 func (f *Frontend) MenuUpdateApplicationMenu() { 131 processMenu(f.mainWindow, f.mainWindow.applicationMenu) 132 }