who the fuck knows

This commit is contained in:
Dan 2024-05-08 17:06:15 +01:00
parent 1c33ea2f59
commit 1da411cacd
31 changed files with 1372 additions and 78 deletions

View file

@ -0,0 +1,64 @@
# Utility class for parsing and hacking the editor
## Find menu button to add option to
static func find_animation_menu_button(node: Node) -> MenuButton:
var animation_editor := find_editor_control_with_class(node, "AnimationPlayerEditor")
if animation_editor:
return find_editor_control_with_class(
animation_editor,
"MenuButton",
func(node): return node.text == "Animation"
)
return null
## General utility to find a control in the editor using an iterative search
static func find_editor_control_with_class(
base: Control,
p_class_name: StringName,
condition := func(node: Node): return true
) -> Node:
if base.get_class() == p_class_name and condition.call(base):
return base
for child in base.get_children():
if not child is Control:
continue
var found = find_editor_control_with_class(child, p_class_name)
if found:
return found
return null
# Finds the active animation player (either pinned or selected)
static func find_active_anim_player(base_control: Control, scene_tree: Tree) -> AnimationPlayer:
var find_anim_player_recursive: Callable
var pin_icon := scene_tree.get_theme_icon("Pin", "EditorIcons")
var stack: Array[TreeItem] = []
stack.append(scene_tree.get_root())
while not stack.is_empty():
var current := stack.pop_back() as TreeItem
# Check for pin icon
for i in current.get_button_count(0):
if current.get_button(0, i) == pin_icon:
var node := base_control.get_node_or_null(current.get_metadata(0))
if node is AnimationPlayer:
return node
if current.is_selected(0):
var node := base_control.get_node_or_null(current.get_metadata(0))
if node is AnimationPlayer:
return node
for i in range(current.get_child_count() - 1, -1, -1):
stack.push_back(current.get_child(i))
return null