hakeの日記

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

Go言語 - WALKでGUI - DialogBox

DialogBoxの使用例。
DialogBoxで入力した文字列をMain Windowに表示させています。
Main側と同様にDialogのレイアウトと実体用の構造体を用意します。一点だけ追加として、DefaultButtonとCancelButtonフィールドに各々対応するPushButtonの実体を割り当てます。
ダイアログを開く関数RunMyDialogの第二引数として、MyDialogData型構造体の参照を渡してMainとDialog間のデータやりとりを行っています。関数の戻り値は、Dialog側で閉じるときにクリックされたキーの情報が返されます。
Dialog側では、OKボタンがクリックされたときに入力されたデータをMyDialogData型構造体に退避しています。


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: "DialogBoxテスト",
		MinSize: Size {150, 200},
		Size   : Size {300, 300},
		Layout: VBox {},
		Children: []Widget {
			TextEdit {
				AssignTo: &mw.edit,
			},
			PushButton {
				Text: "Open Dialog",
				OnClicked: mw.pbClicked,
			},
		},
	}

	if _, err := MW.Run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}
/*
	DlgCmdNone     = 0
	DlgCmdOK       = win.IDOK
	DlgCmdCancel   = win.IDCANCEL
	DlgCmdAbort    = win.IDABORT
	DlgCmdRetry    = win.IDRETRY
	DlgCmdIgnore   = win.IDIGNORE
	DlgCmdYes      = win.IDYES
	DlgCmdNo       = win.IDNO
	DlgCmdClose    = win.IDCLOSE
	DlgCmdHelp     = win.IDHELP
	DlgCmdTryAgain = win.IDTRYAGAIN
	DlgCmdContinue = win.IDCONTINUE
	DlgCmdTimeout  = win.IDTIMEOUT
*/

func (mw *MyMainWindow) pbClicked() {

	dlgdata := new(MyDialogData)

	cmd, err := RunMyDialog(mw, dlgdata)
	if err != nil {
		fmt.Println(err)
	} else if cmd == walk.DlgCmdCancel { // Canceボタンクリック
		mw.edit.AppendText("Message: Dialog Cancel\r\n")
		return
	} else if cmd == walk.DlgCmdNone {  // 右上xクリック
		mw.edit.AppendText("Message: Dialog Cancel(x)\r\n")
		return
	}
	mw.edit.AppendText(fmt.Sprintf("Dialog String: %s\r\n", dlgdata.msg))
}


// MainWindowとDialog間でデータを渡す構造体
type MyDialogData struct{
	msg  string
}

// Dialogで使用するウィジェットの実体
type MyDialogWindow struct{
	dlg      *walk.Dialog
	edit     *walk.LineEdit
	acceptPB *walk.PushButton
	cancelPB *walk.PushButton
}


func RunMyDialog(owner walk.Form, dlgdata *MyDialogData) (int, error) {

	mydlg := new(MyDialogWindow)

	MYDLG := Dialog{
		AssignTo:      &mydlg.dlg,
		Title:         "Dialog",
		DefaultButton: &mydlg.acceptPB,
		CancelButton:  &mydlg.cancelPB,
		MinSize: Size{300, 100},
		Layout:  VBox{},
		Children: []Widget{
			Composite{
				Layout: HBox{},
				Children: []Widget{
					Label{
						Text: "Input:",
					},
					LineEdit{
						AssignTo: &mydlg.edit,
					},
				},
			},
			Composite{
				Layout: HBox{},
				Children: []Widget{
					PushButton{
						AssignTo: &mydlg.acceptPB,
						Text:     "OK",
						OnClicked: func(){
							mydlg.acceptCliked(dlgdata)
						},
					},
					PushButton{
						AssignTo:  &mydlg.cancelPB,
						Text:      "Cancel",
						OnClicked: func() { mydlg.dlg.Cancel() },
					},
				},
			},
		},
	}

	return MYDLG.Run(owner)
}

// Dialog OKクリック時の処理
func(mydlg *MyDialogWindow) acceptCliked(dlgdata *MyDialogData) { 
	dlgdata.msg = mydlg.edit.Text()
	mydlg.dlg.Accept()
}