listboxにカレントディレクトリのファイルの一覧を表示します。ディレクトリをダブルクリックするとカレントディレクトリを移動します。
プロジェクトの作成
ソースコード
package main
import (
"io/ioutil"
"log"
"os"
"path/filepath"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
func main() {
mw := &MyMainWindow{model: &ListModel{items: []ListItem{}}}
mw.model.SetDir(".")
if _, err := (MainWindow{
AssignTo: &mw.MainWindow,
Title: "Walk ListBox Example",
MinSize: Size{240, 320},
Size: Size{300, 400},
Layout: VBox{MarginsZero: true},
Children: []Widget{
HSplitter{
Children: []Widget{
ListBox{
AssignTo: &mw.lb,
Model: mw.model,
//OnCurrentIndexChanged: mw.lb_CurrentIndexChanged,
OnItemActivated: mw.lb_ItemActivated,
},
},
},
},
}.Run()); err != nil {
log.Fatal(err)
}
}
type MyMainWindow struct {
*walk.MainWindow
model *ListModel
lb *walk.ListBox
}
/*
func (mw *MyMainWindow) lb_CurrentIndexChanged() {
i := mw.lb.CurrentIndex()
if i < 0 {
return
}
}
*/
func (mw *MyMainWindow) lb_ItemActivated() {
value := mw.model.items[mw.lb.CurrentIndex()].value
fInfo, _ := os.Stat(value)
if fInfo.IsDir() {
mw.model.SetDir(value)
}
}
type ListItem struct {
name string
value string
}
type ListModel struct {
walk.ListModelBase
items []ListItem
}
func (m *ListModel) ItemCount() int {
return len(m.items)
}
func (m *ListModel) Value(index int) interface{} {
return m.items[index].name
}
func (m *ListModel) SetDir(dirPath string) {
dir, _ := filepath.Abs(dirPath)
os.Chdir(dir)
m.items = nil
m.items = append(m.items, ListItem{"[..]", filepath.Join(dir, "..")})
files, _ := ioutil.ReadDir(dirPath)
for _, file := range files {
nam := file.Name()
val := filepath.Join(dirPath, file.Name())
fInfo, _ := os.Stat(val)
if fInfo.IsDir() {
nam = "[" + file.Name() + "]"
}
m.items = append(m.items, ListItem{nam, val})
}
m.PublishItemsReset()
}
ビルド&実行
go build
./プロジェクト名.exe
コメント