【Godot4.2】文件系统自定义控件 - FileSystemTree

FileSystemTree

B站【Godot4.2】文件系统自定义节点 - FileSystemTree

概述

在Godot设计编辑器插件或应用程序时,可能需要涉及文件系统的显示,比如文件夹或文件的树形列表。

我们可以用Godot的Tree控件快速书写相应的功能,但是为了复用到不同的项目,最好是设计为自定义节点。

FileSystemTree就是一个专门显示文件夹结构的树控件,扩展自Godot的Tree控件。基于Godot4.2版本实现。

它的设计依托于我在Godot3.5版本时的设计思路,并摒弃了场景元件的思路,而采用纯粹的自定义节点--一种特殊的自定义类,这样就只需要一个.gd的代码文件,你就可以复用到任何需要的项目。

而且它也摒弃了依赖的静态函数库,而是一切自给自足,所以单独使用是完全没有问题的。

完整代码

以下是完整代码,你至于要将其拷贝到你的项目中,可以起名叫"FileSystemTree.gd"。

然后通过添加节点,搜索Tree或FileSystemTree就可以找到并添加它了。

swift 复制代码
# =============================================
# 名称:FileSystemTree
# 类型:自定义节点(扩展控件)
# 描述:专用于显示某文件夹结构的Tree控件
# 作者:巽星石
# Godot版本:v4.2.1.stable.official [b09f793f5]
# 创建时间:2024年2月7日20:20:45
# 最后修改时间:2024年2月7日23:48:19
# =============================================

@tool
extends Tree
class_name FileSystemTree

## 要显示的文件夹根目录
@export_global_dir var dir_path:String:
	set(val):
		dir_path = val
		reload()

@export_group("icon")
## 文件夹图标
@export var dir_icon:Texture2D:
	set(val):
		dir_icon = val
		reload()

## 文件图标
@export var file_icon:Texture2D:
	set(val):
		file_icon = val
		reload()

@export_group("set")
## 支持的文件后缀名列表,可以写点也可以不写
@export var file_filters:Array[String]:
	set(val):
		file_filters = val
		reload()

## 强制显示所有类型的文件,忽略file_filters的设置
@export var show_all_file:bool = false:
	set(val):
		show_all_file = val
		reload()

# ========================= 方法 =========================
# 重新加载
func reload():
	clear()
	# 将根目录设定为根节点
	var root = create_item()
	root.set_text(0,dir_path.replace("/","//"))
	root.set_icon(0,dir_icon)
	# 加载子文件夹和子文件
	load_dir(dir_path,root)
	
# 加载指定根目录下的文件夹和文件
func load_dir(path:String,p_node:TreeItem = null):
	# 1.加载子文件夹列表
	var dirs = DirAccess.get_directories_at(path)
	for dir in dirs:
		var itm = create_item(p_node)
		itm.set_text(0,dir)
		itm.set_icon(0,dir_icon)
		# 1.1 递归子文件夹
		load_dir("%s/%s" % [path,dir],itm)
	
	# 2.加载子文件列表
	var files = DirAccess.get_files_at(path)
	for file in files:
		if show_all_file: # 强制显示所有类型的文件
			var itm = create_item(p_node)
			itm.set_text(0,file)
			itm.set_icon(0,file_icon)
		else:             # 只显示相应后缀名的文件
			for filter in file_filters:
				filter = filter if filter.begins_with(".") else "." + filter
				if file.ends_with(filter):
					var itm = create_item(p_node)
					itm.set_text(0,file)
					itm.set_icon(0,file_icon)

# 返回当前选中项在Tree中的完整路径
func get_rel_path(item:TreeItem)-> String:
	var _path =""
	if item.get_parent(): # 有父节点
		# 递归父节点
		_path = get_rel_path(item.get_parent()) + "/" + item.get_text(0)
	else:# 根节点
		_path = item.get_text(0)
	return _path
相关推荐
wowocpp25 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
萨格拉斯救世主1 小时前
jenkins使用slave节点进行node打包报错问题处理
运维·jenkins
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
pk_xz1234563 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强3 小时前
Linux之sed命令详解
linux·运维·服务器
海绵波波1073 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云5 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock5 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零6 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络