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

FileSystemTree

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

概述

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

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

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

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

而且它也摒弃了依赖的静态函数库,而是一切自给自足,所以单独使用是完全没有问题的。
在这里插入图片描述

完整代码

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

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

在这里插入图片描述

# =============================================
# 名称:FileSystemTree
# 类型:自定义节点(扩展控件)
# 描述:专用于显示某文件夹结构的Tree控件
# 作者:巽星石
# Godot版本:v4.2.1.stable.official [b09f793f5]
# 创建时间:20242720:20:45
# 最后修改时间:20242723: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/378858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试C卷 - 最富裕的小家庭( Python C C++ JavaGo JS PHP)

题目描述 在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值。一个小家庭由一个节点及其直接相连的子节点组成。 现在给定一颗树,我们需要计算最富裕的小家庭的财富和。 输入描述 输入包括以下几行: 一个整…

Project2013下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件,不仅可以快速、准确地创建项目计划,而且可以帮助项目经理实现项目进度、成本的控制、分析和预测,使项目工期大大缩短,资源得到有效利用,提高经济效益。软件设计目的在于协助专案经理发…

2024年【广东省安全员B证第四批(项目负责人)】考试及广东省安全员B证第四批(项目负责人)考试题

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批(项目负责人)考试考前必练!安全生产模拟考试一点通每个月更新广东省安全员B证第四批(项目负责人)考试题题目及答案!多做几…

基于AST实现一键自动提取替换国际化文案

背景:在调研 formatjs/cli 使用(使用 formatjs/cli 进行国际化文案自动提取 )过程中,发现有以下需求formatjs/cli 无法满足: id 需要一定的语义化; defaultMessage和Id不能直接hash转换; 需要…

MySQL篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、水平分区二、分库分表之后,id 主键如何处理三、存储过程(特定功能的 SQL 语句集)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你…

仰暮计划|“舅舅的大女儿失踪了,当时找遍了整个村庄,也报了警”

我的舅舅是1961年出生在一个偏僻的小山沟里,我只在很小的时候跟着我的妈妈回去过,我对于那里的印象很模糊,只有半镶在土窑里的小平房,门前的一条栽满樱桃树的很深的土沟,通往门前的陡峭的小路和露天的院子里那一颗茂盛…

LabVIEW动平衡测试与振动分析系统

LabVIEW动平衡测试与振动分析系统 介绍了利用LabVIEW软件和虚拟仪器技术开发一个动平衡测试与振动分析系统。该系统旨在提高旋转机械设备的测试精度和可靠性,通过精确测量和分析设备的振动数据,以识别和校正不平衡问题,从而保证机械设备的高…

图数据库 之 Neo4j - 环境搭建(2)

运行环境: centos7 Docker version 18.09.6 下载镜像 docker search neo4j docker pull neo4j 创建 neo4j 用户 # 创建 neo4j 用户 # -M 不创建用户的主目录 sudo useradd -M neo4j # usermod 用于修改用户属性命令 # -L 锁定用户,用户无法登录系统 user…

深入Pandas:精通文本数据处理的20+技巧与应用实例【第68篇—python:文本数据处理】

文章目录 Pandas文本数据处理方法详解1. str/object类型转换2. 大小写转换3. 文本对齐4. 获取长度5. 出现次数6. 编码方向7. 字符串切片8. 字符串替换9. 字符串拆分10. 字符串连接11. 字符串匹配12. 去除空格13. 多条件过滤14. 字符串排序15. 字符串格式化16. 多列文本操作17. …

Android Studio安装过程遇到SDK无法安装问题解决

首次打开studio遇到该类问题,需要下载SDK文件,后又发现SDK由于是Google源,无法进行正常安装,故转而进行SDK的镜像安装。 一、下载SDK Tools 地址:AndroidDevTools - Android开发工具 Android SDK下载 Android Studio…

c语言动态数组的实现

动态数组是在程序运行时动态分配内存空间的数组,可以根据需要随时改变大小。在C语言中,动态数组通常通过指针和malloc函数来实现。 使用malloc函数动态分配内存空间: int *arr; int size 10; arr (int*)malloc(size * sizeof(int));使用r…

【Java八股面试系列】并发编程-进程与线程

目录 进程 线程 线程和进程的区别 Java线程和操作系统的线程的区别 请简要描述一下进程和线程在Java中的关系,区别及优缺点?​编辑​编辑​编辑 并发和并行的区别 为什么要使用多线程? 线程的生命周期 什么是线程上下文切换? sleep() 方法和…

Java Stram 流对于返回对象的处理 (结束流)

Java Stram 流对于返回对象的处理 (结束流) package com.zhong.streamdemo.showdownstreamdemo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.*; import java.util.stream.Collectors; im…

Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

📁 前情提要: Springboot 整合 Elasticsearch(一):Linux下安装 Elasticsearch 8.x Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES 目录 一、Springboot 整合 Elasticsea…

【FPGA】快速学习路径

FPGA学习教程、功利式学习路径、以找工作为目的,早日入门FPGA_哔哩哔哩_bilibili

Redis篇之集群

一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据同…

倒计时61天

M-智乃的36倍数(normal version)_2024牛客寒假算法基础集训营3 (nowcoder.com) //非ac代码,超时了,54.17/100#include<bits/stdc.h> using namespace std; const int N1e55; const int inf0x3f3f3f3f; #define int long long int n; string s1[N]; void solve() {cin>…

第五篇【传奇开心果系列】vant开发移动应用示例:深度解读高度可定制

传奇开心果博文系列 系列博文目录Vant 开发移动应用示例系列 博文目录前言一、Vant高度可定制的重要作用二、样式定制介绍和示例代码三、组件定制介绍和示例代码四、组件库定制介绍和示例代码五、主题定制介绍和示例代码六、语言环境定制介绍和示例代码七、资源加载定制介绍和示…

[当人工智能遇上安全] 11.威胁情报实体识别 (2)基于BiGRU-CRF的中文实体识别万字详解

您或许知道&#xff0c;作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用&#xff0c;您就有福利了&#xff0c;作者将重新打造一个《当人工智能遇上安全》系列博客&#xff0c;详细介绍人工智能与安全相关的论文、实践&#xff0c;并分享各种案…

DMA直接内存访问,STM32实现高速数据传输使用配置

1、DMA运用场景 随着智能化、信息化的不断推进&#xff0c;嵌入式设备的数据处理量也呈现指数级增加&#xff0c;因此对于巨大的数据量处理的情况时&#xff0c;必须采取其它的方式去替CPU减负&#xff0c;以保证嵌入式设备性能。例如SD卡存储器和音视频、网络高速通信等其它情…