From ebf4cf13f25834bc248554779fb00778467d602c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 9 Apr 2022 20:36:48 +1000 Subject: [PATCH] Feature: Add menu helpers --- v2/pkg/menu/menu.go | 36 +++++++++++++++++++++ website/docs/reference/menus.mdx | 55 +++++++++++++++++++++----------- 2 files changed, 72 insertions(+), 19 deletions(-) diff --git a/v2/pkg/menu/menu.go b/v2/pkg/menu/menu.go index be04820d3..0c3ddb618 100644 --- a/v2/pkg/menu/menu.go +++ b/v2/pkg/menu/menu.go @@ -1,5 +1,7 @@ package menu +import "github.com/wailsapp/wails/v2/pkg/menu/keys" + type Menu struct { Items []*MenuItem } @@ -20,6 +22,40 @@ func (m *Menu) Merge(menu *Menu) { } } +// AddText adds a TextMenu item to the menu +func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem { + item := Text(label, accelerator, click) + m.Append(item) + return item +} + +// AddCheckbox adds a CheckboxMenu item to the menu +func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem { + item := Checkbox(label, checked, accelerator, click) + m.Append(item) + return item +} + +// AddRadio adds a radio item to the menu +func (m *Menu) AddRadio(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem { + item := Radio(label, checked, accelerator, click) + m.Append(item) + return item +} + +// AddSeparator adds a separator to the menu +func (m *Menu) AddSeparator() { + item := Separator() + m.Append(item) +} + +func (m *Menu) AddSubmenu(label string) *Menu { + submenu := NewMenu() + item := SubMenu(label, submenu) + m.Append(item) + return submenu +} + func (m *Menu) Prepend(item *MenuItem) { m.Items = append([]*MenuItem{item}, m.Items...) } diff --git a/website/docs/reference/menus.mdx b/website/docs/reference/menus.mdx index 03961a505..bab623586 100644 --- a/website/docs/reference/menus.mdx +++ b/website/docs/reference/menus.mdx @@ -5,28 +5,35 @@ sidebar_position: 4 # Menus It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and -setting the [`Menu`](../reference/options.mdx#menu) option, or by calling the runtime method [MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). +setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method +[MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). + +An example of how to create a menu: + +```go + AppMenu := menu.NewMenu() + FileMenu := AppMenu.AddSubmenu("File") + FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) + FileMenu.AddSeparator() + FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { + runtime.Quit() + }) + + err := wails.Run(&options.App{ + Title: "Menus Demo", + Width: 800, + Height: 600, + Menu: AppMenu, + Bind: []interface{}{ + app, + }, + ) + // ... +```` It is also possible to dynamically update the menu, by updating the menu struct and calling [MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). -Example: - -```go - myMenu := menu.NewMenuFromItems( - menu.SubMenu("File", menu.NewMenuFromItems( - menu.Text("&Open", keys.CmdOrCtrl("o"), openFile), - menu.Separator(), - menu.Text("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }), - )), - ) - - runtime.MenuSetApplicationMenu(myMenu) - -``` - The example above uses helper methods, however it's possible to build the menu structs manually. ## Menu @@ -211,8 +218,18 @@ func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem func Separator() *MenuItem func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *MenuItem +func SubMenu(label string, menu *Menu) *Menu ``` +You can also create menu items directly on a menu by using the "Add" helpers: + +```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" +func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem +func (m *Menu) AddSeparator() *MenuItem +func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem +func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem +func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI +``` + A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2