Go GUI---lxn/walk 自带demo学习---7.文件浏览器
如上图,从左到右用来TreeView、TableView、WebView
定义了一个名为Directory的目录结构体,每个目录理论上有一个父节点,有0到n个子节点。
type Directory struct {name stringparent *Directorychildren []*Directory
}
filebrowser.go
// Copyright 2011 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.package mainimport ("log""os""path/filepath""time"
)import ("github.com/lxn/walk". "github.com/lxn/walk/declarative"
)type Directory struct {name stringparent *Directorychildren []*Directory
}func NewDirectory(name string, parent *Directory) *Directory {return &Directory{name: name, parent: parent}
}var _ walk.TreeItem = new(Directory)func (d *Directory) Text() string {return d.name
}func (d *Directory) Parent() walk.TreeItem {if d.parent == nil {// We can't simply return d.parent in this case, because the interface// value then would not be nil.return nil}return d.parent
}func (d *Directory) ChildCount() int {if d.children == nil {// It seems this is the first time our child count is checked, so we// use the opportunity to populate our direct children.if err := d.ResetChildren(); err != nil {log.Print(err)}}return len(d.children)
}func (d *Directory) ChildAt(index int) walk.TreeItem {return d.children[index]
}func (d *Directory) Image() interface{} {return d.Path()
}func (d *Directory) ResetChildren() error {d.children = nildirPath := d.Path()if err := filepath.Walk(d.Path(), func(path string, info os.FileInfo, err error) error {if err != nil {if info == nil {return filepath.SkipDir}}name := info.Name()if !info.IsDir() || path == dirPath || shouldExclude(name) {return nil}d.children = append(d.children, NewDirectory(name, d))return filepath.SkipDir}); err != nil {return err}return nil
}func (d *Directory) Path() string {elems := []string{d.name}dir, _ := d.Parent().(*Directory)for dir != nil {elems = append([]string{dir.name}, elems...)dir, _ = dir.Parent().(*Directory)}return filepath.Join(elems...)
}type DirectoryTreeModel struct {walk.TreeModelBaseroots []*Directory
}var _ walk.TreeModel = new(DirectoryTreeModel)func NewDirectoryTreeModel() (*DirectoryTreeModel, error) {model := new(DirectoryTreeModel)drives, err := walk.DriveNames()if err != nil {return nil, err}for _, drive := range drives {switch drive {case "A:\\", "B:\\":continue}model.roots = append(model.roots, NewDirectory(drive, nil))}return model, nil
}func (*DirectoryTreeModel) LazyPopulation() bool {// We don't want to eagerly populate our tree view with the whole file system.return true
}func (m *DirectoryTreeModel) RootCount() int {return len(m.roots)
}func (m *DirectoryTreeModel) RootAt(index int) walk.TreeItem {return m.roots[index]
}type FileInfo struct {Name stringSize int64Modified time.Time
}type FileInfoModel struct {walk.SortedReflectTableModelBasedirPath stringitems []*FileInfo
}var _ walk.ReflectTableModel = new(FileInfoModel)func NewFileInfoModel() *FileInfoModel {return new(FileInfoModel)
}func (m *FileInfoModel) Items() interface{} {return m.items
}func (m *FileInfoModel) SetDirPath(dirPath string) error {m.dirPath = dirPathm.items = nilif err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {if err != nil {if info == nil {return filepath.SkipDir}}name := info.Name()if path == dirPath || shouldExclude(name) {return nil}item := &FileInfo{Name: name,Size: info.Size(),Modified: info.ModTime(),}m.items = append(m.items, item)if info.IsDir() {return filepath.SkipDir}return nil}); err != nil {return err}m.PublishRowsReset()return nil
}func (m *FileInfoModel) Image(row int) interface{} {return filepath.Join(m.dirPath, m.items[row].Name)
}func shouldExclude(name string) bool {switch name {case "System Volume Information", "pagefile.sys", "swapfile.sys":return true}return false
}func main() {var mainWindow *walk.MainWindowvar splitter *walk.Splittervar treeView *walk.TreeViewvar tableView *walk.TableViewvar webView *walk.WebViewtreeModel, err := NewDirectoryTreeModel()if err != nil {log.Fatal(err)}tableModel := NewFileInfoModel()if err := (MainWindow{AssignTo: &mainWindow,Title: "Walk File Browser Example",MinSize: Size{600, 400},Size: Size{1024, 640},Layout: HBox{MarginsZero: true},Children: []Widget{HSplitter{AssignTo: &splitter,Children: []Widget{TreeView{AssignTo: &treeView,Model: treeModel,OnCurrentItemChanged: func() {dir := treeView.CurrentItem().(*Directory)if err := tableModel.SetDirPath(dir.Path()); err != nil {walk.MsgBox(mainWindow,"Error",err.Error(),walk.MsgBoxOK|walk.MsgBoxIconError)}},},TableView{AssignTo: &tableView,StretchFactor: 2,Columns: []TableViewColumn{TableViewColumn{DataMember: "Name",Width: 192,},TableViewColumn{DataMember: "Size",Format: "%d",Alignment: AlignFar,Width: 64,},TableViewColumn{DataMember: "Modified",Format: "2006-01-02 15:04:05",Width: 120,},},Model: tableModel,OnCurrentIndexChanged: func() {var url stringif index := tableView.CurrentIndex(); index > -1 {name := tableModel.items[index].Namedir := treeView.CurrentItem().(*Directory)url = filepath.Join(dir.Path(), name)}webView.SetURL(url)},},WebView{AssignTo: &webView,StretchFactor: 2,},},},},}.Create()); err != nil {log.Fatal(err)}splitter.SetFixed(treeView, true)splitter.SetFixed(tableView, true)mainWindow.Run()
}
Go GUI---lxn/walk 自带demo学习---7.文件浏览器相关推荐
- Go GUI---lxn/walk 自带demo学习---16.notifyicon通知图标
简单说明:通知图标demo,原文都有注释,很好理解 需要一个walk.MainWindow 或一个walk.Dialog用于他们的消息循环.但是本例中让MainWindow 不可见. 创建通知图标,并 ...
- AutoJs学习-实现文件浏览器
往期文章分享 点击跳转=><导航贴>- Unity手册,系统实战学习 点击跳转=><导航贴>- Android手册,重温移动开发
- Py:python利用easygui实现最简单GUI带你学习区块链技术的发展和由来
Py:python利用easygui实现最简单GUI带你学习区块链技术的发展和由来 目录 输出结果 实现代码 输出结果 实现代码 # -*- coding: utf-8 -*- ''' Created ...
- Go实战--使用golang开发Windows Gui桌面程序(lxn/walk)
生命不止,继续 go go go!!! golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了. 知 ...
- RPG游戏Demo学习笔记一
导航 RPG游戏Demo学习笔记一 UE笔记 -- 一个简单的AI_weixin_52918492的博客-CSDN博客 目录 一.准备资源 二.基础功能 生命值与能量值 创建Widget Bluepr ...
- 微信语音idk的demo学习
微信语音idk的demo学习 1. if ([[[UIDevice currentDevice]systemVersion]floatValue]>=7) { NSLog(@"%f&q ...
- 通过demo学习OpenStack开发——单元测试
本文将进入单元测试的部分,这也是基础知识中最后一个大块.本文将重点讲述Python和OpenStack中的单元测试的生态环境. 通过demo学习OpenStack开发--单元测试\ 单元测试的重要性\ ...
- android vlayout 阿里,带你学习阿里巴巴的开源库VLayout
原标题:带你学习阿里巴巴的开源库VLayout 今日科技快讯 14日,京东在总部召开"京东游戏泛娱乐产业联盟发布会",宣布完成对原LPL(英雄联盟职业联赛)队伍QG战队及LSPL( ...
- 如何用excle制作黑人拉馆_家居DIY带你学习如何用塑料勺制作壁挂!
「家居DIY」带你学习如何用塑料勺制作壁挂! DIY生活馆图片展示内容介绍 传承手工艺术,放飞指尖梦想,每一节教学我们都会认真对待!只为传递手工技艺,动手实践能够让生活更美好,它让这一平淡的生活眼前一 ...
最新文章
- 配置中心Apollo的设计原理
- Map中的key,value null取值
- PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写
- Vue中的前后台交互
- 深度学习概述:从感知机到深度网络
- python 全部缩进一行_Python(48)语言参考2:词法分析
- 详解三种主流分布式事务方案的优劣
- 论坛一大早白屏,无法访问
- Node.js 根本没有这样搞性能优化的?
- IIS PHP MYSQL出现问题,IIS 运行PHP 正常使用MYSQL 解决报错0x000000ff
- unity三维向量变化为角度_三维旋转
- 嘉楠发布阿瓦隆浸入式冷却矿机A1066I
- stm32f407 spi3 mosi没有输出_入门篇 | STM32F407寄存器开发点灯
- replaceFirst、replaceAll、replace区别
- EF之通过不同条件查找去重复
- 静态NAT、动态NAT、PAT(端口多路复用)的配置
- 计算机数据处理规模大小分为,计算机组成原理题集样稿.doc
- 从源码角度探索 Mybatis 插件注册方式
- 判断是否为字母 ctype
- 数学脱式计算在线计算机,四年级数学脱式计算练习400题
热门文章
- 【模型加速】PointPillars模型TensorRT加速实验(5)
- 北方工业大学计算机专硕分数线,北方工业大学法硕:近三年分数线汇总,一分钟速了解详细...
- debian10安装docker
- EduCoder-Linux与Python编程2021(顺序与选择结构)
- I/O复用:select、poll和epoll函数
- 云梦四时歌如何在电脑上玩 云梦四时歌模拟器教程
- 少女枪战怎么用电脑玩 少女枪战模拟器玩法教程
- 暴风播酷云二期J3455 DS918 1.04b引导6.23完美群晖教程,可硬洗,正常开关机、WOL
- Too many files with unapproved license异常、使用-Drat.skip=true跳过 或者 对没有授权的文件开头添加授权
- javascript动画制作