Skip to content

Commit e8605ef

Browse files
committed
Rename variables in variants.
1 parent e085df7 commit e8605ef

File tree

7 files changed

+88
-28
lines changed

7 files changed

+88
-28
lines changed

Core/GDCore/IDE/GroupVariableHelper.cpp

+58-28
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "GDCore/Project/ObjectsContainersList.h"
1313
#include "GDCore/Project/Variable.h"
1414
#include "GDCore/Project/VariablesContainer.h"
15+
#include "GDCore/Project/EventsBasedObject.h"
1516
#include "GDCore/String.h"
1617

1718
namespace gd {
@@ -158,38 +159,67 @@ void GroupVariableHelper::ApplyChangesToObjects(
158159
}
159160
auto &object = hasObject ? objectsContainer.GetObject(objectName)
160161
: globalObjectsContainer.GetObject(objectName);
161-
auto &variablesContainer = object.GetVariables();
162-
for (const gd::String &variableName : changeset.removedVariableNames) {
163-
variablesContainer.Remove(variableName);
162+
gd::GroupVariableHelper::ApplyChangesToVariableContainer(
163+
groupVariablesContainer, object.GetVariables(), changeset, true);
164+
}
165+
}
166+
167+
void GroupVariableHelper::ApplyChangesToVariants(
168+
gd::EventsBasedObject &eventsBasedObject, const gd::String &objectName,
169+
const gd::VariablesChangeset &changeset) {
170+
auto &defaultVariablesContainer = eventsBasedObject.GetDefaultVariant()
171+
.GetObjects()
172+
.GetObject(objectName)
173+
.GetVariables();
174+
for (auto &variant : eventsBasedObject.GetVariants().GetInternalVector()) {
175+
if (!variant->GetObjects().HasObjectNamed(objectName)) {
176+
continue;
164177
}
165-
for (const gd::String &variableName : changeset.addedVariableNames) {
166-
if (variablesContainer.Has(variableName)) {
167-
// It can happens if an object already had the variable but it was not
168-
// shared by other object of the group.
169-
continue;
170-
}
171-
variablesContainer.Insert(variableName,
172-
groupVariablesContainer.Get(variableName),
173-
variablesContainer.Count());
178+
auto &object = variant->GetObjects().GetObject(objectName);
179+
gd::GroupVariableHelper::ApplyChangesToVariableContainer(
180+
defaultVariablesContainer, object.GetVariables(), changeset, false);
181+
}
182+
}
183+
184+
void GroupVariableHelper::ApplyChangesToVariableContainer(
185+
const gd::VariablesContainer &originalVariablesContainer,
186+
gd::VariablesContainer &destinationVariablesContainer,
187+
const gd::VariablesChangeset &changeset, bool shouldApplyValueChanges) {
188+
for (const gd::String &variableName : changeset.removedVariableNames) {
189+
destinationVariablesContainer.Remove(variableName);
190+
}
191+
for (const gd::String &variableName : changeset.addedVariableNames) {
192+
if (destinationVariablesContainer.Has(variableName)) {
193+
// It can happens if an object already had the variable but it was not
194+
// shared by other object of the group.
195+
continue;
174196
}
175-
for (const auto &pair : changeset.oldToNewVariableNames) {
176-
const gd::String &oldVariableName = pair.first;
177-
const gd::String &newVariableName = pair.second;
178-
if (variablesContainer.Has(newVariableName)) {
179-
// It can happens if an object already had the variable but it was not
180-
// shared by other object of the group.
181-
variablesContainer.Remove(oldVariableName);
182-
} else {
183-
variablesContainer.Rename(oldVariableName, newVariableName);
184-
}
197+
destinationVariablesContainer.Insert(
198+
variableName, originalVariablesContainer.Get(variableName),
199+
destinationVariablesContainer.Count());
200+
}
201+
for (const auto &pair : changeset.oldToNewVariableNames) {
202+
const gd::String &oldVariableName = pair.first;
203+
const gd::String &newVariableName = pair.second;
204+
if (destinationVariablesContainer.Has(newVariableName)) {
205+
// It can happens if an object already had the variable but it was not
206+
// shared by other object of the group.
207+
destinationVariablesContainer.Remove(oldVariableName);
208+
} else {
209+
destinationVariablesContainer.Rename(oldVariableName, newVariableName);
185210
}
186-
// Apply type and value changes
187-
for (const gd::String &variableName : changeset.valueChangedVariableNames) {
188-
size_t index = variablesContainer.GetPosition(variableName);
189-
variablesContainer.Remove(variableName);
190-
variablesContainer.Insert(
191-
variableName, groupVariablesContainer.Get(variableName), index);
211+
}
212+
// Apply type and value changes
213+
for (const gd::String &variableName : changeset.valueChangedVariableNames) {
214+
if (!shouldApplyValueChanges &&
215+
destinationVariablesContainer.Get(variableName).GetType() ==
216+
originalVariablesContainer.Get(variableName).GetType()) {
217+
continue;
192218
}
219+
size_t index = destinationVariablesContainer.GetPosition(variableName);
220+
destinationVariablesContainer.Remove(variableName);
221+
destinationVariablesContainer.Insert(
222+
variableName, originalVariablesContainer.Get(variableName), index);
193223
}
194224
}
195225

Core/GDCore/IDE/GroupVariableHelper.h

+16
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ class ObjectsContainersList;
1212
class ObjectsContainer;
1313
class ObjectGroup;
1414
class VariablesContainer;
15+
class EventsBasedObject;
1516
struct VariablesChangeset;
1617
} // namespace gd
1718

1819
namespace gd {
1920

21+
// TODO Rename this class as it's also used for variants.
2022
/**
2123
* Help handling variables of group objects as a whole.
2224
*
@@ -70,6 +72,20 @@ class GD_CORE_API GroupVariableHelper {
7072
const gd::VariablesContainer &groupVariablesContainer,
7173
const gd::ObjectGroup &objectGroup,
7274
const gd::VariablesChangeset &changeset);
75+
76+
/**
77+
* @brief Apply the changes done on events-based object child to all its
78+
* variants.
79+
*/
80+
static void ApplyChangesToVariants(gd::EventsBasedObject &eventsBasedObject,
81+
const gd::String &objectName,
82+
const gd::VariablesChangeset &changeset);
83+
84+
private:
85+
static void ApplyChangesToVariableContainer(
86+
const gd::VariablesContainer &originalVariablesContainer,
87+
gd::VariablesContainer &destinationVariablesContainer,
88+
const gd::VariablesChangeset &changeset, bool shouldApplyValueChanges);
7389
};
7490

7591
} // namespace gd

GDevelop.js/Bindings/Bindings.idl

+4
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,10 @@ interface GroupVariableHelper {
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
@@ -723,6 +723,7 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
723723
ComputeChangesetForVariablesContainer
724724
#define STATIC_MergeVariableContainers MergeVariableContainers
725725
#define STATIC_FillAnyVariableBetweenObjects FillAnyVariableBetweenObjects
726+
#define STATIC_ApplyChangesToVariants ApplyChangesToVariants
726727
#define STATIC_RenameEventsFunctionsExtension RenameEventsFunctionsExtension
727728
#define STATIC_UpdateExtensionNameInEventsBasedBehavior \
728729
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 GroupVariableHelper 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/gdgroupvariablehelper.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
declare class gdGroupVariableHelper {
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
@@ -159,6 +159,13 @@ const InnerDialog = (props: InnerDialogProps) => {
159159
changeset,
160160
originalSerializedVariables
161161
);
162+
if (eventsBasedObject) {
163+
gd.GroupVariableHelper.applyChangesToVariants(
164+
eventsBasedObject,
165+
object.getName(),
166+
changeset
167+
);
168+
}
162169
object.clearPersistentUuid();
163170

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

0 commit comments

Comments
 (0)