概述
基于EasyTreeData
解析的扩展Tree
控件。
EasyTreeData(ETD)
EasyTreeData(ETD)是一种基于Tab缩进的简单层级结构数据,可以用于描述树形结构。能够被解析为Tree控件或表示树形结构的其他类或控件。
根目录 | 0
节点1
节点2 | 0
节点3
节点4
节点5
节点6
ETD相关文章
- 【Godot 4.2】Tree控件与TreeItem完全解析
- 【Godot4.2】Tree控件自定义树形数据ETD及其解析
- 【Godot4.2】EasyTreeData通用解析
- 【Godot4.2】基于EasyTreeData解析的扩展Tree控件 - ETDTree
Godot4.2自定义控件系列目录
- 文件系统自定义控件 - FileSystemTree
- 文件系统自定义控件 - GroupButtons
- 文件系统自定义控件 - DirListView
- 基于EasyTreeData解析的扩展Tree控件 - ETDTree
类图关系
代码
# =============================================
# 名称:ETDTree
# 类型:自定义节点(扩展控件)
# 描述:基于EasyTreeData(ETD)数据的扩展Tree控件
# 作者:巽星石
# Godot版本:v4.3.stable.steam [77dcf97d8]
# 创建时间:2024年9月19日23:40:06
# 最后修改时间:2024年9月19日23:55:59
# =============================================
@tool
class_name ETDTree extends Tree
# ================================ 参数 ================================
## EasyTreeData
@export_multiline var data:String:
set(val):
data = val
reload()
## 图标集
@export var icons:Array[Texture2D]:
set(val):
icons = val
reload()
## 图标最大宽度
@export var icon_width = 16:
set(val):
icon_width = val
reload()
# ================================ 方法 ================================
# 解析和重新加载Tree结构
func reload():
clear() # 清空
var items = data.split("\n",false) # 将ETD字符串按行切分为字符串数组
var pre_itm:TreeItem # 记录前一项对应的TreeItem
var p_itm = null # 记录父节点
# 遍历每行数据
for i in range(items.size()):
# 第1行直接添加为Tree控件的根节点(跳过下面if部分)
# 从第2行开始比较当前行与前一行的缩进深度(也就是\t的数目)
if i > 0:
var d_deep = deep(items[i-1]) - deep(items[i]) # 与前一行数据的缩进差值
match d_deep:
-1: # 缩进比前一项深:
p_itm = pre_itm # 将前一项作为父节点
0: # 缩进深度与前一项一样:
p_itm = pre_itm.get_parent() # 父节点与前一项父节点一样
_:
if d_deep>0: # 缩进比前一项浅
# 通过缩进差值计算获得合适的父节点
p_itm = pre_itm
for j in range(d_deep+1):
p_itm = p_itm.get_parent()
# 实际创建和添加TreeItem到Tree控件
var itm:TreeItem = create_item(p_itm)
# 解析单项的具体信息
if items[i].find(" | ")>0:
var itm_data = items[i].split(" | ")
itm.set_text(0,itm_data[0])
if icons.size() > int(itm_data[1]):
itm.set_icon(0,icons[int(itm_data[1])])
itm.set_icon_max_width(0,icon_width)
else:
itm.set_text(0,items[i])
pre_itm = itm # 将当前项记录为前一项
# 返回字符串的Tab缩进值
func deep(sttr:String):
return sttr.rstrip(" ").count("\t")