Skip to content

Commit c5259b6

Browse files
authored
Fix embedded resource links when importing a GDO (#8419)
1 parent 50afd05 commit c5259b6

File tree

9 files changed

+45
-21
lines changed

9 files changed

+45
-21
lines changed

Core/GDCore/IDE/ObjectAssetSerializer.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,7 @@ void ObjectAssetSerializer::SerializeTo(
112112
usedResourceNames.push_back(resourceName);
113113
auto &resource = resourcesManager.GetResource(resourceName);
114114
SerializerElement &resourceElement = resourcesElement.AddChild("resource");
115-
resource.SerializeTo(resourceElement);
116-
resourceElement.SetAttribute("kind", resource.GetKind());
117-
resourceElement.SetAttribute("name", resource.GetName());
115+
gd::ResourcesContainer::SerializeResourceTo(resource, resourceElement);
118116
}
119117

120118
SerializerElement &requiredExtensionsElement =

Core/GDCore/Project/ResourcesContainer.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -369,28 +369,32 @@ void ResourcesContainer::UnserializeFrom(const SerializerElement &element) {
369369
resourcesElement.ConsiderAsArrayOf("resource", "Resource");
370370
for (std::size_t i = 0; i < resourcesElement.GetChildrenCount(); ++i) {
371371
const SerializerElement &resourceElement = resourcesElement.GetChild(i);
372-
gd::String kind = resourceElement.GetStringAttribute("kind");
373-
gd::String name = resourceElement.GetStringAttribute("name");
374-
gd::String metadata = resourceElement.GetStringAttribute("metadata", "");
375372

373+
gd::String kind = resourceElement.GetStringAttribute("kind");
376374
std::shared_ptr<Resource> resource = CreateResource(kind);
377-
resource->SetName(name);
378-
resource->SetMetadata(metadata);
379-
380-
if (resourceElement.HasChild("origin")) {
381-
gd::String originName =
382-
resourceElement.GetChild("origin").GetStringAttribute("name", "");
383-
gd::String originIdentifier =
384-
resourceElement.GetChild("origin").GetStringAttribute("identifier",
385-
"");
386-
resource->SetOrigin(originName, originIdentifier);
387-
}
388-
resource->UnserializeFrom(resourceElement);
389-
375+
UnserializeResourceFrom(*resource, resourceElement);
390376
resources.push_back(resource);
391377
}
392378
}
393379

380+
void ResourcesContainer::UnserializeResourceFrom(
381+
gd::Resource &resource, const SerializerElement &resourceElement) {
382+
gd::String name = resourceElement.GetStringAttribute("name");
383+
gd::String metadata = resourceElement.GetStringAttribute("metadata", "");
384+
385+
resource.SetName(name);
386+
resource.SetMetadata(metadata);
387+
388+
if (resourceElement.HasChild("origin")) {
389+
gd::String originName =
390+
resourceElement.GetChild("origin").GetStringAttribute("name", "");
391+
gd::String originIdentifier =
392+
resourceElement.GetChild("origin").GetStringAttribute("identifier", "");
393+
resource.SetOrigin(originName, originIdentifier);
394+
}
395+
resource.UnserializeFrom(resourceElement);
396+
}
397+
394398
void ResourcesContainer::SerializeTo(SerializerElement &element) const {
395399
SerializerElement &resourcesElement = element.AddChild("resources");
396400
resourcesElement.ConsiderAsArrayOf("resource");

Core/GDCore/Project/ResourcesContainer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,12 @@ class GD_CORE_API ResourcesContainer {
778778
*/
779779
void UnserializeFrom(const SerializerElement &element);
780780

781+
/**
782+
* \brief Unserialize one resource.
783+
*/
784+
static void UnserializeResourceFrom(gd::Resource &resource,
785+
const SerializerElement &resourceElement);
786+
781787
private:
782788
void Init(const ResourcesContainer &other);
783789

GDevelop.js/Bindings/Bindings.idl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,10 @@ interface ResourcesContainer {
13531353
boolean MoveResourceUpInList([Const] DOMString oldName);
13541354
boolean MoveResourceDownInList([Const] DOMString oldName);
13551355
void MoveResource(unsigned long oldIndex, unsigned long newIndex);
1356+
1357+
void STATIC_UnserializeResourceFrom(
1358+
[Ref] Resource resource,
1359+
[Const, Ref] SerializerElement resourceElement);
13561360
};
13571361

13581362
interface ResourcesContainersList {

GDevelop.js/Bindings/Wrapper.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,7 @@ typedef std::vector<gd::PropertyDescriptorChoice> VectorPropertyDescriptorChoice
873873

874874
#define STATIC_CopyAllResourcesTo CopyAllResourcesTo
875875
#define STATIC_CopyObjectResourcesTo CopyObjectResourcesTo
876+
#define STATIC_UnserializeResourceFrom UnserializeResourceFrom
876877

877878
#define STATIC_IsExtensionLifecycleEventsFunction \
878879
IsExtensionLifecycleEventsFunction

GDevelop.js/types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,7 @@ export class ResourcesContainer extends EmscriptenObject {
11421142
moveResourceUpInList(oldName: string): boolean;
11431143
moveResourceDownInList(oldName: string): boolean;
11441144
moveResource(oldIndex: number, newIndex: number): void;
1145+
static unserializeResourceFrom(resource: Resource, resourceElement: SerializerElement): void;
11451146
}
11461147

11471148
export class ResourcesContainersList extends EmscriptenObject {

GDevelop.js/types/gdresourcescontainer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ declare class gdResourcesContainer {
2121
moveResourceUpInList(oldName: string): boolean;
2222
moveResourceDownInList(oldName: string): boolean;
2323
moveResource(oldIndex: number, newIndex: number): void;
24+
static unserializeResourceFrom(resource: gdResource, resourceElement: gdSerializerElement): void;
2425
delete(): void;
2526
ptr: number;
2627
};

newIDE/app/src/ObjectEditor/ObjectImporterDialog.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import newNameGenerator from '../Utils/NewNameGenerator';
2525
import LoaderModal from '../UI/LoaderModal';
2626
import AlertMessage from '../UI/AlertMessage';
2727
import { getOrCreate } from '../Utils/Map';
28+
import { unserializeResourceFromJSObject } from '../Utils/Serializer';
2829

2930
const gd: libGDevelop = global.gd;
3031

@@ -696,8 +697,7 @@ const ObjectImporterDialog = ({
696697
}
697698
// The resource does not exist yet, add it. Note that the "origin" will be preserved.
698699
const newResource = resourceKindMetadata.createNewResource();
699-
unserializeFromJSObject(newResource, serializedResource);
700-
newResource.setName(serializedResource.name);
700+
unserializeResourceFromJSObject(newResource, serializedResource);
701701

702702
const resourceBlob: Blob = await getFileBlob({
703703
archiveBlob: assetPackBlob,

newIDE/app/src/Utils/Serializer.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,12 @@ export function unserializeFromJSObject(
134134
}
135135
serializedElement.delete();
136136
}
137+
138+
export function unserializeResourceFromJSObject(
139+
resource: gdResource,
140+
object: Object
141+
) {
142+
const serializedElement = gd.Serializer.fromJSObject(object);
143+
gd.ResourcesContainer.unserializeResourceFrom(resource, serializedElement);
144+
serializedElement.delete();
145+
}

0 commit comments

Comments
 (0)