Skip to content

Commit

Permalink
Seralization and deserialized of typed properties in array (#175)
Browse files Browse the repository at this point in the history
  • Loading branch information
imothee authored Jun 18, 2024
1 parent 4827489 commit 4beba3e
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 13 deletions.
16 changes: 11 additions & 5 deletions addons/pandora/model/type.gd
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,17 @@ func allow_nesting() -> bool:
static func lookup(name:String) -> PandoraPropertyType:
if name == "":
return UndefinedType.new()
var ScriptType = load("res://addons/pandora/model/types/" + name + ".gd")
if ScriptType != null and ScriptType.has_source_code():
return ScriptType.new()
else:
return UndefinedType.new()

var klass = PandoraPropertyType
var types_dir = klass.resource_path.get_base_dir()
var type_path = types_dir + "/types/" + name + ".gd"

if ResourceLoader.exists(type_path):
var ScriptType = load(type_path)
if ScriptType != null and ScriptType.has_source_code():
return ScriptType.new()

return UndefinedType.new()

static func get_all_types() -> Array[PandoraPropertyType]:
var types:Array[PandoraPropertyType] = []
Expand Down
41 changes: 34 additions & 7 deletions addons/pandora/model/types/array.gd
Original file line number Diff line number Diff line change
Expand Up @@ -39,26 +39,53 @@ func parse_value(variant:Variant, settings:Dictionary = {}) -> Variant:
value = load(value)
if settings[SETTING_ARRAY_TYPE] == "color":
value = Color.from_string(value, Color.WHITE)
else:
if value is Dictionary and value.has("type") and value.has("value"):
var value_type = value["type"]
var dict_value = value["value"]

var type = PandoraPropertyType.lookup(value_type)
if type != null:
value = type.parse_value(dict_value)

array.append(value)
return array
return variant



func write_value(variant:Variant) -> Variant:
var array = variant as Array
var dict = {}
if not array.is_empty():
var types = PandoraPropertyType.get_all_types()
var value_type

for i in range(array.size()):
var value = array[i]
if value is PandoraEntity:
value_type = PandoraPropertyType.lookup("reference")
value = PandoraReference.new(value.get_entity_id(), PandoraReference.Type.CATEGORY if value is PandoraCategory else PandoraReference.Type.ENTITY).save_data()
elif value is Resource:
value = value.resource_path
elif value is Color:
value = value.to_html()

elif value is PandoraReference:
value_type = PandoraPropertyType.lookup("reference")
value = value.save_data()
else:
for type in types:
if type.is_valid(value):
value_type = type
value = type.write_value(value)
break

if value != null:
dict[str(i)] = value
if value_type == null:
dict[str(i)] = value
else:
dict[str(i)] = {
"type": value_type.get_type_name(),
"value": value
}

return dict


func allow_nesting() -> bool:
return false
2 changes: 2 additions & 0 deletions addons/pandora/ui/components/array_editor/array_manager.gd
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ func _load_items():
elif array_type == 'reference':
if value is Dictionary:
value = Pandora.get_entity(value["_entity_id"])
elif value is PandoraReference:
value = value.get_entity()
item_property.set_default_value(value)
_add_property_control(control, item_property, i)

Expand Down
12 changes: 11 additions & 1 deletion test/backend/entity_backend_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -244,15 +244,25 @@ func test_save_and_load_data() -> void:
var category_a = backend.create_category("a")
var category_b = backend.create_category("b")
var category_c = backend.create_category("c", category_b)
var category_d = backend.create_category("d")
backend.create_entity("a", category_a)
backend.create_entity("b", category_b)
backend.create_property(category_c, "property1", "string", "Hello World")
backend.create_property(category_d, "typed_array", "array", [Color.RED])
var old_entity_1 = backend.create_entity("Entity 1", category_d)

var data = backend.save_data()
assert_that(data._categories).is_not_null()
assert_that(data._entities).is_not_null()

backend.load_data(data)

var new_entity_1 = backend.get_entity(old_entity_1.get_entity_id())

var old_color_array = old_entity_1.get_array("typed_array")
var new_color_array = new_entity_1.get_array("typed_array")

assert_that(new_color_array[0]).is_equal(old_color_array[0])
assert_that(old_entities).is_equal(backend._entities)
assert_that(old_categories).is_equal(backend._categories)

Expand Down
12 changes: 12 additions & 0 deletions test/model/property_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,18 @@ func test_array_property_wrong_type() -> void:
new_property.load_data(property.save_data())
assert_that(new_property.get_default_value()).is_equal("")

func test_array_property_custom_parsers() -> void:
var array_type = load("res://addons/pandora/model/types/array.gd")
var category = Pandora.create_category("Test Category")
var property = Pandora.create_property(category, "property", "array")
property.set_setting_override(array_type.SETTING_ARRAY_TYPE, "color")
var entity = Pandora.create_entity("entity", category)
var entity_property = entity.get_entity_property("property")
entity_property.set_default_value([Color.WHITE])
entity.load_data(entity.save_data())
assert_that(entity.get_array("property")[0]).is_equal(Color.WHITE)
assert_that(typeof(entity.get_array("property")[0])).is_not_equal(TYPE_STRING)

func test_vector2_property() -> void:
var vector = Vector2.ONE
var property = PandoraProperty.new("123", "property", "vector2")
Expand Down

0 comments on commit 4beba3e

Please sign in to comment.