hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - WALKでGUI - Menu

Menuの使用例。以下の構造のメニューを作成しました。

  File               Else
  ├ Open            └ About
  ├ SubMenu
  |  └ SubItem1
  └ Exit

MainWinsdowのMenuItemsフィールドにMenuウィジェットを階層的に置いていき末端の項目にはActionウィジェットを置いています。
各ActionのOnTriggeredフィールドには処理のメソッド名を記載しますが、Exitメニュ項目のみ直接関数を記載しています。

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

import (
	"fmt"
	"os"
)

type MyMainWindow struct {
	*walk.MainWindow

	edit   *walk.TextEdit
}

func main() {
	mw := &MyMainWindow {}

	MW := MainWindow{
		AssignTo: &mw.MainWindow,
		Title: "Menuテスト",
		MinSize: Size {150, 200},
		Size   : Size {300, 300},
		Layout: VBox {},
		MenuItems: []MenuItem{
			Menu{
				Text: "&File",
				Items: []MenuItem{
					Action{
						Text: "&Open",
						OnTriggered: mw.menuOpen,
					},
					Menu{
						Text: "SubMenu",
						Items: []MenuItem{
							Action{
								Text: "SubItem1",
								OnTriggered: mw.menuSub1,
							},
						},
					},
					Separator{},
					Action{
						Text: "&Exit",
						OnTriggered: func() { mw.Close() },
					},
				},
			},
			Menu{
				Text: "&Else",
				Items: []MenuItem{
					Action{
						Text: "&About",
						OnTriggered: mw.menuAbout,
					},
				},
			},
		},
		Children: []Widget {
			TextEdit {
				AssignTo: &mw.edit,
			},
		},
	}

	if _, err := MW.Run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}

}

func (mw *MyMainWindow) menuOpen() {
	mw.edit.AppendText("Event : File -> Open select\r\n")
}

func (mw *MyMainWindow) menuSub1() {
	mw.edit.AppendText("Event : File -> SubMenu -> SubItem1 select\r\n")
}

func (mw *MyMainWindow) menuAbout() {
	mw.edit.AppendText("Event : Else -> About select\r\n")
}