|
6 | 6 | #include "ObjectVariableHelper.h"
|
7 | 7 |
|
8 | 8 | #include "GDCore/IDE/WholeProjectRefactorer.h"
|
| 9 | +#include "GDCore/Project/EventsBasedObject.h" |
9 | 10 | #include "GDCore/Project/InitialInstancesContainer.h"
|
10 | 11 | #include "GDCore/Project/Object.h"
|
11 | 12 | #include "GDCore/Project/ObjectGroup.h"
|
@@ -238,4 +239,58 @@ void ObjectVariableHelper::ApplyChangesToObjectInstances(
|
238 | 239 | }
|
239 | 240 | });
|
240 | 241 | }
|
| 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 | + |
241 | 296 | } // namespace gd
|
0 commit comments