pollen-not-included/addons/anim_player_refactor/plugin.gd
2024-05-08 17:06:15 +01:00

144 lines
3.8 KiB
GDScript

@tool
extends EditorPlugin
const RefactorDialogue := preload("scenes/refactor_dialogue/refactor_dialogue.gd")
const AnimPlayerInspectorButton := preload("scenes/inspector_button/inspector_button.gd")
const EditorUtil := preload("lib/editor_util.gd")
var activate_button: AnimPlayerInspectorButton
var refactor_dialogue: RefactorDialogue
var anim_menu_button: MenuButton
var _last_anim_player: AnimationPlayer
const SCENE_TREE_IDX := 0
var _scene_tree: Tree
func _enter_tree() -> void:
# Create dialogue
refactor_dialogue = load("res://addons/anim_player_refactor/scenes/refactor_dialogue/refactor_dialogue.tscn").instantiate()
get_editor_interface().get_base_control().add_child(refactor_dialogue)
refactor_dialogue.init(self)
# Create menu button
_add_refactor_option(func():
refactor_dialogue.popup_centered()
refactor_dialogue.reset_size()
)
func _exit_tree() -> void:
if refactor_dialogue and refactor_dialogue.is_inside_tree():
get_editor_interface().get_base_control().remove_child(refactor_dialogue)
refactor_dialogue.queue_free()
_remove_refactor_option()
func _handles(object: Object) -> bool:
if object is AnimationPlayer:
_last_anim_player = object
return false
# Editor methods
func get_anim_player() -> AnimationPlayer:
# Check for pinned animation
if not _scene_tree:
var _scene_tree_editor = EditorUtil.find_editor_control_with_class(
get_editor_interface().get_base_control(),
"SceneTreeEditor"
)
if not _scene_tree_editor:
push_error("[Animation Refactor] Could not find scene tree editor. Please report this.")
return null
_scene_tree = _scene_tree_editor.get_child(SCENE_TREE_IDX)
if not _scene_tree:
push_error("[Animation Refactor] Could not find scene tree editor. Please report this.")
return null
var found_anim := EditorUtil.find_active_anim_player(
get_editor_interface().get_base_control(),
_scene_tree
)
if found_anim:
return found_anim
# Get latest edited
return _last_anim_player
# Plugin buttons
const TOOL_REFACTOR := 999
const TOOL_ANIM_LIBRARY := 1
func _add_refactor_option(on_pressed: Callable):
var base_control := get_editor_interface().get_base_control()
if not anim_menu_button:
anim_menu_button = EditorUtil.find_animation_menu_button(base_control)
if not anim_menu_button:
push_error("Could not find Animation menu button. Please report this issue.")
return
# Remove item up to "Manage Animations..."
var menu_popup := anim_menu_button.get_popup()
var items := []
var count := menu_popup.item_count - 1
while count >= 0 and menu_popup.get_item_id(count) != TOOL_ANIM_LIBRARY:
if menu_popup.is_item_separator(count):
items.append({})
else:
items.append({
"shortcut": menu_popup.get_item_shortcut(count),
"id": menu_popup.get_item_id(count),
"icon": menu_popup.get_item_icon(count)
})
menu_popup.remove_item(count)
count -= 1
# Add refactor item
menu_popup.add_icon_item(
base_control.get_theme_icon(&"Reload", &"EditorIcons"),
"Refactor",
TOOL_REFACTOR,
)
# Re-add items
for i in range(items.size() - 1, -1, -1):
var item: Dictionary = items[i]
if not item.is_empty():
menu_popup.add_shortcut(item.shortcut, item.id)
menu_popup.set_item_icon(menu_popup.get_item_index(item.id), item.icon)
else:
menu_popup.add_separator()
menu_popup.notification(NOTIFICATION_TRANSLATION_CHANGED)
menu_popup.id_pressed.connect(_on_menu_button_pressed)
func _remove_refactor_option():
if not anim_menu_button:
return
var base_control := get_editor_interface().get_base_control()
var menu_popup := anim_menu_button.get_popup()
menu_popup.remove_item(menu_popup.get_item_index(TOOL_REFACTOR))
menu_popup.id_pressed.disconnect(_on_menu_button_pressed)
func _on_menu_button_pressed(id: int):
if id == TOOL_REFACTOR:
refactor_dialogue.popup_centered()