Skip to content

Commit 4fd82bb

Browse files
committed
Rename variables in variants.
1 parent 2c347d5 commit 4fd82bb

File tree

7 files changed

+81
-6
lines changed

7 files changed

+81
-6
lines changed

Core/GDCore/IDE/ObjectVariableHelper.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "ObjectVariableHelper.h"
77

88
#include "GDCore/IDE/WholeProjectRefactorer.h"
9+
#include "GDCore/Project/EventsBasedObject.h"
910
#include "GDCore/Project/InitialInstancesContainer.h"
1011
#include "GDCore/Project/Object.h"
1112
#include "GDCore/Project/ObjectGroup.h"
@@ -238,4 +239,58 @@ void ObjectVariableHelper::ApplyChangesToObjectInstances(
238239
}
239240
});
240241
}
242+
243+
void ObjectVariableHelper::ApplyChangesToVariants(
244+
gd::EventsBasedObject &eventsBasedObject, const gd::String &objectName,
245+
const gd::VariablesChangeset &changeset) {
246+
auto &defaultVariablesContainer = eventsBasedObject.GetDefaultVariant()
247+
.GetObjects()
248+
.GetObject(objectName)
249+
.GetVariables();
250+
for (auto &variant : eventsBasedObject.GetVariants().GetInternalVector()) {
251+
if (!variant->GetObjects().HasObjectNamed(objectName)) {
252+
continue;
253+
}
254+
auto &object = variant->GetObjects().GetObject(objectName);
255+
auto &variablesContainer = object.GetVariables();
256+
257+
for (const gd::String &variableName : changeset.removedVariableNames) {
258+
variablesContainer.Remove(variableName);
259+
}
260+
for (const gd::String &variableName : changeset.addedVariableNames) {
261+
if (variablesContainer.Has(variableName)) {
262+
// It can happens if a child-object already had the variable but it was
263+
// missing in other variant child-object.
264+
continue;
265+
}
266+
variablesContainer.Insert(variableName,
267+
defaultVariablesContainer.Get(variableName),
268+
variablesContainer.Count());
269+
}
270+
for (const auto &pair : changeset.oldToNewVariableNames) {
271+
const gd::String &oldVariableName = pair.first;
272+
const gd::String &newVariableName = pair.second;
273+
if (variablesContainer.Has(newVariableName)) {
274+
// It can happens if a child-object already had the variable but it was
275+
// missing in other variant child-object.
276+
variablesContainer.Remove(oldVariableName);
277+
} else {
278+
variablesContainer.Rename(oldVariableName, newVariableName);
279+
}
280+
}
281+
// Apply type changes
282+
for (const gd::String &variableName : changeset.valueChangedVariableNames) {
283+
size_t index = variablesContainer.GetPosition(variableName);
284+
285+
if (variablesContainer.Has(variableName) &&
286+
variablesContainer.Get(variableName).GetType() !=
287+
defaultVariablesContainer.Get(variableName).GetType()) {
288+
variablesContainer.Remove(variableName);
289+
variablesContainer.Insert(
290+
variableName, defaultVariablesContainer.Get(variableName), index);
291+
}
292+
}
293+
}
294+
}
295+
241296
} // namespace gd

Core/GDCore/IDE/ObjectVariableHelper.h

+12-6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "GDCore/Project/VariablesContainer.h"
99

