generated from mstar/godot-template
82 lines
2.2 KiB
GDScript
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)
|