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() }