(原) Golang之GUI: gotk3 续二

原创文章,请后转载,并注明出处。

界面左方需要一个树形列表,用于目录显示。如何遍历所有节点,以及获取上级节点?一直在这里卡着,翻遍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的特点就是跨平台性。

相关文章