界面左方需要一个树形列表,用于目录显示。如何遍历所有节点,以及获取上级节点?一直在这里卡着,翻遍bing也没以有。github找到的示例也过于简单。
以下是树形控件双击部分,有一些测试代码。
//目录列表点击,展开下一级目录
func DirTreeClick(ls *gtk.TreeView, sel *gtk.TreeSelection) {
model, iter, ok := sel.GetSelected()
OldTreePath, _ = model.(*gtk.TreeModel).GetPath(iter) //点击的是哪个路径 0:2 第1行下的第3行
//tvmodel := sel.GetMode()
//OldTreePath.GetDepth() //点击的深度
//OldTreePath.GetIndices() //路径位置分组
//OldTreePath.IsAncestor
//t, _ := model.(*gtk.TreeModel).GetValue(iter, 0)
//f, _ := model.(*gtk.TreeModel).GetIter(a)
//t, _ := model.(*gtk.TreeModel).GetValue(f, 0)
//fmt.Println(t.GetString())
if ok {
tpath, _ := model.(*gtk.TreeModel).GetValue(iter, 0)
path, _ := tpath.GetString() //获取选择的路径
ChangGoPath("/" + path) //路径框修改
dir := getDirList("/" + path) //获取下一级目录
for _, n := range dir {
topLevel := TreeStore.Insert(iter, -1) //添加新内容TreeStore
TreeStore.SetValue(topLevel, 0, n)
child := TreeStore.Insert(topLevel, -1)
TreeStore.SetValue(child, 0, "...")
}
}
//遍历下一级所有元素
子元素数量 := model.(*gtk.TreeModel).IterNChildren(iter) // 有多少个子节点
b, _ := ls.GetModel()
var c gtk.TreeIter
for i := 0; i < 子元素数量; i++ {
b.IterNthChild(&c, iter, i)
tpath, _ := model.(*gtk.TreeModel).GetValue(&c, 0)
path, _ := tpath.GetString() //获取选择的路径
fmt.Println(i, path)
}
}
找到一个获取完整路径的方法。
现在想办法处理下一个问题:删除某一项
sel *gtk.TreeSelection
model, iter, ok := sel.GetSelected()
CurrPath, _ := model.(*gtk.TreeModel).GetPath(iter) //点击的是哪个路径 0:2 第1行下的第3行
path := GetTreePath(model, CurrPath)
//获取树形完整目录
func GetTreePath(model gtk.ITreeModel, tree *gtk.TreePath) (ret string) {
path := strings.Split(tree.String(), ":")
for i, _ := range path {
chg_path := strings.Join(path[0:i+1], ":")
//获取路径内容
it, _ := TreeStore.GetIterFromString(chg_path)
t, _ := model.(*gtk.TreeModel).GetValue(it, 0)
p, _ := t.GetString() //获取选择的路径
ret = ret + "/" + p
}
return
}
根据遍历下一级列表,删除填充项
var TreeStore *gtk.TreeStore
TreeStore, _ := gtk.TreeStoreNew(glib.TYPE_STRING)
//获取到下一级的第一个元素,如果是...,则删除
b, _ := ls.GetModel()
var c gtk.TreeIter
b.IterNthChild(&c, iter, 0)
tpath, _ := model.(*gtk.TreeModel).GetValue(&c, 0)
path, _ := tpath.GetString() //获取选择的路径
if path == "..." {
TreeStore.Remove(&c)
}
接下来处理:1. TreeView滚动条 2. 判断已添加过目录的列表项
处理已载入过列表
num := model.(*gtk.TreeModel).IterNChildren(iter)
if num == 1 && first_path == "..." && ok { //没有载入过目录:只有一项为...
滚动条已添加,明白了就很简单:就是在TreeView控件外套一个ScrolledWindow。当内容越大时,就会自动出现滚动条。
接下来的问题是右方的文件列表。
没有文档,没有示例,真是一件很浪费时间的事。在作者的源文档中看到很多TODO。
2020.7.24
今天在Win10下进行了环境安装。同样的代码却不能直接运行,提示没有某函数。说明兼容性还是个问题。在Ubuntu下也不能交叉编译通过。
看起来,如果有更好的,它也不是一个好选择。毕竟golang的特点就是跨平台性。