---
sidebar_position: 4
---

# メニュー

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

メニューを作成する例:

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

Menu構造体を更新し、[MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu)メソッドを呼び出すことで、メニューを動的に更新することも可能です。

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

## Menu

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

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

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

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

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

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

## MenuItem

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

```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
}
```

| フィールド       | 型                                    | 内容                                           |
| ----------- | ------------------------------------ | -------------------------------------------- |
| Label       | string                               | メニューのテキスト                                    |
| Accelerator | [\*keys.Accelerator](#accelerator) | このメニュー項目のキーバインディング                           |
| 型           | [型](#type)                           | メニュー項目の種類                                    |
| Disabled    | bool                                 | メニュー項目を無効化する                                 |
| Hidden      | bool                                 | メニュー項目を非表示にする                                |
| Checked     | bool                                 | 項目にチェックを追加する (チェックボックス & ラジオタイプ)             |
| SubMenu     | [\*Menu](#menu)                    | サブメニューを設定する                                  |
| Click       | [Callback](#callback)                | メニューがクリックされたときのコールバック関数                      |
| Role        | string                               | メニュー項目に[ロール](#role)を定義する。 現在のところ、Macでのみ有効です。 |

### Accelerator

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

例:

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

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

|             |       |       |           |
|:-----------:|:-----:|:-----:|:---------:|
| `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では、Electronと同じ構文のAcceleratorを解析することもできます。 設定ファイルにAcceleratorを保存する際に便利です。

例:

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

#### Modifier

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

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

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

```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
```

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

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

### 型

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

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

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

```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
```

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

```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
```

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

### Callback

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

```go title="Package: github.com/wailsapp/wails/v2/pkg/menu"
type Callback func(*CallbackData)

type CallbackData struct {
    MenuItem    *MenuItem
}
```

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

### Role

:::info ロール

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

:::

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

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