You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.4 KiB
61 lines
1.4 KiB
6 months ago
|
@tool
|
||
|
extends DialogicVisualEditorField
|
||
|
|
||
|
## Event block field for editing arrays.
|
||
|
|
||
|
const PairValue = "res://addons/dialogic/Editor/Events/Fields/dictionary_part.tscn"
|
||
|
|
||
|
func _ready():
|
||
|
%Add.icon = get_theme_icon("Add", "EditorIcons")
|
||
|
|
||
|
|
||
|
func _set_value(value:Variant) -> void:
|
||
|
for child in %Values.get_children():
|
||
|
child.queue_free()
|
||
|
|
||
|
var dict : Dictionary
|
||
|
|
||
|
# attempt to take dictionary values, create a fresh one if not possible
|
||
|
if typeof(value) == TYPE_DICTIONARY:
|
||
|
dict = value
|
||
|
elif typeof(value) == TYPE_STRING:
|
||
|
if value.begins_with('{'):
|
||
|
var result = JSON.parse_string(value)
|
||
|
if result != null:
|
||
|
dict = result as Dictionary
|
||
|
else:
|
||
|
dict = Dictionary()
|
||
|
else:
|
||
|
dict = Dictionary()
|
||
|
|
||
|
var keys := dict.keys()
|
||
|
var values := dict.values()
|
||
|
|
||
|
for index in dict.size():
|
||
|
var x :Node = load(PairValue).instantiate()
|
||
|
%Values.add_child(x)
|
||
|
x.set_key(keys[index])
|
||
|
x.set_value(values[index])
|
||
|
x.value_changed.connect(recalculate_values)
|
||
|
|
||
|
|
||
|
func _on_value_changed(value:Variant) -> void:
|
||
|
value_changed.emit(property_name, value)
|
||
|
|
||
|
|
||
|
func recalculate_values() -> void:
|
||
|
var dict := {}
|
||
|
for child in %Values.get_children():
|
||
|
if !child.is_queued_for_deletion():
|
||
|
dict[child.get_key()] = child.get_value()
|
||
|
_on_value_changed(dict)
|
||
|
|
||
|
|
||
|
func _on_AddButton_pressed() -> void:
|
||
|
var x :Control = load(PairValue).instantiate()
|
||
|
%Values.add_child(x)
|
||
|
x.set_key("")
|
||
|
x.set_value("")
|
||
|
x.value_changed.connect(recalculate_values)
|
||
|
recalculate_values()
|