@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)