who the fuck knows
This commit is contained in:
parent
1c33ea2f59
commit
1da411cacd
31 changed files with 1372 additions and 78 deletions
64
addons/anim_player_refactor/lib/editor_util.gd
Normal file
64
addons/anim_player_refactor/lib/editor_util.gd
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue