メインコンテンツにスキップ
バージョン: 次期バージョン 🚧

メニュー

Wailsプロジェクトに、アプリケーションメニューを追加することができます。 Menu構造体を定義し、アプリケーション設定のMenuオプションへ設定するか、ランタイムのMenuSetApplicationMenuメソッドを呼び出すことで、メニューを表示させることができます。

メニューを作成する例:


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,
},
)
// ...

Menu構造体を更新し、MenuUpdateApplicationMenuメソッドを呼び出すことで、メニューを動的に更新することも可能です。

上記の例では、ヘルパーメソッドを使用していますが、Menu構造体を手動で構築することも可能です。

Menuは、MenuItemのコレクションです。

Package: github.com/wailsapp/wails/v2/pkg/menu
type Menu struct {
Items []*MenuItem
}

アプリケーションメニューにおいて、各MenuItemは、"編集"などの単一メニューを表します。

メニューを構築するするためのシンプルなヘルパーメソッドが提供されています:

Package: github.com/wailsapp/wails/v2/pkg/menu
func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu

これにより、コードのレイアウトが、実際のメニューと似たレイアウトになるため、メニュー項目を作成した後にそれを手動で追加するといった作業は必要なくなります。 ヘルパーを使用せず、メニュー項目を作成して手動でメニューに追加することもできます。

MenuItemは、メニュー内の項目を表します。

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
}
フィールド内容
Labelstringメニューのテキスト
Accelerator*keys.Acceleratorこのメニュー項目のキーバインディング
メニュー項目の種類
Disabledboolメニュー項目を無効化する
Hiddenboolメニュー項目を非表示にする
Checkedbool項目にチェックを追加する (チェックボックス & ラジオタイプ)
SubMenu*Menuサブメニューを設定する
ClickCallbackメニューがクリックされたときのコールバック関数
Rolestringメニュー項目にロールを定義する。 現在のところ、Macでのみ有効です。

Accelerator

Accelerator(キーボードショートカット) は、キーストロークとメニュー項目とのバインドを定義します。 Wailsでは、Acceleratorを、キー + Modifierの組み合わせとして定義しています。 これらは"github.com/wailsapp/wails/v2/pkg/menu/keys"パッケージから利用可能です。

例:

Package: github.com/wailsapp/wails/v2/pkg/menu/keys
    // Defines cmd+o on Mac and ctrl-o on Window/Linux
myShortcut := keys.CmdOrCtrl("o")

キーは、+を除いて、キーボード上の任意の一文字です(+は、plusで定義されています)。 いくつかのキーは一文字で表現できないため、名前付き文字のセットがあります:

backspacef1f16f31
tabf2f17f32
returnf3f18f33
enterf4f19f34
escapef5f20f35
leftf6f21numlock
rightf7f22
upf8f23
downf9f24
spacef10f25
deletef11f36
homef12f37
endf13f38
page upf14f39
page downf15f30

またWailsでは、Electronと同じ構文のAcceleratorを解析することもできます。 設定ファイルにAcceleratorを保存する際に便利です。

例:

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")

Modifier

ModifierはAcceleratorキーと組み合わせて使用できるキーです:

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"
)

Modifierを使用してAcceleratorを作成するためのヘルパーメソッドがあります:

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

Modifierはkeys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)を使用して組み合わせることができます:

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)

各メニュー項目は5種類のうちの1タイプを指定する必要があります:

Package: github.com/wailsapp/wails/v2/pkg/menu
const (
TextType Type = "Text"
SeparatorType Type = "Separator"
SubmenuType Type = "Submenu"
CheckboxType Type = "Checkbox"
RadioType Type = "Radio"
)

使い勝手の良い、メニュー項目をすばやく作成するためのヘルパーメソッドが提供されています:

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

"Add"ヘルパーメソッドを使用して、メニューに対して直接メニュー項目を追加することも可能です:

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

ラジオグループに関する注意事項: ラジオグループは、メニュー内でお互いに隣接しているラジオメニュー項目同士で1つのグループとして定義されます。 つまり、手動でグループ化する必要はありません。 逆に言うと、2つのラジオグループを隣接させることはできません。ラジオグループの間には、ラジオ項目ではないメニューアイテムが必要です。

Callback

各メニュー項目には、項目がクリックされたときに呼び出されるコールバックがあります:

Package: github.com/wailsapp/wails/v2/pkg/menu
type Callback func(*CallbackData)

type CallbackData struct {
MenuItem *MenuItem
}

このコールバックには、どのメニュー項目がコールバックをトリガーしたのかを識別できる、CallbackData構造体が渡されます。 これは、同じコールバックを呼び出すラジオグループを作成する際などに便利です。

Role

ロール

現在、ロールはMacでのみサポートされています。

メニュー項目には、もともと事前に定義されたメニュー項目のロールを設定することができます。 現在サポートされているロールは次のとおりです:

ロール説明
AppMenuRoleMacアプリケーションの標準メニュー。 menu.AppMenu()で作成できます。
EditMenuRoleMacの標準的な編集メニュー。 menu.EditMenu()で作成できます。