108 lines
2.9 KiB
GDScript3
108 lines
2.9 KiB
GDScript3
|
@tool
|
||
|
extends Control
|
||
|
|
||
|
## Emitted when the user requests to toggle the sidebar.
|
||
|
signal sidebar_toggle_requested()
|
||
|
|
||
|
## The currently selected node or null
|
||
|
var _selected_node:Node
|
||
|
## The editor interface
|
||
|
var _editor_interface:EditorInterface
|
||
|
## The undo/redo facility
|
||
|
var _undo_redo:EditorUndoRedoManager
|
||
|
|
||
|
@onready var _add_section:Control = %AddSection
|
||
|
@onready var _no_options_label:Control = %NoOptionsLabel
|
||
|
@onready var _add_node_name_line_edit:LineEdit = %AddNodeNameLineEdit
|
||
|
@onready var _add_grid_container:Control = %AddGridContainer
|
||
|
|
||
|
|
||
|
func setup(editor_interface:EditorInterface, undo_redo:EditorUndoRedoManager):
|
||
|
_editor_interface = editor_interface
|
||
|
_undo_redo = undo_redo
|
||
|
|
||
|
|
||
|
func change_selected_node(node):
|
||
|
_selected_node = node
|
||
|
_repaint()
|
||
|
|
||
|
func _repaint():
|
||
|
# we can add states to all composite states and to the
|
||
|
# root if the root has no child state yet.
|
||
|
var can_add_states = \
|
||
|
( _selected_node is StateChart and _selected_node.get_child_count() == 0 ) \
|
||
|
or _selected_node is ParallelState \
|
||
|
or _selected_node is CompoundState
|
||
|
|
||
|
# we can add transitions to all states
|
||
|
var can_add_transitions = \
|
||
|
_selected_node is State
|
||
|
|
||
|
_add_section.visible = can_add_states or can_add_transitions
|
||
|
_no_options_label.visible = not (can_add_states or can_add_transitions)
|
||
|
|
||
|
|
||
|
for btn in _add_grid_container.get_children():
|
||
|
if btn.is_in_group("statebutton"):
|
||
|
btn.visible = can_add_states
|
||
|
else:
|
||
|
btn.visible = can_add_transitions
|
||
|
|
||
|
|
||
|
func _create_node(type, name:StringName):
|
||
|
|
||
|
var final_name = _add_node_name_line_edit.text.strip_edges()
|
||
|
if final_name.length() == 0:
|
||
|
final_name = name
|
||
|
|
||
|
var new_node = type.new()
|
||
|
_undo_redo.create_action("Add " + final_name)
|
||
|
_undo_redo.add_do_method(_selected_node, "add_child", new_node)
|
||
|
_undo_redo.add_undo_method(_selected_node, "remove_child", new_node)
|
||
|
_undo_redo.add_do_reference(new_node)
|
||
|
_undo_redo.add_do_method(new_node, "set_owner", _selected_node.get_tree().edited_scene_root)
|
||
|
_undo_redo.add_do_property(new_node, "name", final_name)
|
||
|
_undo_redo.commit_action()
|
||
|
|
||
|
|
||
|
if Input.is_key_pressed(KEY_SHIFT):
|
||
|
_editor_interface.get_selection().clear()
|
||
|
_editor_interface.get_selection().add_node(new_node)
|
||
|
|
||
|
_add_node_name_line_edit.grab_focus()
|
||
|
_editor_interface.edit_node(new_node)
|
||
|
_repaint()
|
||
|
|
||
|
|
||
|
|
||
|
func _on_atomic_state_pressed():
|
||
|
_create_node(AtomicState, "AtomicState")
|
||
|
|
||
|
|
||
|
func _on_compound_state_pressed():
|
||
|
_create_node(CompoundState, "CompoundState")
|
||
|
|
||
|
|
||
|
func _on_parallel_state_pressed():
|
||
|
_create_node(ParallelState, "ParallelState")
|
||
|
|
||
|
|
||
|
func _on_history_state_pressed():
|
||
|
_create_node(HistoryState, "HistoryState")
|
||
|
|
||
|
|
||
|
func _on_transition_pressed():
|
||
|
_create_node(Transition, "Transition")
|
||
|
|
||
|
|
||
|
func _on_animation_tree_state_pressed():
|
||
|
_create_node(AnimationTreeState, "AnimationTreeState")
|
||
|
|
||
|
|
||
|
func _on_animation_player_state_pressed():
|
||
|
_create_node(AnimationPlayerState, "AnimationPlayerState")
|
||
|
|
||
|
|
||
|
func _on_toggle_sidebar_button_pressed():
|
||
|
sidebar_toggle_requested.emit()
|