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  }