1010
namespace gd {
11+
class EventsBasedObject;
1112
class InitialInstancesContainer;
1213
class ObjectsContainersList;
1314
class ObjectsContainer;
@@ -53,7 +54,7 @@ class GD_CORE_API ObjectVariableHelper {
5354
* Objects can be added during the group edition and may not necessarily have
5455
* all the variables initially shared by the group.
5556
*
56-
* \see gd::GroupVariableHelper::MergeVariableContainers
57+
* \see gd::ObjectVariableHelper::MergeVariableContainers
5758
*/
5859
static void FillMissingGroupVariablesToObjects(
5960
gd::ObjectsContainer &globalObjectsContainer,
@@ -72,16 +73,21 @@ class GD_CORE_API ObjectVariableHelper {
7273
const gd::ObjectGroup &objectGroup,
7374
const gd::VariablesChangeset &changeset);
7475

76+
/**
77+
* @brief Apply the changes done on an object to all its instances.
78+
*/
7579
static void ApplyChangesToObjectInstances(
7680
gd::VariablesContainer &objectVariablesContainer,
7781
gd::InitialInstancesContainer &initialInstancesContainer,
7882
const gd::String &objectName, const gd::VariablesChangeset &changeset);
7983

80-
private:
81-
static void ApplyChangesToVariableContainer(
82-
const gd::VariablesContainer &originalVariablesContainer,
83-
gd::VariablesContainer &destinationVariablesContainer,
84-
const gd::VariablesChangeset &changeset, bool shouldApplyValueChanges);
84+
/**
85+
* @brief Apply the changes done on events-based object child to all its
86+
* variants.
87+
*/
88+
static void ApplyChangesToVariants(gd::EventsBasedObject &eventsBasedObject,
89+
const gd::String &objectName,
90+
const gd::VariablesChangeset &changeset);
8591
};
8692

8793
} // namespace gd

GDevelop.js/Bindings/Bindings.idl

+4
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,10 @@ interface ObjectVariableHelper {
372372
[Ref] ObjectsContainer globalObjectsContainer,
373373
[Ref] ObjectsContainer objectsContainer,
374374
[Const, Ref] ObjectGroup objectGroup);
375+
void STATIC_ApplyChangesToVariants(
376+
[Ref] EventsBasedObject eventsBasedObject,
377+
[Const] DOMString objectName,
378+
[Const, Ref] VariablesChangeset changeset);
375379
};
376380

377381
interface ObjectGroupsContainer {

GDevelop.js/Bindings/Wrapper.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,7 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
725725
ComputeChangesetForVariablesContainer
726726
#define STATIC_MergeVariableContainers MergeVariableContainers
727727
#define STATIC_FillAnyVariableBetweenObjects FillAnyVariableBetweenObjects
728+
#define STATIC_ApplyChangesToVariants ApplyChangesToVariants
728729
#define STATIC_RenameEventsFunctionsExtension RenameEventsFunctionsExtension
729730
#define STATIC_UpdateExtensionNameInEventsBasedBehavior \
730731
UpdateExtensionNameInEventsBasedBehavior

GDevelop.js/types.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ export class ObjectGroup extends EmscriptenObject {
384384
export class ObjectVariableHelper extends EmscriptenObject {
385385
static mergeVariableContainers(objectsContainersList: ObjectsContainersList, objectGroup: ObjectGroup): VariablesContainer;
386386
static fillAnyVariableBetweenObjects(globalObjectsContainer: ObjectsContainer, objectsContainer: ObjectsContainer, objectGroup: ObjectGroup): void;
387+
static applyChangesToVariants(eventsBasedObject: EventsBasedObject, objectName: string, changeset: VariablesChangeset): void;
387388
}
388389

389390
export class ObjectGroupsContainer extends EmscriptenObject {

GDevelop.js/types/gdobjectvariablehelper.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
declare class gdObjectVariableHelper {
33
static mergeVariableContainers(objectsContainersList: gdObjectsContainersList, objectGroup: gdObjectGroup): gdVariablesContainer;
44
static fillAnyVariableBetweenObjects(globalObjectsContainer: gdObjectsContainer, objectsContainer: gdObjectsContainer, objectGroup: gdObjectGroup): void;
5+
static applyChangesToVariants(eventsBasedObject: gdEventsBasedObject, objectName: string, changeset: gdVariablesChangeset): void;
56
delete(): void;
67
ptr: number;
78
};

newIDE/app/src/ObjectEditor/ObjectEditorDialog.js

+7
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ const InnerDialog = (props: InnerDialogProps) => {
162162
changeset,
163163
originalSerializedVariables
164164
);
165+
if (eventsBasedObject) {
166+
gd.ObjectVariableHelper.applyChangesToVariants(
167+
eventsBasedObject,
168+
object.getName(),
169+
changeset
170+
);
171+
}
165172
object.clearPersistentUuid();
166173

167174
// Do the renaming *after* applying changes, as "withSerializableObject"

0 commit comments

Comments
 (0)