generated from mstar/godot-template
83 lines
2.2 KiB
GDScript3
83 lines
2.2 KiB
GDScript3
|
@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)
|