Last active
December 21, 2021 00:37
-
-
Save me2beats/3ef7b7857df4d5240a93d6c6a457e91c to your computer and use it in GitHub Desktop.
godot TreeUtils
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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