--- sidebar_position: 4 --- # Menus É possível adicionar um menu de aplicação aos projetos do Wails. Isso é conseguido definindo uma struct [Menu](#menu) e configurando-a no configuração do aplicativo [`Menu`](../reference/options.mdx#menu) ou chamando o método [MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). Um exemplo de como criar um menu: ```go app := NewApp() 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(app.ctx) }) if runtime.GOOS == "darwin" { AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut } err := wails.Run(&options.App{ Title: "Menus Demo", Width: 800, Height: 600, Menu: AppMenu, // reference the menu above Bind: []interface{}{ app, }, ) // ... ``` Também é possível atualizar dinamicamente o menu, atualizando o menu struct e chamando [MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). O exemplo acima usa métodos de ajuda, no entanto, é possível construir as construções do menu manualmente. ## Menu Um Menu é uma coleção de MenuItems: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" type Menu struct { Items []*MenuItem } ``` Para o menu de Aplicação, cada MenuItem representa um único menu como "Editar". Um método simples de ajuda é fornecido para menus de construção: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu ``` Isto torna o layout do código mais parecido com o de um menu sem a necessidade de adicionar os itens de menu manualmente depois de criá-los. Como alternativa, você pode apenas criar os itens de menu e adicioná-los ao menu manualmente. ## MenuItem Um MenuItem representa um item dentro de um Menu. ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" // MenuItem represents a menu item contained in a menu type MenuItem struct { Label string Role Role Accelerator *keys.Accelerator Type Type Disabled bool Hidden bool Checked bool SubMenu *Menu Click Callback } ``` | Campo | Tipo | Notas | | ----------- | ------------------------------------ | -------------------------------------------------------------------------- | | Label | string | O texto do menu | | Accelerator | [\*keys.Accelerator](#accelerator) | Vinculação de teclas para este item de menu | | Tipo | [Tipo](#type) | Tipo de MenuItem | | Disabled | bool | Desativa o item de menu | | Hidden | bool | Oculta este item de menu | | Checked | bool | Adiciona uma seleção para o item ( & Tipos de Rádio) | | SubMenu | [\*Menu](#menu) | Define o submenu | | Click | [Callback](#callback) | Função Callback quando clicado no menu | | Role | string | Define um papel [](#role) para este item de menu. Mac apenas por enquanto. | ### Accelerator Os aceleradores (às vezes chamados atalhos de teclado) definem uma ligação entre um toque de tecla e um item de menu. Lamentos define um Acelerador como uma combinação ou tecla + [Modificador](#modifier). Eles estão disponíveis no pacote `"github.com/wailsapp/wails/v2/pkg/menu/keys"`. Exemplo: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" // Defines cmd+o on Mac and ctrl-o on Window/Linux myShortcut := keys.CmdOrCtrl("o") ``` Teclas são qualquer caractere único em um teclado com exceção de `+`, que é definido como `plus`. Algumas chaves não podem ser representadas como caracteres, portanto há um conjunto de caracteres nomeados que podem ser usados: | | | | | |:-----------:|:-----:|:-----:|:---------:| | `backspace` | `f1` | `f16` | `f31` | | `tab` | `f2` | `f17` | `f32` | | `return` | `f3` | `f18` | `f33` | | `enter` | `f4` | `f19` | `f34` | | `escape` | `f5` | `f20` | `f35` | | `left` | `f6` | `f21` | `numlock` | | `right` | `f7` | `f22` | | | `up` | `f8` | `f23` | | | `down` | `f9` | `f24` | | | `space` | `f10` | `f25` | | | `delete` | `f11` | `f36` | | | `home` | `f12` | `f37` | | | `end` | `f13` | `f38` | | | `page up` | `f14` | `f39` | | | `page down` | `f15` | `f30` | | Wails também suportam a análise de aceleradores usando a mesma sintaxe que o Electron. Isso é útil para armazenar aceleradores em arquivos de configuração. Exemplo: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" // Defines cmd+o on Mac and ctrl-o on Window/Linux myShortcut, err := keys.Parse("Ctrl+Option+A") ``` #### Modificador Os seguintes modificadores são chaves que podem ser usadas em combinação com a tecla de aceleração: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" const ( // CmdOrCtrlKey represents Command on Mac and Control on other platforms CmdOrCtrlKey Modifier = "cmdorctrl" // OptionOrAltKey represents Option on Mac and Alt on other platforms OptionOrAltKey Modifier = "optionoralt" // ShiftKey represents the shift key on all systems ShiftKey Modifier = "shift" // ControlKey represents the control key on all systems ControlKey Modifier = "ctrl" ) ``` Vários métodos de ajuda estão disponíveis para criar aceleradores usando modificadores: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" func CmdOrCtrl(key string) *Accelerator func OptionOrAlt(key string) *Accelerator func Shift(key string) *Accelerator func Control(key string) *Accelerator ``` Modificadores podem ser combinados usando `keys.Combo(string de chaves, modificador 1 modificador, modificador modificador, rest ...Modificador)`: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) ``` ### Tipo Cada item de menu deve ter um tipo e existem 5 tipos disponíveis: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" const ( TextType Type = "Text" SeparatorType Type = "Separator" SubmenuType Type = "Submenu" CheckboxType Type = "Checkbox" RadioType Type = "Radio" ) ``` Para conveniência, métodos auxiliares são fornecidos para criar rapidamente um item de menu: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" 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) *Menu ``` Você também pode criar itens de menu diretamente em um menu, usando os ajudantes "Adicionar": ```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 ``` Uma nota nos grupos de rádio: Um grupo de rádio é definido como um número de itens do menu de rádio que estão próximos um ao outro no menu. Isso significa que não é necessário agrupar os itens porque é automático. No entanto, isso também significa que você não pode ter 2 grupos lado a lado - deve haver um item que não seja de rádio entre eles. ### Callback Cada item de menu pode ter um callback que é executado quando o item é clicado: ```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" type Callback func(*CallbackData) type CallbackData struct { MenuItem *MenuItem } ``` A função recebe uma instrução `CallbackData` que indica qual item de menu acionou a callback. Isso é útil quando usar grupos de rádio que podem compartilhar um callback. ### Role :::info Regras As regras que são atualmente suportados apenas no Mac. ::: Um item de menu pode ter uma função, que é essencialmente um item de menu pré-definido. Atualmente, apoiamos as seguintes funções: | Role | Descrição | | ------------ | --------------------------------------------------------------------------- | | AppMenuRole | Menu padrão do aplicativo para Mac. Pode ser criado usando `menu.AppMenu()` | | EditMenuRole | O menu de edição padrão para Mac. Pode ser criado usando `menu.EditMenu()` |