pokemon-base/addons/imjp94.yafsm/scenes/state_nodes/StateNode.gd
2025-01-26 20:23:56 +01:00

82 lines
2.2 KiB
GDScript

@tool
extends "res://addons/imjp94.yafsm/scenes/flowchart/FlowChartNode.gd"
const State = preload("../../src/states/State.gd")
const StateMachine = preload("../../src/states/StateMachine.gd")
signal name_edit_entered(new_name) # Emits when focused exit or Enter pressed
@onready var name_edit = $MarginContainer/NameEdit
var undo_redo
var state:
set = set_state
func _init():
super._init()
set_state(State.new())
func _ready():
name_edit.focus_exited.connect(_on_NameEdit_focus_exited)
name_edit.text_submitted.connect(_on_NameEdit_text_submitted)
set_process_input(false) # _input only required when name_edit enabled to check mouse click outside
func _draw():
if state is StateMachine:
if selected:
draw_style_box(get_theme_stylebox("nested_focus", "StateNode"), Rect2(Vector2.ZERO, size))
else:
draw_style_box(get_theme_stylebox("nested_normal", "StateNode"), Rect2(Vector2.ZERO, size))
else:
super._draw()
func _input(event):
if event is InputEventMouseButton:
if event.pressed:
# Detect click outside rect
if get_viewport().gui_get_focus_owner() == name_edit:
var local_event = make_input_local(event)
if not name_edit.get_rect().has_point(local_event.position):
name_edit.release_focus()
func enable_name_edit(v):
if v:
set_process_input(true)
name_edit.editable = true
name_edit.selecting_enabled = true
name_edit.mouse_filter = MOUSE_FILTER_PASS
mouse_default_cursor_shape = CURSOR_IBEAM
name_edit.grab_focus()
else:
set_process_input(false)
name_edit.editable = false
name_edit.selecting_enabled = false
name_edit.mouse_filter = MOUSE_FILTER_IGNORE
mouse_default_cursor_shape = CURSOR_ARROW
name_edit.release_focus()
func _on_state_name_changed(new_name):
name_edit.text = new_name
size.x = 0 # Force reset horizontal size
func _on_state_changed(new_state):
if state:
state.name_changed.connect(_on_state_name_changed)
if name_edit:
name_edit.text = state.name
func _on_NameEdit_focus_exited():
enable_name_edit(false)
name_edit.deselect()
emit_signal("name_edit_entered", name_edit.text)
func _on_NameEdit_text_submitted(new_text):
enable_name_edit(false)
emit_signal("name_edit_entered", new_text)
func set_state(s):
if state != s:
state = s
_on_state_changed(s)