Go言語「WALK」リストボックスとファイルの一覧

Go言語 コンピュータ
Go言語

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

コメント