Skip to content

Commit 897e8ca

Browse files
committed
Keep variants when updating an extension.
1 parent 4fd82bb commit 897e8ca

11 files changed

+67
-9
lines changed

Core/GDCore/Project/EventsBasedObject.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ EventsBasedObject::EventsBasedObject()
2222

2323
EventsBasedObject::~EventsBasedObject() {}
2424

25-
void EventsBasedObject::SerializeTo(SerializerElement& element) const {
25+
26+
void EventsBasedObject::SerializeToExternal(SerializerElement& element) const {
2627
element.SetAttribute("defaultName", defaultName);
2728
if (isRenderedIn3D) {
2829
element.SetBoolAttribute("is3D", true);
@@ -42,7 +43,10 @@ void EventsBasedObject::SerializeTo(SerializerElement& element) const {
4243
// AbstractEventsBasedEntity::SerializeTo must be done after.
4344
defaultVariant.SerializeTo(element);
4445
AbstractEventsBasedEntity::SerializeTo(element);
46+
}
4547

48+
void EventsBasedObject::SerializeTo(SerializerElement& element) const {
49+
SerializeToExternal(element);
4650
variants.SerializeVariantsTo(element.AddChild("variants"));
4751
}
4852

@@ -58,7 +62,9 @@ void EventsBasedObject::UnserializeFrom(gd::Project& project,
5862
defaultVariant.UnserializeFrom(project, element);
5963
AbstractEventsBasedEntity::UnserializeFrom(project, element);
6064

61-
variants.UnserializeVariantsFrom(project, element.GetChild("variants"));
65+
if (element.HasChild("variants")) {
66+
variants.UnserializeVariantsFrom(project, element.GetChild("variants"));
67+
}
6268

6369
if (element.HasChild("isUsingLegacyInstancesRenderer")) {
6470
isUsingLegacyInstancesRenderer =

Core/GDCore/Project/EventsBasedObject.h

+6
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,12 @@ class GD_CORE_API EventsBasedObject: public AbstractEventsBasedEntity {
341341
defaultVariant.SetAreaMaxZ(areaMaxZ);
342342
}
343343
///@}
344+
345+
/**
346+
* @brief Serialize the events-based object for an extension in an external file.
347+
* Variants are not serialized.
348+
*/
349+
void SerializeToExternal(SerializerElement& element) const;
344350

345351
void SerializeTo(SerializerElement& element) const override;
346352

Core/GDCore/Project/EventsFunctionsExtension.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void EventsFunctionsExtension::Init(const gd::EventsFunctionsExtension& other) {
5555
sceneVariables = other.GetSceneVariables();
5656
}
5757

58-
void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
58+
void EventsFunctionsExtension::SerializeTo(SerializerElement& element, bool isExternal) const {
5959
element.SetAttribute("version", version);
6060
element.SetAttribute("extensionNamespace", extensionNamespace);
6161
element.SetAttribute("shortDescription", shortDescription);
@@ -102,8 +102,18 @@ void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
102102
element.AddChild("eventsFunctions"));
103103
eventsBasedBehaviors.SerializeElementsTo(
104104
"eventsBasedBehavior", element.AddChild("eventsBasedBehaviors"));
105-
eventsBasedObjects.SerializeElementsTo(
106-
"eventsBasedObject", element.AddChild("eventsBasedObjects"));
105+
if (isExternal) {
106+
auto &eventsBasedObjectElement = element.AddChild("eventsBasedObjects");
107+
eventsBasedObjectElement.ConsiderAsArrayOf("eventsBasedObject");
108+
for (const auto &eventsBasedObject :
109+
eventsBasedObjects.GetInternalVector()) {
110+
eventsBasedObject->SerializeToExternal(
111+
eventsBasedObjectElement.AddChild("eventsBasedObject"));
112+
}
113+
} else {
114+
eventsBasedObjects.SerializeElementsTo(
115+
"eventsBasedObject", element.AddChild("eventsBasedObjects"));
116+
}
107117
}
108118

109119
void EventsFunctionsExtension::UnserializeFrom(

Core/GDCore/Project/EventsFunctionsExtension.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,14 @@ class GD_CORE_API EventsFunctionsExtension {
286286
/**
287287
* \brief Serialize the EventsFunctionsExtension to the specified element
288288
*/
289-
void SerializeTo(gd::SerializerElement& element) const;
289+
void SerializeTo(gd::SerializerElement& element, bool isExternal = false) const;
290+
291+
/**
292+
* \brief Serialize the EventsFunctionsExtension to the specified element
293+
*/
294+
void SerializeToExternal(gd::SerializerElement& element) const {
295+
SerializeTo(element, true);
296+
}
290297

291298
/**
292299
* \brief Load the EventsFunctionsExtension from the specified element.

Core/GDCore/Project/Project.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,7 @@ void Project::UnserializeAndInsertExtensionsFrom(
920920
"eventsFunctionsExtension");
921921

922922
std::map<gd::String, size_t> extensionNameToElementIndex;
923+
std::map<gd::String, gd::SerializerElement> objectTypeToVariantsElement;
923924

924925
// First, only unserialize behaviors and objects names.
925926
// As event based objects can contains custom behaviors and custom objects,
@@ -938,6 +939,16 @@ void Project::UnserializeAndInsertExtensionsFrom(
938939
? GetEventsFunctionsExtension(name)
939940
: InsertNewEventsFunctionsExtension(
940941
name, GetEventsFunctionsExtensionsCount());
942+
943+
// Backup the events-based object variants
944+
for (auto &eventsBasedObject :
945+
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
946+
gd::SerializerElement variantsElement;
947+
eventsBasedObject->GetVariants().SerializeVariantsTo(variantsElement);
948+
objectTypeToVariantsElement[gd::PlatformExtension::GetObjectFullType(
949+
name, eventsBasedObject->GetName())] = variantsElement;
950+
}
951+
941952
eventsFunctionsExtension.UnserializeExtensionDeclarationFrom(
942953
*this, eventsFunctionsExtensionElement);
943954
}
@@ -966,6 +977,15 @@ void Project::UnserializeAndInsertExtensionsFrom(
966977
partiallyLoadedExtension
967978
->UnserializeExtensionImplementationFrom(
968979
*this, eventsFunctionsExtensionElement);
980+
981+
for (auto &pair : objectTypeToVariantsElement) {
982+
auto &objectType = pair.first;
983+
auto &variantsElement = pair.second;
984+
985+
auto &eventsBasedObject = GetEventsBasedObject(objectType);
986+
eventsBasedObject.GetVariants().UnserializeVariantsFrom(*this,
987+
variantsElement);
988+
}
969989
}
970990
}
971991

GDevelop.js/Bindings/Bindings.idl

+1
Original file line numberDiff line numberDiff line change
@@ -3299,6 +3299,7 @@ interface EventsFunctionsExtension {
32993299
[Ref] EventsBasedObjectsList GetEventsBasedObjects();
33003300

33013301
void SerializeTo([Ref] SerializerElement element);
3302+
void SerializeToExternal([Ref] SerializerElement element);
33023303
void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element);
33033304

33043305
boolean STATIC_IsExtensionLifecycleEventsFunction([Const] DOMString eventsFunctionName);

GDevelop.js/types.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2405,6 +2405,7 @@ export class EventsFunctionsExtension extends EmscriptenObject {
24052405
getEventsBasedBehaviors(): EventsBasedBehaviorsList;
24062406
getEventsBasedObjects(): EventsBasedObjectsList;
24072407
serializeTo(element: SerializerElement): void;
2408+
serializeToExternal(element: SerializerElement): void;
24082409
unserializeFrom(project: Project, element: SerializerElement): void;
24092410
static isExtensionLifecycleEventsFunction(eventsFunctionName: string): boolean;
24102411
}

GDevelop.js/types/gdeventsfunctionsextension.js

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ declare class gdEventsFunctionsExtension {
4040
getEventsBasedBehaviors(): gdEventsBasedBehaviorsList;
4141
getEventsBasedObjects(): gdEventsBasedObjectsList;
4242
serializeTo(element: gdSerializerElement): void;
43+
serializeToExternal(element: gdSerializerElement): void;
4344
unserializeFrom(project: gdProject, element: gdSerializerElement): void;
4445
static isExtensionLifecycleEventsFunction(eventsFunctionName: string): boolean;
4546
delete(): void;

newIDE/app/src/EventsFunctionsExtensionsLoader/Storage/BrowserEventsFunctionsExtensionWriter.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ export default class BrowserEventsFunctionsExtensionWriter {
3232
extension: gdEventsFunctionsExtension,
3333
filename: string
3434
): Promise<void> => {
35-
const serializedObject = serializeToJSObject(extension);
35+
const serializedObject = serializeToJSObject(
36+
extension,
37+
'serializeToExternal'
38+
);
3639
try {
3740
await downloadStringContentAsFile(
3841
filename,

newIDE/app/src/EventsFunctionsExtensionsLoader/Storage/LocalEventsFunctionsExtensionWriter.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ export default class LocalEventsFunctionsExtensionWriter {
5656
extension: gdEventsFunctionsExtension,
5757
filepath: string
5858
): Promise<void> => {
59-
const serializedObject = serializeToJSObject(extension);
59+
const serializedObject = serializeToJSObject(
60+
extension,
61+
'serializeToExternal'
62+
);
6063
return writeJSONFile(serializedObject, filepath).catch(err => {
6164
console.error('Unable to write the events function extension:', err);
6265
throw err;

newIDE/app/src/Utils/Serializer.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const gd: libGDevelop = global.gd;
88
* and unserializeFrom method.
99
*
1010
* @param {*} serializable
11-
* @param {*} methodName The name of the serialization method. "unserializeFrom" by default
11+
* @param {*} methodName The name of the serialization method. "serializeTo" by default
1212
*/
1313
export function serializeToJSObject(
1414
serializable: gdSerializable,

0 commit comments

Comments
 (0)