hakeの日記

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

Go言語 - WALKでGUI - 部品を並べる

とりあえずPushButtonを並べてみる。

縦に並べる

MainWindowのLayoutフィールドにVBoxを指定して、Childrenフィールドの[]Widgetに部品を入れていく。
ちなみにLayoutをHBoxにすると横に並びます。

package main

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

import (
	"fmt"
	"os"
)

type MyMainWindow struct {
	*walk.MainWindow
}

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

	MW := MainWindow{
		AssignTo: &mw.MainWindow,
		Title: "メインウィンドウ",
		MinSize: Size {150, 200},
		Size   : Size {300, 400},
		Layout: VBox {},
		Children: []Widget {
			PushButton {
				Text: "PB0",
			},
			PushButton {
				Text: "PB1",
			},
			PushButton {
				Text: "PB2",
			},
		},
	}


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

各段内で横に並べる

   


2段目と3段目にPushButtonの代わりにHSplitterを置いて、その中に部品を置いていくことで横方向に並んで行きます。2段目は水平方向に3分割して中央にHSpacerを置いて空白を作っています。
2つのHSplitterのStretchFactorフィールドを設定すると高さの割合?が調整できるようです。

HSplitterの中だとボタンはエリア一杯に広がる様です。(左図) 広がらないようにするにはHSplitterの代わりにComposite{ Layout:HBox{} }とします。(右図)

	HSplitter{
		StretchFactor: 20,
		……
	}

	Composite{
		Layout: HBox{},
		……
	}
package main

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

import (
	"fmt"
	"os"
)

type MyMainWindow struct {
	*walk.MainWindow
}

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

	MW := MainWindow{
		AssignTo: &mw.MainWindow,
		Title: "メインウィンドウ",
		MinSize: Size {150, 200},
		Size   : Size {300, 400},
		Layout: VBox {},
		Children: []Widget {
			PushButton {
				Text: "PB0",
			},
			HSplitter{
				StretchFactor: 20,
				Children: []Widget {
					PushButton {       // Splitter中のボタン面積は
						Text: "PB1",   //   エリア全体に広がる
					},
					HSpacer{},
					PushButton {
						Text: "PB2",
					},
				},
			},
			HSplitter{
				StretchFactor: 1,
				Children: []Widget {
					PushButton {
						Text: "PB3",
					},
					PushButton {
						Text: "PB4",
					},
				},
			},
			PushButton {
				Text: "PB5",
			},
		},
	}


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

縦横に並べる

縦横に部品を置く場合は、LayoutフィールドにGrid{Colmuns: n}として、Colmunsフィールドで列数を指定します。段数はChildrenフィールドに入れる部品の数で決まります。ただしGridはMainWindowのLayoutフィールドには置けないようなので、Compositeを一段入れてから使用する必要があるみたい。
PB1はColmunSpanフィールドに2を設定することで2列分の幅にしています。RowSpanフィールドも試しましたが現状では機能していない様です。

package main

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

import (
	"fmt"
	"os"
)

type MyMainWindow struct {
	*walk.MainWindow
}

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

	MW := MainWindow{
		AssignTo: &mw.MainWindow,
		Title: "メインウィンドウ",
		MinSize: Size {150, 200},
		Size   : Size {300, 400},
		Layout: VBox{},
		Children: []Widget {
			Composite{
				Layout: Grid {Columns : 3}, // GridはCompositeの中のみ可。
				Children: []Widget {
					PushButton {
						Text: "PB0",
					},
					PushButton {
						ColumnSpan : 2,
						Text: "PB1",
					},
//					PushButton {
//						RowSpan : 2,  // 機能しない?
//						Text: "PB2",
//					},
					PushButton {
						Text: "PB3",
					},
					VSplitter{
						Children: []Widget {
							PushButton {
								Text: "PB4",
							},
							VSpacer{},
						},
					},
					VSplitter{
						Children: []Widget {
							VSpacer {},
							PushButton {
								Text: "PB5",
							},
						},
					},
				},
			},
			PushButton {
				Text: "PB6",
			},
		},
	}


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