Skip to content

Commit 0b7a4e3

Browse files
cursoragent4ian
andcommitted
Add loop-local and index variable support to loop events
Co-authored-by: Florian Rival <4ian@users.noreply.github.com>
1 parent d1f823a commit 0b7a4e3

22 files changed

+1125
-14
lines changed

Core/GDCore/Events/Builtin/ForEachChildVariableEvent.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ using namespace std;
1313
namespace gd {
1414

1515
ForEachChildVariableEvent::ForEachChildVariableEvent()
16-
: BaseEvent(), valueIteratorVariableName("child"), keyIteratorVariableName(""), iterableVariableName("") {}
16+
: BaseEvent(),
17+
valueIteratorVariableName("child"),
18+
keyIteratorVariableName(""),
19+
iterableVariableName(""),
20+
variables(gd::VariablesContainer::SourceType::Local) {}
1721

1822
vector<gd::InstructionsList*> ForEachChildVariableEvent::GetAllConditionsVectors() {
1923
vector<gd::InstructionsList*> allConditions;
@@ -88,6 +92,12 @@ void ForEachChildVariableEvent::SerializeTo(SerializerElement& element) const {
8892
if (!events.IsEmpty())
8993
gd::EventsListSerialization::SerializeEventsTo(events,
9094
element.AddChild("events"));
95+
if (HasVariables()) {
96+
variables.SerializeTo(element.AddChild("variables"));
97+
}
98+
if (!indexVariableName.empty()) {
99+
element.AddChild("indexVariable").SetStringValue(indexVariableName);
100+
}
91101
}
92102

93103
void ForEachChildVariableEvent::UnserializeFrom(gd::Project& project,
@@ -105,6 +115,20 @@ void ForEachChildVariableEvent::UnserializeFrom(gd::Project& project,
105115
gd::EventsListSerialization::UnserializeEventsFrom(
106116
project, events, element.GetChild("events", 0, "Events"));
107117
}
118+
119+
variables.Clear();
120+
if (element.HasChild("variables")) {
121+
variables.UnserializeFrom(element.GetChild("variables"));
122+
}
123+
124+
indexVariableName =
125+
element.HasChild("indexVariable")
126+
? element.GetChild("indexVariable").GetStringValue()
127+
: "";
128+
if (!indexVariableName.empty() && !variables.Has(indexVariableName)) {
129+
auto& variable = variables.InsertNew(indexVariableName, variables.Count());
130+
variable.SetValue(0);
131+
}
108132
}
109133

110134
} // namespace gd

Core/GDCore/Events/Builtin/ForEachChildVariableEvent.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "GDCore/Events/Event.h"
1010
#include "GDCore/Events/EventsList.h"
1111
#include "GDCore/Events/Expression.h"
12+
#include "GDCore/Project/VariablesContainer.h"
1213
namespace gd {
1314
class Instruction;
1415
class Project;
@@ -34,6 +35,12 @@ class GD_CORE_API ForEachChildVariableEvent : public gd::BaseEvent {
3435
virtual const gd::EventsList& GetSubEvents() const { return events; };
3536
virtual gd::EventsList& GetSubEvents() { return events; };
3637

38+
virtual bool CanHaveVariables() const { return true; }
39+
virtual const gd::VariablesContainer& GetVariables() const {
40+
return variables;
41+
};
42+
virtual gd::VariablesContainer& GetVariables() { return variables; };
43+
3744
const gd::InstructionsList& GetConditions() const { return conditions; };
3845
gd::InstructionsList& GetConditions() { return conditions; };
3946

@@ -86,6 +93,9 @@ class GD_CORE_API ForEachChildVariableEvent : public gd::BaseEvent {
8693
*/
8794
void SetKeyIteratorVariableName(gd::String newName) { keyIteratorVariableName = newName; };
8895

96+
const gd::String& GetIndexVariableName() const { return indexVariableName; }
97+
void SetIndexVariableName(const gd::String& name) { indexVariableName = name; }
98+
8999
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
90100
const;
91101
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
@@ -109,6 +119,8 @@ class GD_CORE_API ForEachChildVariableEvent : public gd::BaseEvent {
109119
gd::InstructionsList conditions;
110120
gd::InstructionsList actions;
111121
gd::EventsList events;
122+
VariablesContainer variables;
123+
gd::String indexVariableName;
112124
};
113125

114126
} // namespace gd

Core/GDCore/Events/Builtin/ForEachEvent.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ using namespace std;
1414
namespace gd {
1515

1616
ForEachEvent::ForEachEvent()
17-
: BaseEvent(), objectsToPick("") {}
17+
: BaseEvent(),
18+
objectsToPick(""),
19+
variables(gd::VariablesContainer::SourceType::Local) {}
1820

1921
vector<gd::InstructionsList*> ForEachEvent::GetAllConditionsVectors() {
2022
vector<gd::InstructionsList*> allConditions;
@@ -77,6 +79,12 @@ void ForEachEvent::SerializeTo(SerializerElement& element) const {
7779
if (!events.IsEmpty())
7880
gd::EventsListSerialization::SerializeEventsTo(events,
7981
element.AddChild("events"));
82+
if (HasVariables()) {
83+
variables.SerializeTo(element.AddChild("variables"));
84+
}
85+
if (!indexVariableName.empty()) {
86+
element.AddChild("indexVariable").SetStringValue(indexVariableName);
87+
}
8088
}
8189

8290
void ForEachEvent::UnserializeFrom(gd::Project& project,
@@ -93,6 +101,20 @@ void ForEachEvent::UnserializeFrom(gd::Project& project,
93101
gd::EventsListSerialization::UnserializeEventsFrom(
94102
project, events, element.GetChild("events", 0, "Events"));
95103
}
104+
105+
variables.Clear();
106+
if (element.HasChild("variables")) {
107+
variables.UnserializeFrom(element.GetChild("variables"));
108+
}
109+
110+
indexVariableName =
111+
element.HasChild("indexVariable")
112+
? element.GetChild("indexVariable").GetStringValue()
113+
: "";
114+
if (!indexVariableName.empty() && !variables.Has(indexVariableName)) {
115+
auto& variable = variables.InsertNew(indexVariableName, variables.Count());
116+
variable.SetValue(0);
117+
}
96118
}
97119

98120
} // namespace gd

Core/GDCore/Events/Builtin/ForEachEvent.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "GDCore/Events/Event.h"
1212
#include "GDCore/Events/EventsList.h"
13+
#include "GDCore/Project/VariablesContainer.h"
1314
namespace gd {
1415
class Instruction;
1516
class Project;
@@ -36,6 +37,12 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
3637
virtual const gd::EventsList& GetSubEvents() const { return events; };
3738
virtual gd::EventsList& GetSubEvents() { return events; };
3839

40+
virtual bool CanHaveVariables() const { return true; }
41+
virtual const gd::VariablesContainer& GetVariables() const {
42+
return variables;
43+
};
44+
virtual gd::VariablesContainer& GetVariables() { return variables; };
45+
3946
const gd::InstructionsList& GetConditions() const { return conditions; };
4047
gd::InstructionsList& GetConditions() { return conditions; };
4148

@@ -49,6 +56,9 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
4956
objectsToPick = gd::Expression(objectsToPick_);
5057
};
5158

59+
const gd::String& GetIndexVariableName() const { return indexVariableName; }
60+
void SetIndexVariableName(const gd::String& name) { indexVariableName = name; }
61+
5262
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
5363
const;
5464
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
@@ -69,6 +79,8 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
6979
gd::InstructionsList conditions;
7080
gd::InstructionsList actions;
7181
gd::EventsList events;
82+
VariablesContainer variables;
83+
gd::String indexVariableName;
7284
};
7385

7486
} // namespace gd

Core/GDCore/Events/Builtin/RepeatEvent.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace gd {
1515
RepeatEvent::RepeatEvent()
1616
: BaseEvent(),
1717
repeatNumberExpression(""),
18+
variables(gd::VariablesContainer::SourceType::Local),
1819
repeatNumberExpressionSelected(false) {}
1920

2021
vector<gd::InstructionsList*> RepeatEvent::GetAllConditionsVectors() {
@@ -79,6 +80,12 @@ void RepeatEvent::SerializeTo(SerializerElement& element) const {
7980
if (!events.IsEmpty())
8081
gd::EventsListSerialization::SerializeEventsTo(events,
8182
element.AddChild("events"));
83+
if (HasVariables()) {
84+
variables.SerializeTo(element.AddChild("variables"));
85+
}
86+
if (!indexVariableName.empty()) {
87+
element.AddChild("indexVariable").SetStringValue(indexVariableName);
88+
}
8289
}
8390

8491
void RepeatEvent::UnserializeFrom(gd::Project& project,
@@ -97,6 +104,20 @@ void RepeatEvent::UnserializeFrom(gd::Project& project,
97104
gd::EventsListSerialization::UnserializeEventsFrom(
98105
project, events, element.GetChild("events", 0, "Events"));
99106
}
107+
108+
variables.Clear();
109+
if (element.HasChild("variables")) {
110+
variables.UnserializeFrom(element.GetChild("variables"));
111+
}
112+
113+
indexVariableName =
114+
element.HasChild("indexVariable")
115+
? element.GetChild("indexVariable").GetStringValue()
116+
: "";
117+
if (!indexVariableName.empty() && !variables.Has(indexVariableName)) {
118+
auto& variable = variables.InsertNew(indexVariableName, variables.Count());
119+
variable.SetValue(0);
120+
}
100121
}
101122

102123
} // namespace gd

Core/GDCore/Events/Builtin/RepeatEvent.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "GDCore/Events/Event.h"
1010
#include "GDCore/Events/EventsList.h"
11+
#include "GDCore/Project/VariablesContainer.h"
1112
namespace gd {
1213
class Instruction;
1314
class Project;
@@ -30,6 +31,12 @@ class GD_CORE_API RepeatEvent : public gd::BaseEvent {
3031
virtual const gd::EventsList& GetSubEvents() const { return events; };
3132
virtual gd::EventsList& GetSubEvents() { return events; };
3233

34+
virtual bool CanHaveVariables() const { return true; }
35+
virtual const gd::VariablesContainer& GetVariables() const {
36+
return variables;
37+
};
38+
virtual gd::VariablesContainer& GetVariables() { return variables; };
39+
3340
const gd::InstructionsList& GetConditions() const { return conditions; };
3441
gd::InstructionsList& GetConditions() { return conditions; };
3542

@@ -43,6 +50,9 @@ class GD_CORE_API RepeatEvent : public gd::BaseEvent {
4350
repeatNumberExpression = gd::Expression(repeatNumberExpression_);
4451
};
4552

53+
const gd::String& GetIndexVariableName() const { return indexVariableName; }
54+
void SetIndexVariableName(const gd::String& name) { indexVariableName = name; }
55+
4656
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
4757
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
4858
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
@@ -63,6 +73,8 @@ class GD_CORE_API RepeatEvent : public gd::BaseEvent {
6373
gd::InstructionsList conditions;
6474
gd::InstructionsList actions;
6575
EventsList events;
76+
VariablesContainer variables;
77+
gd::String indexVariableName;
6678

6779
bool repeatNumberExpressionSelected;
6880
};

Core/GDCore/Events/Builtin/WhileEvent.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ void WhileEvent::SerializeTo(SerializerElement& element) const {
5656
if (!events.IsEmpty())
5757
gd::EventsListSerialization::SerializeEventsTo(events,
5858
element.AddChild("events"));
59+
if (HasVariables()) {
60+
variables.SerializeTo(element.AddChild("variables"));
61+
}
62+
if (!indexVariableName.empty()) {
63+
element.AddChild("indexVariable").SetStringValue(indexVariableName);
64+
}
5965
}
6066

6167
void WhileEvent::UnserializeFrom(gd::Project& project,
@@ -76,6 +82,20 @@ void WhileEvent::UnserializeFrom(gd::Project& project,
7682
gd::EventsListSerialization::UnserializeEventsFrom(
7783
project, events, element.GetChild("events", 0, "Events"));
7884
}
85+
86+
variables.Clear();
87+
if (element.HasChild("variables")) {
88+
variables.UnserializeFrom(element.GetChild("variables"));
89+
}
90+
91+
indexVariableName =
92+
element.HasChild("indexVariable")
93+
? element.GetChild("indexVariable").GetStringValue()
94+
: "";
95+
if (!indexVariableName.empty() && !variables.Has(indexVariableName)) {
96+
auto& variable = variables.InsertNew(indexVariableName, variables.Count());
97+
variable.SetValue(0);
98+
}
7999
}
80100

81101
} // namespace gd

Core/GDCore/Events/Builtin/WhileEvent.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define GDCORE_WHILEEVENT_H
99
#include "GDCore/Events/Event.h"
1010
#include "GDCore/Events/EventsList.h"
11+
#include "GDCore/Project/VariablesContainer.h"
1112
namespace gd {
1213
class Instruction;
1314
class Project;
@@ -25,7 +26,10 @@ namespace gd {
2526
*/
2627
class GD_CORE_API WhileEvent : public gd::BaseEvent {
2728
public:
28-
WhileEvent() : infiniteLoopWarning(true), justCreatedByTheUser(true){};
29+
WhileEvent()
30+
: infiniteLoopWarning(true),
31+
justCreatedByTheUser(true),
32+
variables(gd::VariablesContainer::SourceType::Local){};
2933
virtual ~WhileEvent(){};
3034
virtual gd::WhileEvent* Clone() const { return new WhileEvent(*this); }
3135

@@ -35,6 +39,12 @@ class GD_CORE_API WhileEvent : public gd::BaseEvent {
3539
virtual const gd::EventsList& GetSubEvents() const { return events; };
3640
virtual gd::EventsList& GetSubEvents() { return events; };
3741

42+
virtual bool CanHaveVariables() const { return true; }
43+
virtual const gd::VariablesContainer& GetVariables() const {
44+
return variables;
45+
};
46+
virtual gd::VariablesContainer& GetVariables() { return variables; };
47+
3848
const gd::InstructionsList& GetConditions() const { return conditions; };
3949
gd::InstructionsList& GetConditions() { return conditions; };
4050

@@ -51,6 +61,9 @@ class GD_CORE_API WhileEvent : public gd::BaseEvent {
5161

5262
bool HasInfiniteLoopWarning() const { return infiniteLoopWarning; }
5363

64+
const gd::String& GetIndexVariableName() const { return indexVariableName; }
65+
void SetIndexVariableName(const gd::String& name) { indexVariableName = name; }
66+
5467
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
5568
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
5669
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
@@ -71,6 +84,8 @@ class GD_CORE_API WhileEvent : public gd::BaseEvent {
7184
bool justCreatedByTheUser; ///< Used so as not to show message box to
7285
///< de/activate infinite loop warning when the
7386
///< user create the event
87+
gd::VariablesContainer variables;
88+
gd::String indexVariableName;
7489

7590
int GetConditionsHeight() const;
7691
int GetActionsHeight() const;

0 commit comments

Comments
 (0)