Skip to content

Instantly share code, notes, and snippets.

@me2beats
Last active December 21, 2021 00:37
Show Gist options
  • Save me2beats/3ef7b7857df4d5240a93d6c6a457e91c to your computer and use it in GitHub Desktop.
Save me2beats/3ef7b7857df4d5240a93d6c6a457e91c to your computer and use it in GitHub Desktop.
godot TreeUtils
class_name TreeUtils
static func get_child_by_text(item:TreeItem, text: String, col = 0):
item = item.get_children()
while item:
if item.get_text(col) == text:
return item
item = item.get_next()
static func get_item_children(item:TreeItem)->Array:
item = item.get_children()
var children = []
while item:
children.append(item)
item = item.get_next()
return children
static func get_item_by_path(tree:Tree, path:PoolStringArray)->TreeItem:
# path = ['foo', 'bar']
var item:TreeItem = tree.get_root()
for wanted_name in path:
item = get_child_by_text(item, wanted_name)
if not item: return item
return item
#get all selected items
static func get_selected(tree:Tree)->Array:
var res = []
var item = tree.get_next_selected(tree.get_root())
while true:
if not item: break
res.push_back(item)
item = tree.get_next_selected(item)
return res
static func get_item_children_rec(item:TreeItem)->Array:
var items = [item]
var result = []
while items:
item = items.pop_back()
result.push_back(item)
var children = get_item_children(item)
items.append_array(children)
return result
# uses get_nodes_and_depths() from node_utils
static func create_tree_items_from_node_tree(
root_node:Node,
tree:Tree,
root_tree_item:TreeItem,
set_text_from_names: = true,
skip_nonowners: = true
)->void:
var last_deps_items = {0:root_tree_item}
if not root_node.get_child_count(): return
var nodes_and_depths = get_nodes_and_depths(root_node, true)
for i in nodes_and_depths[0].size():
var node = nodes_and_depths[0][i]
if skip_nonowners and !node.owner: continue
var depth = nodes_and_depths[1][i]
var item:TreeItem = tree.create_item(last_deps_items[depth-1])
if set_text_from_names:
item.set_text(0, node.name)
last_deps_items[depth] = item
if set_text_from_names:
root_tree_item.set_text(0, root_node.name)
static func get_item_idx(item:TreeItem)->int:
if not item.get_parent(): return 0
var item_ = item.get_parent().get_children()
var i = 0
while item_:
if item == item_: return i
item_ = item_.get_next()
i+=1
return -1
static func any_parent_of_is(item1:TreeItem, item2:TreeItem)->bool:
while item1:
item1 = item1.get_parent()
if item1 == item2:
return true
return false
# just creates new item with children with item names
# only names available (no item buttons etc) <- Todo?
static func duplicate_item(tree:Tree, item:TreeItem, new_parent:TreeItem, new_idx:int)->TreeItem:
var new_item = tree.create_item(new_parent, new_idx)
new_item.set_text(0, item.get_text(0))
for i in get_item_children(item):
var child = tree.create_item(new_item)
child.set_text(0, i.get_text(0))
return new_item
static func get_item_depth(item:TreeItem):
var i = -1
while item:
item = item.get_parent()
i+=1
return i
static func get_item_parents(item:TreeItem)->Array:
var result: = []
item = item.get_parent()
while item:
result.push_back(item)
item = item.get_parent()
return result
static func get_items_all_parents(items:Array):
var parents = {}
for i in items:
i = i as TreeItem
for j in get_item_parents(i):
parents[j] = true
return parents
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment