5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-04 12:51:38 +08:00
wails/v2/internal/frontend/windows/menu.go

84 lines
2.1 KiB
Go

package windows
import (
"fmt"
"github.com/tadvi/winc"
"github.com/wailsapp/wails/v2/pkg/menu"
)
var checkboxMap = map[*menu.MenuItem][]*winc.MenuItem{}
func toggleCheckBox(menuItem *menu.MenuItem) {
menuItem.Checked = !menuItem.Checked
for _, wincMenu := range checkboxMap[menuItem] {
wincMenu.SetChecked(menuItem.Checked)
}
}
func addCheckBoxToMap(menuItem *menu.MenuItem, wincMenuItem *winc.MenuItem) {
if checkboxMap[menuItem] == nil {
checkboxMap[menuItem] = []*winc.MenuItem{}
}
checkboxMap[menuItem] = append(checkboxMap[menuItem], wincMenuItem)
}
func processApplicationMenu(window *Window, menuToProcess *menu.Menu) {
mainMenu := window.NewMenu()
for _, menuItem := range menuToProcess.Items {
println("Adding menu:", menuItem.Label)
submenu := mainMenu.AddSubMenu(menuItem.Label)
for _, menuItem := range menuItem.SubMenu.Items {
fmt.Printf("Processing: %#v\n", menuItem)
processMenuItem(submenu, menuItem)
}
}
mainMenu.Show()
}
func processMenuItem(parent *winc.MenuItem, menuItem *menu.MenuItem) {
if menuItem.Hidden {
return
}
switch menuItem.Type {
case menu.SeparatorType:
parent.SetSeparator()
case menu.TextType:
newItem := parent.AddItem(menuItem.Label, winc.NoShortcut)
if menuItem.Tooltip != "" {
newItem.SetToolTip(menuItem.Tooltip)
}
if menuItem.Click != nil {
newItem.OnClick().Bind(func(e *winc.Event) {
menuItem.Click(&menu.CallbackData{
MenuItem: menuItem,
})
})
}
newItem.SetEnabled(!menuItem.Disabled)
case menu.CheckboxType:
newItem := parent.AddItem(menuItem.Label, winc.NoShortcut)
newItem.SetCheckable(true)
newItem.SetChecked(menuItem.Checked)
if menuItem.Tooltip != "" {
newItem.SetToolTip(menuItem.Tooltip)
}
if menuItem.Click != nil {
newItem.OnClick().Bind(func(e *winc.Event) {
toggleCheckBox(menuItem)
menuItem.Click(&menu.CallbackData{
MenuItem: menuItem,
})
})
}
newItem.SetEnabled(!menuItem.Disabled)
addCheckBoxToMap(menuItem, newItem)
case menu.RadioType:
case menu.SubmenuType:
submenu := parent.AddSubMenu(menuItem.Label)
for _, menuItem := range menuItem.SubMenu.Items {
processMenuItem(submenu, menuItem)
}
}
}