gduibasics/scenes/scripts/variant_editor.gd
2021-08-21 17:15:07 +02:00

78 lines
1.5 KiB
GDScript

tool
extends Control
enum Type {
STRING,
INT,
REAL
}
onready var edt_text := $edt_text
onready var spin_number := $spin_number
export var value = "" setget _set_value
export(Type) var type = Type.STRING setget _set_type
func _ready():
__setup_type()
func __setup_type():
match type:
Type.STRING:
edt_text.visible = true
Type.INT, Type.REAL:
spin_number.visible = true
_set_value(convert(value, __type_id()))
__fill_value()
emit_signal("value_changed")
func __fill_value():
match type:
Type.STRING:
edt_text.text = str(value)
Type.INT, Type.REAL:
spin_number.value = float(value)
func __type_id() -> int:
match type:
Type.STRING:
return TYPE_STRING
Type.INT:
return TYPE_INT
Type.REAL:
return TYPE_REAL
_:
assert(false)
return TYPE_STRING
func _set_value(val):
val = convert(val, __type_id())
if typeof(value) != __type_id() || value != val:
value = val
__fill_value()
func _set_type(value : int):
if value != type:
type = value
for child in get_children():
child.visible = false
__setup_type()
func _on_edt_text_text_changed(new_text : String):
assert(type == Type.STRING)
if !value is String || value != new_text:
value = new_text
emit_signal("value_changed")
func _on_spin_number_value_changed(value_ : float):
assert(type == Type.INT || type == Type.REAL)
if type == Type.INT:
value_ = int(value_)
if typeof(value) != __type_id() || value != value_:
value = value_
emit_signal("value_changed")
signal value_changed()