mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Compare commits
7 Commits
v5.5.226
...
function-s
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1e8debf722 | ||
![]() |
b66c2d5d6d | ||
![]() |
aedd6981a0 | ||
![]() |
862b2d637f | ||
![]() |
7405fb75d0 | ||
![]() |
5a9c35657a | ||
![]() |
64ad0931c4 |
@@ -1358,30 +1358,12 @@ gd::String EventsCodeGenerator::GeneratePropertyGetter(const gd::PropertiesConta
|
||||
return "getProperty" + property.GetName() + "As" + type + "()";
|
||||
}
|
||||
|
||||
gd::String EventsCodeGenerator::GeneratePropertyGetterWithoutCasting(
|
||||
const gd::PropertiesContainer &propertiesContainer,
|
||||
const gd::NamedPropertyDescriptor &property) {
|
||||
return "getProperty" + property.GetName() + "()";
|
||||
}
|
||||
|
||||
gd::String EventsCodeGenerator::GeneratePropertySetterWithoutCasting(
|
||||
const gd::PropertiesContainer &propertiesContainer,
|
||||
const gd::NamedPropertyDescriptor &property,
|
||||
const gd::String &operandCode) {
|
||||
return "setProperty" + property.GetName() + "(" + operandCode + ")";
|
||||
}
|
||||
|
||||
gd::String EventsCodeGenerator::GenerateParameterGetter(const gd::ParameterMetadata& parameter,
|
||||
const gd::String& type,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
return "getParameter" + parameter.GetName() + "As" + type + "()";
|
||||
}
|
||||
|
||||
gd::String EventsCodeGenerator::GenerateParameterGetterWithoutCasting(
|
||||
const gd::ParameterMetadata ¶meter) {
|
||||
return "getParameter" + parameter.GetName() + "()";
|
||||
}
|
||||
|
||||
EventsCodeGenerator::EventsCodeGenerator(const gd::Project& project_,
|
||||
const gd::Layout& layout,
|
||||
const gd::Platform& platform_)
|
||||
|
@@ -467,14 +467,7 @@ class GD_CORE_API EventsCodeGenerator {
|
||||
*/
|
||||
virtual gd::String GetCodeNamespace() { return ""; };
|
||||
|
||||
enum VariableScope {
|
||||
LAYOUT_VARIABLE = 0,
|
||||
PROJECT_VARIABLE,
|
||||
OBJECT_VARIABLE,
|
||||
ANY_VARIABLE,
|
||||
VARIABLE_OR_PROPERTY,
|
||||
VARIABLE_OR_PROPERTY_OR_PARAMETER
|
||||
};
|
||||
enum VariableScope { LAYOUT_VARIABLE = 0, PROJECT_VARIABLE, OBJECT_VARIABLE, ANY_VARIABLE };
|
||||
|
||||
/**
|
||||
* Generate a single unique number for the specified instruction.
|
||||
@@ -517,11 +510,6 @@ class GD_CORE_API EventsCodeGenerator {
|
||||
GenerateAnyOrSceneVariableGetter(const gd::Expression &variableExpression,
|
||||
EventsCodeGenerationContext &context);
|
||||
|
||||
virtual gd::String GeneratePropertySetterWithoutCasting(
|
||||
const gd::PropertiesContainer &propertiesContainer,
|
||||
const gd::NamedPropertyDescriptor &property,
|
||||
const gd::String &operandCode);
|
||||
|
||||
protected:
|
||||
virtual const gd::String GenerateRelationalOperatorCodes(
|
||||
const gd::String& operatorString);
|
||||
@@ -577,8 +565,7 @@ protected:
|
||||
const gd::String& variableName,
|
||||
const VariableScope& scope,
|
||||
gd::EventsCodeGenerationContext& context,
|
||||
const gd::String& objectName,
|
||||
bool hasChild) {
|
||||
const gd::String& objectName) {
|
||||
// This code is only used as a mock.
|
||||
// See the real implementation in GDJS.
|
||||
if (scope == LAYOUT_VARIABLE) {
|
||||
@@ -586,9 +573,7 @@ protected:
|
||||
|
||||
} else if (scope == PROJECT_VARIABLE) {
|
||||
return "getProjectVariable(" + variableName + ")";
|
||||
} else if (scope == ANY_VARIABLE || scope == VARIABLE_OR_PROPERTY ||
|
||||
scope == VARIABLE_OR_PROPERTY_OR_PARAMETER) {
|
||||
// TODO Split the 3 cases to make tests stronger.
|
||||
} else if (scope == ANY_VARIABLE) {
|
||||
return "getAnyVariable(" + variableName + ")";
|
||||
}
|
||||
|
||||
@@ -642,18 +627,11 @@ protected:
|
||||
const gd::String& type,
|
||||
gd::EventsCodeGenerationContext& context);
|
||||
|
||||
virtual gd::String GeneratePropertyGetterWithoutCasting(
|
||||
const gd::PropertiesContainer &propertiesContainer,
|
||||
const gd::NamedPropertyDescriptor &property);
|
||||
|
||||
virtual gd::String GenerateParameterGetter(
|
||||
const gd::ParameterMetadata& parameter,
|
||||
const gd::String& type,
|
||||
gd::EventsCodeGenerationContext& context);
|
||||
|
||||
virtual gd::String
|
||||
GenerateParameterGetterWithoutCasting(const gd::ParameterMetadata ¶meter);
|
||||
|
||||
/**
|
||||
* \brief Generate the code to reference an object which is
|
||||
* in an empty/null state.
|
||||
|
@@ -135,20 +135,18 @@ void ExpressionCodeGenerator::OnVisitVariableNode(VariableNode& node) {
|
||||
EventsCodeGenerator::VariableScope scope =
|
||||
type == "variable"
|
||||
? gd::EventsCodeGenerator::ANY_VARIABLE
|
||||
: type == "variableOrProperty"
|
||||
? gd::EventsCodeGenerator::VARIABLE_OR_PROPERTY
|
||||
: type == "variableOrPropertyOrParameter"
|
||||
? gd::EventsCodeGenerator::VARIABLE_OR_PROPERTY_OR_PARAMETER
|
||||
: type == "globalvar" ? gd::EventsCodeGenerator::PROJECT_VARIABLE
|
||||
: type == "scenevar" ? gd::EventsCodeGenerator::LAYOUT_VARIABLE
|
||||
: gd::EventsCodeGenerator::OBJECT_VARIABLE;
|
||||
: type == "globalvar"
|
||||
? gd::EventsCodeGenerator::PROJECT_VARIABLE
|
||||
: type == "scenevar"
|
||||
? gd::EventsCodeGenerator::LAYOUT_VARIABLE
|
||||
: gd::EventsCodeGenerator::OBJECT_VARIABLE;
|
||||
|
||||
auto objectName = gd::ExpressionVariableOwnerFinder::GetObjectName(codeGenerator.GetPlatform(),
|
||||
codeGenerator.GetObjectsContainersList(),
|
||||
rootObjectName,
|
||||
node);
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.name, scope, context, objectName, node.child != nullptr);
|
||||
node.name, scope, context, objectName);
|
||||
if (node.child) node.child->Visit(*this);
|
||||
} else {
|
||||
// The node represents a variable or an object variable in an expression waiting for its *value* to be returned.
|
||||
@@ -165,7 +163,7 @@ void ExpressionCodeGenerator::OnVisitVariableNode(VariableNode& node) {
|
||||
output += codeGenerator.GenerateVariableValueAs(type);
|
||||
}, [&]() {
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.name, gd::EventsCodeGenerator::ANY_VARIABLE, context, "", node.child != nullptr);
|
||||
node.name, gd::EventsCodeGenerator::ANY_VARIABLE, context, "");
|
||||
if (node.child) node.child->Visit(*this);
|
||||
output += codeGenerator.GenerateVariableValueAs(type);
|
||||
}, [&]() {
|
||||
@@ -186,9 +184,8 @@ void ExpressionCodeGenerator::OnVisitVariableAccessorNode(
|
||||
VariableAccessorNode& node) {
|
||||
if (!objectNameToUseForVariableAccessor.empty()) {
|
||||
// Use the name of the object passed by the parent, as we need both to access an object variable.
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.name, gd::EventsCodeGenerator::OBJECT_VARIABLE, context,
|
||||
objectNameToUseForVariableAccessor, node.child != nullptr);
|
||||
output += codeGenerator.GenerateGetVariable(node.name,
|
||||
gd::EventsCodeGenerator::OBJECT_VARIABLE, context, objectNameToUseForVariableAccessor);
|
||||
|
||||
// We have accessed an object variable, from now we can continue accessing the child variables
|
||||
// (including using the bracket notation).
|
||||
@@ -225,27 +222,24 @@ void ExpressionCodeGenerator::OnVisitIdentifierNode(IdentifierNode& node) {
|
||||
output +=
|
||||
codeGenerator.GenerateObject(node.identifierName, type, context);
|
||||
} else if (gd::ParameterMetadata::IsExpression("variable", type)) {
|
||||
EventsCodeGenerator::VariableScope scope =
|
||||
EventsCodeGenerator::VariableScope scope =
|
||||
type == "variable"
|
||||
? gd::EventsCodeGenerator::ANY_VARIABLE
|
||||
: type == "variableOrProperty"
|
||||
? gd::EventsCodeGenerator::VARIABLE_OR_PROPERTY
|
||||
: type == "variableOrPropertyOrParameter"
|
||||
? gd::EventsCodeGenerator::VARIABLE_OR_PROPERTY_OR_PARAMETER
|
||||
: type == "globalvar" ? gd::EventsCodeGenerator::PROJECT_VARIABLE
|
||||
: type == "scenevar" ? gd::EventsCodeGenerator::LAYOUT_VARIABLE
|
||||
: gd::EventsCodeGenerator::OBJECT_VARIABLE;
|
||||
: type == "globalvar"
|
||||
? gd::EventsCodeGenerator::PROJECT_VARIABLE
|
||||
: type == "scenevar"
|
||||
? gd::EventsCodeGenerator::LAYOUT_VARIABLE
|
||||
: gd::EventsCodeGenerator::OBJECT_VARIABLE;
|
||||
|
||||
auto objectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
codeGenerator.GetPlatform(), codeGenerator.GetObjectsContainersList(),
|
||||
rootObjectName, node);
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.identifierName, scope, context, objectName,
|
||||
!node.childIdentifierName.empty());
|
||||
if (!node.childIdentifierName.empty()) {
|
||||
output +=
|
||||
codeGenerator.GenerateVariableAccessor(node.childIdentifierName);
|
||||
}
|
||||
auto objectName = gd::ExpressionVariableOwnerFinder::GetObjectName(codeGenerator.GetPlatform(),
|
||||
codeGenerator.GetObjectsContainersList(),
|
||||
rootObjectName,
|
||||
node);
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.identifierName, scope, context, objectName);
|
||||
if (!node.childIdentifierName.empty()) {
|
||||
output += codeGenerator.GenerateVariableAccessor(node.childIdentifierName);
|
||||
}
|
||||
} else {
|
||||
const auto& variablesContainersList = codeGenerator.GetProjectScopedContainers().GetVariablesContainersList();
|
||||
const auto& propertiesContainersList = codeGenerator.GetProjectScopedContainers().GetPropertiesContainersList();
|
||||
@@ -255,13 +249,12 @@ void ExpressionCodeGenerator::OnVisitIdentifierNode(IdentifierNode& node) {
|
||||
codeGenerator.GetProjectScopedContainers().MatchIdentifierWithName<void>(node.identifierName, [&]() {
|
||||
// Generate the code to access the object variable.
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.childIdentifierName, gd::EventsCodeGenerator::OBJECT_VARIABLE,
|
||||
context, node.identifierName, !node.childIdentifierName.empty());
|
||||
node.childIdentifierName, gd::EventsCodeGenerator::OBJECT_VARIABLE, context, node.identifierName);
|
||||
output += codeGenerator.GenerateVariableValueAs(type);
|
||||
}, [&]() {
|
||||
output += codeGenerator.GenerateGetVariable(
|
||||
node.identifierName, gd::EventsCodeGenerator::VARIABLE_OR_PROPERTY_OR_PARAMETER, context,
|
||||
"", !node.childIdentifierName.empty());
|
||||
node.identifierName, gd::EventsCodeGenerator::ANY_VARIABLE, context,
|
||||
"");
|
||||
if (!node.childIdentifierName.empty()) {
|
||||
output += codeGenerator.GenerateVariableAccessor(node.childIdentifierName);
|
||||
}
|
||||
|
@@ -141,8 +141,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function32.png")
|
||||
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.MarkAsAdvanced()
|
||||
.SetHidden();
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
@@ -178,8 +177,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", gd::ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
@@ -193,8 +191,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", gd::ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -117,7 +117,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Change the position of the center of _PARAM0_: _PARAM1_ "
|
||||
"_PARAM2_ (x "
|
||||
"axis), _PARAM3_ _PARAM4_ (y axis)"),
|
||||
_("Position ❯ Center"),
|
||||
_("Position/Center"),
|
||||
"res/actions/position24_black.png",
|
||||
"res/actions/position_black.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
@@ -133,7 +133,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Center X position"),
|
||||
_("the X position of the center of rotation"),
|
||||
_("the X position of the center"),
|
||||
_("Position ❯ Center"),
|
||||
_("Position/Center"),
|
||||
"res/actions/position24_black.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -144,7 +144,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Center Y position"),
|
||||
_("the Y position of the center of rotation"),
|
||||
_("the Y position of the center"),
|
||||
_("Position ❯ Center"),
|
||||
_("Position/Center"),
|
||||
"res/actions/position24_black.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -155,7 +155,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("the bounding box (the area encapsulating "
|
||||
"the object) left position"),
|
||||
_("the bounding box left position"),
|
||||
_("Position ❯ Bounding Box"),
|
||||
_("Position/Bounding Box"),
|
||||
"res/conditions/bounding-box-left_black.svg")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -166,7 +166,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Bounding box top position"),
|
||||
_("the bounding box (the area encapsulating the object) top position"),
|
||||
_("the bounding box top position"),
|
||||
_("Position ❯ Bounding Box"),
|
||||
_("Position/Bounding Box"),
|
||||
"res/conditions/bounding-box-top_black.svg")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -177,7 +177,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("the bounding box (the area encapsulating "
|
||||
"the object) right position"),
|
||||
_("the bounding box right position"),
|
||||
_("Position ❯ Bounding Box"),
|
||||
_("Position/Bounding Box"),
|
||||
"res/conditions/bounding-box-right_black.svg")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -188,7 +188,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("the bounding box (the area encapsulating "
|
||||
"the object) bottom position"),
|
||||
_("the bounding box bottom position"),
|
||||
_("Position ❯ Bounding Box"),
|
||||
_("Position/Bounding Box"),
|
||||
"res/conditions/bounding-box-bottom_black.svg")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -199,7 +199,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("the bounding box (the area encapsulating "
|
||||
"the object) center X position"),
|
||||
_("the bounding box center X position"),
|
||||
_("Position ❯ Bounding Box"),
|
||||
_("Position/Bounding Box"),
|
||||
"res/conditions/bounding-box-center_black.svg")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -210,7 +210,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("the bounding box (the area encapsulating "
|
||||
"the object) center Y position"),
|
||||
_("the bounding box center Y position"),
|
||||
_("Position ❯ Bounding Box"),
|
||||
_("Position/Bounding Box"),
|
||||
"res/conditions/bounding-box-center_black.svg")
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
|
||||
@@ -255,6 +255,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Angle"),
|
||||
"res/actions/rotate24_black.png",
|
||||
"res/actions/rotate_black.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("Angular speed (in degrees per second)"))
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
@@ -268,6 +269,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Angle"),
|
||||
"res/actions/rotate24_black.png",
|
||||
"res/actions/rotate_black.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("Angle to rotate towards (in degrees)"))
|
||||
.AddParameter("expression", _("Angular speed (in degrees per second)"))
|
||||
@@ -283,6 +285,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Angle"),
|
||||
"res/actions/rotate24_black.png",
|
||||
"res/actions/rotate_black.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("X position"))
|
||||
.AddParameter("expression", _("Y position"))
|
||||
@@ -301,12 +304,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/force24.png",
|
||||
"res/actions/force.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("Speed on X axis (in pixels per second)"))
|
||||
.AddParameter("expression", _("Speed on Y axis (in pixels per second)"))
|
||||
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
|
||||
.SetDefaultValue("0")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/");
|
||||
.SetDefaultValue("0");
|
||||
|
||||
obj.AddAction("AddForceAL",
|
||||
_("Add a force (angle)"),
|
||||
@@ -318,12 +321,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/force24.png",
|
||||
"res/actions/force.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("Angle"))
|
||||
.AddParameter("expression", _("Speed (in pixels per second)"))
|
||||
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
|
||||
.SetDefaultValue("0")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
@@ -336,13 +339,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/force24.png",
|
||||
"res/actions/force.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("X position"))
|
||||
.AddParameter("expression", _("Y position"))
|
||||
.AddParameter("expression", _("Speed (in pixels per second)"))
|
||||
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
|
||||
.SetDefaultValue("0")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
@@ -357,13 +360,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/forceTourne24.png",
|
||||
"res/actions/forceTourne.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", "X position of the center")
|
||||
.AddParameter("expression", "Y position of the center")
|
||||
.AddParameter("expression", "Speed (in Degrees per seconds)")
|
||||
.AddParameter("expression", "Distance (in pixels)")
|
||||
.AddParameter("forceMultiplier", "Force multiplier")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.SetHidden();
|
||||
|
||||
obj.AddAction("Arreter",
|
||||
@@ -373,8 +376,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/arreter24.png",
|
||||
"res/actions/arreter.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("Delete",
|
||||
@@ -426,7 +429,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardOperatorParameters("number",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
obj.AddAction("SetStringObjectVariable",
|
||||
@@ -441,7 +443,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardOperatorParameters("string",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
obj.AddAction("SetBooleanObjectVariable",
|
||||
@@ -457,7 +458,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
// This parameter allows to keep the operand expression
|
||||
// when the editor switch between variable instructions.
|
||||
.AddCodeOnlyParameter("yesorno", _("Value"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
obj.AddCondition("NumberObjectVariable",
|
||||
@@ -472,7 +472,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
obj.AddCondition("StringObjectVariable",
|
||||
@@ -487,7 +486,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
obj.AddCondition("BooleanObjectVariable",
|
||||
@@ -504,7 +502,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
// This parameter allows to keep the operand expression
|
||||
// when the editor switch between variable instructions.
|
||||
.AddCodeOnlyParameter("yesorno", _("Value"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
obj.AddAction("ModVarObjet",
|
||||
@@ -517,7 +514,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.UseStandardOperatorParameters("number",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
@@ -532,7 +528,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.UseStandardOperatorParameters("string",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
@@ -549,7 +544,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("New Value:"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
obj.AddAction(
|
||||
@@ -566,7 +560,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
obj.AddCondition("ObjectVariableChildExists",
|
||||
@@ -574,26 +567,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Check if the specified child of the object "
|
||||
"structure variable exists."),
|
||||
_("Child _PARAM2_ of variable _PARAM1_ of _PARAM0_ exists"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Structure variable"))
|
||||
.AddParameter("string", _("Name of the child"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("ObjectVariableRemoveChild",
|
||||
_("Remove a child"),
|
||||
_("Remove a child from an object structure variable."),
|
||||
_("Remove child _PARAM2_ from variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("ObjectVariableClearChildren",
|
||||
@@ -601,12 +592,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Remove all the children from the object array or structure "
|
||||
"variable."),
|
||||
_("Clear children from variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array or structure variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("Cache",
|
||||
@@ -701,8 +691,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/conditions/arret24.png",
|
||||
"res/conditions/arret.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddCondition("Vitesse",
|
||||
@@ -712,10 +702,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/conditions/vitesse24.png",
|
||||
"res/conditions/vitesse.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
// Deprecated
|
||||
@@ -732,7 +722,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("Angle, in degrees"))
|
||||
.AddParameter("expression", _("Tolerance, in degrees"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddCondition("IsTotalForceAngleAround",
|
||||
@@ -746,7 +735,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("Angle, in degrees"))
|
||||
.AddParameter("expression", _("Tolerance, in degrees"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddCondition("VarObjet",
|
||||
@@ -761,7 +749,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
obj.AddCondition("VarObjetTxt",
|
||||
@@ -776,7 +763,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
obj.AddCondition("ObjectVariableAsBoolean",
|
||||
@@ -791,7 +777,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("Check if the value is"))
|
||||
.SetDefaultValue("true")
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
obj.AddCondition("VarObjetDef",
|
||||
@@ -811,13 +796,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) to the end of an object array variable."),
|
||||
_("Add value _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
@@ -825,13 +809,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add variable array value"),
|
||||
_("Adds a number to the end of an object array variable."),
|
||||
_("Add value _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
@@ -840,13 +823,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean to the end of an object array variable."),
|
||||
_("Add value _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForLayoutEventsOnly();
|
||||
|
||||
@@ -856,7 +838,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add existing variable"),
|
||||
_("Adds an existing variable to the end of an object array variable."),
|
||||
_("Add variable _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
@@ -865,7 +847,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.SetParameterLongDescription(_("The content of the object variable will "
|
||||
"*be copied* and added at the "
|
||||
"end of the array."))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetHidden();
|
||||
|
||||
@@ -874,7 +855,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add existing variable"),
|
||||
_("Adds an existing variable to the end of an object array variable."),
|
||||
_("Add variable _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
@@ -883,7 +864,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.SetParameterLongDescription(_("The content of the object variable will "
|
||||
"*be copied* and added at the "
|
||||
"end of the array."))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
@@ -891,13 +871,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) to the end of an object array variable."),
|
||||
_("Add text _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
@@ -905,13 +884,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add number variable"),
|
||||
_("Adds a number to the end of an object array variable."),
|
||||
_("Add number _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
@@ -920,13 +898,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean to the end of an object array variable."),
|
||||
_("Add boolean _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
@@ -937,13 +914,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"variable."),
|
||||
_("Remove variable at index _PARAM2_ from array variable _PARAM1_ of "
|
||||
"_PARAM0_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddCondition(
|
||||
@@ -951,14 +927,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Number of children"),
|
||||
_("Compare the number of children in an object array variable."),
|
||||
_("The number of children in the array variable _PARAM1_"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddStrExpression(
|
||||
@@ -966,44 +941,40 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("First text child"),
|
||||
_("Get the value of the first element of an object array variable, if "
|
||||
"it is a text (string) variable."),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddExpression(
|
||||
"ArrayVariableFirstNumber",
|
||||
_("First number child"),
|
||||
_("Get the value of the first element of an object array variable, if "
|
||||
"it is a number variable."),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddStrExpression(
|
||||
"ArrayVariableLastString",
|
||||
_("Last text child"),
|
||||
_("Get the value of the last element of an object array variable, if "
|
||||
"it is a text (string) variable."),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddExpression(
|
||||
"ArrayVariableLastNumber",
|
||||
_("Last number child"),
|
||||
_("Get the value of the last element of an object array variable, if "
|
||||
"it is a number variable."),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddCondition("BehaviorActivated",
|
||||
_("Behavior activated"),
|
||||
@@ -1038,12 +1009,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/forceVers24.png",
|
||||
"res/actions/forceVers.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectPtr", _("Target Object"))
|
||||
.AddParameter("expression", _("Speed (in pixels per second)"))
|
||||
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
|
||||
.SetDefaultValue("0")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
@@ -1058,13 +1029,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/forceTourne24.png",
|
||||
"res/actions/forceTourne.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectPtr", _("Rotate around this object"))
|
||||
.AddParameter("expression", _("Speed (in degrees per second)"))
|
||||
.AddParameter("expression", _("Distance (in pixels)"))
|
||||
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
|
||||
.SetDefaultValue("0")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("MettreAutour",
|
||||
@@ -1092,10 +1063,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/ecarter24.png",
|
||||
"res/actions/ecarter.png")
|
||||
|
||||
.SetHidden()
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectList", "Object 2 (won't move)")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/");
|
||||
.AddParameter("objectList", "Object 2 (won't move)");
|
||||
|
||||
// Deprecated action
|
||||
obj.AddAction("Ecarter",
|
||||
@@ -1119,6 +1090,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Position"),
|
||||
"res/actions/ecarter24.png",
|
||||
"res/actions/ecarter.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectList", _("Objects (won't move)"))
|
||||
.AddParameter("yesorno",
|
||||
@@ -1127,7 +1099,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"",
|
||||
true)
|
||||
.SetDefaultValue("no")
|
||||
.SetHelpPath("/all-features/collisions/")
|
||||
.MarkAsSimple();
|
||||
|
||||
obj.AddCondition("CollisionPoint",
|
||||
@@ -1140,7 +1111,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("expression", _("X position of the point"))
|
||||
.AddParameter("expression", _("Y position of the point"))
|
||||
.SetHelpPath("/all-features/collisions/")
|
||||
.MarkAsSimple();
|
||||
|
||||
extension
|
||||
@@ -1172,7 +1142,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.AddParameter("expression", _("Time in seconds"))
|
||||
.SetHelpPath("/all-features/timers-and-time/")
|
||||
.SetHidden();
|
||||
|
||||
obj.AddCondition(
|
||||
@@ -1188,7 +1157,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.AddParameter("relationalOperator", _("Sign of the test"), "time")
|
||||
.AddParameter("expression", _("Time in seconds"))
|
||||
.SetHelpPath("/all-features/timers-and-time/")
|
||||
.SetManipulatedType("number");
|
||||
|
||||
obj.AddCondition("ObjectTimerPaused",
|
||||
@@ -1200,7 +1168,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/conditions/timerPaused.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.SetHelpPath("/all-features/timers-and-time/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
@@ -1213,8 +1180,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/timer24.png",
|
||||
"res/actions/timer.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.SetHelpPath("/all-features/timers-and-time/");
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer");
|
||||
|
||||
obj.AddAction("PauseObjectTimer",
|
||||
_("Pause an object timer"),
|
||||
@@ -1225,7 +1191,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/pauseTimer.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.SetHelpPath("/all-features/timers-and-time/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("UnPauseObjectTimer",
|
||||
@@ -1237,7 +1202,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/unPauseTimer.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.SetHelpPath("/all-features/timers-and-time/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("RemoveObjectTimer",
|
||||
@@ -1249,7 +1213,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/timer.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.SetHelpPath("/all-features/timers-and-time/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddExpression("X",
|
||||
@@ -1278,32 +1241,28 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("X coordinate of the sum of forces"),
|
||||
_("Movement using forces"),
|
||||
"res/actions/force.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/");
|
||||
.AddParameter("object", _("Object"));
|
||||
|
||||
obj.AddExpression("ForceY",
|
||||
_("Y coordinate of the sum of forces"),
|
||||
_("Y coordinate of the sum of forces"),
|
||||
_("Movement using forces"),
|
||||
"res/actions/force.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/");
|
||||
.AddParameter("object", _("Object"));
|
||||
|
||||
obj.AddExpression("ForceAngle",
|
||||
_("Angle of the sum of forces"),
|
||||
_("Angle of the sum of forces (in degrees)"),
|
||||
_("Movement using forces"),
|
||||
"res/actions/force.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/");
|
||||
.AddParameter("object", _("Object"));
|
||||
|
||||
obj.AddExpression("ForceLength",
|
||||
_("Length of the sum of forces"),
|
||||
_("Length of the sum of forces"),
|
||||
_("Movement using forces"),
|
||||
"res/actions/force.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/");
|
||||
.AddParameter("object", _("Object"));
|
||||
|
||||
obj.AddExpression("Longueur",
|
||||
_("Length of the sum of forces"),
|
||||
@@ -1311,7 +1270,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Movement using forces"),
|
||||
"res/actions/force.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.SetHidden();
|
||||
|
||||
obj.AddExpression("Width",
|
||||
@@ -1408,11 +1366,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"VariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Number of children in an object array or structure variable"),
|
||||
_("Variables ❯ Arrays and structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array or structure variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("objectvar", _("Array or structure variable"));
|
||||
|
||||
obj.AddStrExpression("VariableString",
|
||||
_("Text variable"),
|
||||
@@ -1421,7 +1378,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.SetHelpPath("/all-features/variables/object-variables/")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
obj.AddExpression("ObjectTimerElapsedTime",
|
||||
@@ -1430,8 +1386,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Timers"),
|
||||
"res/actions/time.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer")
|
||||
.SetHelpPath("/all-features/timers-and-time/");
|
||||
.AddParameter("identifier", _("Timer's name"), "objectTimer");
|
||||
|
||||
obj.AddExpression("AngleToObject",
|
||||
_("Angle between two objects"),
|
||||
@@ -1651,7 +1606,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/doMove24.png",
|
||||
"res/actions/doMove.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -1667,7 +1621,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectList", _("Object 2"))
|
||||
.AddParameter("expression", _("Tolerance, in degrees"))
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.SetHelpPath("/tutorials/how-to-move-objects/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -1800,7 +1753,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"",
|
||||
true)
|
||||
.SetDefaultValue("no")
|
||||
.SetHelpPath("/all-features/collisions/")
|
||||
.MarkAsSimple();
|
||||
|
||||
extension
|
||||
@@ -1863,7 +1815,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Scene variable where to store the Y position of the intersection. "
|
||||
"If no intersection is found, the variable won't be changed."))
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.SetHelpPath("/all-features/collisions/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -1895,7 +1846,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Scene variable where to store the Y position of the intersection. "
|
||||
"If no intersection is found, the variable won't be changed."))
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.SetHelpPath("/all-features/collisions/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
|
@@ -92,16 +92,14 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
|
||||
.SetCanHaveSubInstructions()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddCondition("Once",
|
||||
_("Trigger once while true"),
|
||||
_("Run actions only once, for each time the conditions "
|
||||
"have been met."),
|
||||
_("Trigger once"),
|
||||
"",
|
||||
"res/conditions/once24.png",
|
||||
"res/conditions/once.png")
|
||||
.SetHelpPath("/all-features/advanced-conditions/trigger-once");
|
||||
extension.AddCondition(
|
||||
"Once",
|
||||
_("Trigger once while true"),
|
||||
_("Run actions only once, for each time the conditions have been met."),
|
||||
_("Trigger once"),
|
||||
"",
|
||||
"res/conditions/once24.png",
|
||||
"res/conditions/once.png");
|
||||
|
||||
extension
|
||||
.AddCondition("CompareNumbers",
|
||||
|
@@ -28,7 +28,7 @@ BuiltinExtensionsImplementer::ImplementsExternalLayoutsExtension(
|
||||
.AddAction("CreateObjectsFromExternalLayout",
|
||||
_("Create objects from an external layout"),
|
||||
_("Create objects from an external layout."),
|
||||
_("Create objects from the external layout named _PARAM1_ at position _PARAM2_;_PARAM3_;_PARAM4_"),
|
||||
_("Create objects from the external layout named _PARAM1_"),
|
||||
"",
|
||||
"res/ribbon_default/externallayout32.png",
|
||||
"res/ribbon_default/externallayout32.png")
|
||||
|
@@ -35,8 +35,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
|
||||
"res/conditions/keyboard24.png",
|
||||
"res/conditions/keyboard.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("key", _("Key to check"))
|
||||
.SetHidden();
|
||||
.AddParameter("key", _("Key"));
|
||||
|
||||
extension
|
||||
.AddCondition("KeyReleased",
|
||||
@@ -47,32 +46,33 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
|
||||
"res/conditions/keyboard24.png",
|
||||
"res/conditions/keyboard.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("key", _("Key to check"))
|
||||
.SetHidden();
|
||||
.AddParameter("key", _("Key"));
|
||||
|
||||
extension
|
||||
.AddCondition("KeyFromTextPressed",
|
||||
_("Key pressed"),
|
||||
_("Check if a key is pressed"),
|
||||
_("Key pressed (text expression)"),
|
||||
_("Check if a key, retrieved from the result of the "
|
||||
"expression, is pressed"),
|
||||
_("_PARAM1_ key is pressed"),
|
||||
"",
|
||||
"res/conditions/keyboard24.png",
|
||||
"res/conditions/keyboard.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("keyboardKey", _("Key to check"))
|
||||
.MarkAsSimple();
|
||||
.AddParameter("string", _("Expression generating the key to check"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddCondition("KeyFromTextReleased",
|
||||
_("Key released"),
|
||||
_("Check if a key was just released"),
|
||||
_("Key released (text expression)"),
|
||||
_("Check if a key, retrieved from the result of the "
|
||||
"expression, was just released"),
|
||||
_("_PARAM1_ key is released"),
|
||||
"",
|
||||
"res/conditions/keyboard24.png",
|
||||
"res/conditions/keyboard.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("keyboardKey", _("Key to check"))
|
||||
.MarkAsSimple();
|
||||
.AddParameter("string", _("Expression generating the key to check"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddCondition("AnyKeyPressed",
|
||||
|
@@ -151,8 +151,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
|
||||
extension
|
||||
.AddExpression("abs",
|
||||
_("Absolute value"),
|
||||
_("Return the non-negative value by removing the sign. "
|
||||
"The absolute value of -8 is 8."),
|
||||
_("Absolute value"),
|
||||
"",
|
||||
"res/mathfunction.png")
|
||||
.AddParameter("expression", _("Expression"));
|
||||
|
@@ -252,8 +252,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
"res/conditions/mouse.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("mouse", _("Button to check"))
|
||||
.MarkAsSimple()
|
||||
.SetHidden();
|
||||
.MarkAsSimple();
|
||||
|
||||
// Support for deprecated names:
|
||||
extension.AddDuplicatedCondition("SourisBouton", "MouseButtonPressed")
|
||||
@@ -263,41 +262,49 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
.AddCondition("MouseButtonReleased",
|
||||
_("Mouse button released"),
|
||||
_("Check if the specified mouse button was released."),
|
||||
_("Touch or _PARAM1_ mouse button is released"),
|
||||
_("_PARAM1_ mouse button was released"),
|
||||
"",
|
||||
"res/conditions/mouse24.png",
|
||||
"res/conditions/mouse.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("mouse", _("Button to check"))
|
||||
.MarkAsSimple()
|
||||
.SetHidden();
|
||||
.MarkAsSimple();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
"MouseButtonFromTextPressed",
|
||||
_("Mouse button pressed or touch held"),
|
||||
_("Check if the specified mouse button is pressed or "
|
||||
"if a touch is in contact with the screen."),
|
||||
_("Touch or _PARAM1_ mouse button is down"),
|
||||
_("Mouse button pressed or touch held (text expression)"),
|
||||
_("Check if a mouse button, retrieved from the result of the "
|
||||
"expression, is pressed."),
|
||||
_("_PARAM1_ mouse button is pressed"),
|
||||
"",
|
||||
"res/conditions/mouse24.png",
|
||||
"res/conditions/mouse.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("mouseButton", _("Button to check"))
|
||||
.MarkAsSimple();
|
||||
.AddParameter("stringWithSelector",
|
||||
_("Expression generating the mouse button to check"),
|
||||
"[\"Left\", \"Right\", \"Middle\"]")
|
||||
.SetParameterLongDescription(
|
||||
_("Possible values are Left, Right and Middle."))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
"MouseButtonFromTextReleased",
|
||||
_("Mouse button released"),
|
||||
_("Check if the specified mouse button was released."),
|
||||
_("Touch or _PARAM1_ mouse button is released"),
|
||||
_("Mouse button released (text expression)"),
|
||||
_("Check if a mouse button, retrieved from the result of the "
|
||||
"expression, was just released."),
|
||||
_("_PARAM1_ mouse button is released"),
|
||||
"",
|
||||
"res/conditions/mouse24.png",
|
||||
"res/conditions/mouse.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("mouseButton", _("Button to check"))
|
||||
.MarkAsSimple();
|
||||
.AddParameter("stringWithSelector",
|
||||
_("Expression generating the mouse button to check"),
|
||||
"[\"Left\", \"Right\", \"Middle\"]")
|
||||
.SetParameterLongDescription(
|
||||
_("Possible values are Left, Right and Middle."))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddExpressionAndCondition("number",
|
||||
|
@@ -33,7 +33,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"",
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("variableOrPropertyOrParameter", _("Variable"))
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions());
|
||||
|
||||
@@ -45,7 +45,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"",
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("variableOrPropertyOrParameter", _("Variable"))
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", ParameterOptions::MakeNewOptions());
|
||||
|
||||
@@ -58,7 +58,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"",
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("variableOrPropertyOrParameter", _("Variable"))
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("Check if the value is"))
|
||||
.SetDefaultValue("true")
|
||||
// This parameter allows to keep the operand expression
|
||||
@@ -73,7 +73,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"",
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variableOrProperty", _("Variable"))
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.UseStandardOperatorParameters("number",
|
||||
ParameterOptions::MakeNewOptions());
|
||||
|
||||
@@ -85,7 +85,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"",
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variableOrProperty", _("Variable"))
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.UseStandardOperatorParameters("string",
|
||||
ParameterOptions::MakeNewOptions());
|
||||
|
||||
@@ -98,7 +98,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"",
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("variableOrProperty", _("Variable"))
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.AddParameter("operator", _("Value"), "boolean")
|
||||
// This parameter allows to keep the operand expression
|
||||
// when the editor switch between variable instructions.
|
||||
@@ -116,7 +116,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -130,7 +129,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("variable", _("Variable"))
|
||||
.AddParameter("string", _("Name of the child"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -144,7 +142,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -157,7 +154,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Structure or array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -174,7 +170,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.SetParameterLongDescription(
|
||||
_("The content of the variable will *be copied* and added at the "
|
||||
"end of the array."))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -188,7 +183,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -201,7 +195,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -214,7 +207,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -229,7 +221,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -240,8 +231,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"it is a text (string)."),
|
||||
_("Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("variable", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
@@ -251,8 +241,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"it is a number."),
|
||||
_("Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("variable", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
@@ -262,8 +251,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"it is a text (string)."),
|
||||
_("Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("variable", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
@@ -273,8 +261,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"it is a number."),
|
||||
_("Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("variable", _("Array variable"));
|
||||
|
||||
// Legacy instructions
|
||||
|
||||
@@ -283,28 +270,26 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Number variable"),
|
||||
_("Compare the number value of a scene variable."),
|
||||
_("The number of scene variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition("VarSceneTxt",
|
||||
_("Text variable"),
|
||||
_("Compare the text (string) of a scene variable."),
|
||||
_("The text of scene variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
@@ -312,14 +297,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Boolean variable"),
|
||||
_("Compare the boolean value of a scene variable."),
|
||||
_("The boolean value of scene variable _PARAM0_ is _PARAM1_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("Check if the value is"))
|
||||
.SetDefaultValue("true")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition("VariableChildExists",
|
||||
@@ -327,14 +311,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Check if the specified child of the scene structure "
|
||||
"variable exists."),
|
||||
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddParameter("string", _("Name of the child"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -343,14 +325,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Check if the specified child of the global structure "
|
||||
"variable exists."),
|
||||
_("Child _PARAM1_ of global variable _PARAM0_ exists"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.AddParameter("string", _("Name of the child"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -358,7 +338,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"Variable defined",
|
||||
"Test if the scene variable exists.",
|
||||
"Scene variable _PARAM0_ is defined",
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
@@ -370,14 +350,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Number variable"),
|
||||
_("Compare the number value of a global variable."),
|
||||
_("the global variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -385,14 +364,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Text variable"),
|
||||
_("Compare the text (string) of a global variable."),
|
||||
_("the text of the global variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -401,21 +379,20 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Boolean variable"),
|
||||
_("Compare the boolean value of a global variable."),
|
||||
_("The boolean value of global variable _PARAM0_ is _PARAM1_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("Check if the value is"))
|
||||
.SetDefaultValue("true")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition("VarGlobalDef",
|
||||
"Variable defined",
|
||||
"Test if a global variable exists.",
|
||||
"Global variable _PARAM0_ is defined",
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
@@ -428,28 +405,26 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Change number variable"),
|
||||
_("Modify the number value of a scene variable."),
|
||||
_("the scene variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.UseStandardOperatorParameters("number",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction("ModVarSceneTxt",
|
||||
_("Change text variable"),
|
||||
_("Modify the text (string) of a scene variable."),
|
||||
_("the text of scene variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.UseStandardOperatorParameters("string",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
@@ -457,13 +432,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Change boolean variable"),
|
||||
_("Modify the boolean value of a scene variable."),
|
||||
_("Set the boolean value of scene variable _PARAM0_ to _PARAM1_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("New Value:"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction("ToggleSceneVariableAsBoolean",
|
||||
@@ -472,26 +446,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("If it was true, it will become false, and if it was "
|
||||
"false it will become true."),
|
||||
_("Toggle the boolean value of scene variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction("ModVarGlobal",
|
||||
_("Change number variable"),
|
||||
_("Modify the number value of a global variable."),
|
||||
_("the global variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.UseStandardOperatorParameters("number",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -499,14 +471,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Change text variable"),
|
||||
_("Modify the text (string) of a global variable."),
|
||||
_("the text of global variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.UseStandardOperatorParameters("string",
|
||||
ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -515,13 +486,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Change boolean variable"),
|
||||
_("Modify the boolean value of a global variable."),
|
||||
_("Set the boolean value of global variable _PARAM0_ to _PARAM1_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("New Value:"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction("ToggleGlobalVariableAsBoolean",
|
||||
@@ -530,12 +500,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("If it was true, it will become false, and if it was "
|
||||
"false it will become true."),
|
||||
_("Toggle the boolean value of global variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
@@ -543,15 +512,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Remove a child"),
|
||||
_("Remove a child from a scene structure variable."),
|
||||
_("Remove child _PARAM1_ from scene structure variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
@@ -559,15 +526,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Remove a child"),
|
||||
_("Remove a child from a global structure variable."),
|
||||
_("Remove child _PARAM1_ from global structure variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.MarkAsAdvanced()
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction("VariableClearChildren",
|
||||
@@ -575,13 +540,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Remove all the children from the scene structure or array "
|
||||
"variable."),
|
||||
_("Clear children from scene variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Structure or array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -590,13 +553,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Remove all the children from the global structure or array "
|
||||
"variable."),
|
||||
_("Clear children from global variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Structure or array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -605,7 +566,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Adds an existing variable at the end of a scene array "
|
||||
"variable."),
|
||||
_("Add variable _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
@@ -613,9 +574,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.SetParameterLongDescription(
|
||||
_("The content of the variable will *be copied* and added at the "
|
||||
"end of the array."))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -624,14 +583,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) at the end of a scene array variable."),
|
||||
_("Add text _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -639,14 +596,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add number variable"),
|
||||
_("Adds a number at the end of a scene array variable."),
|
||||
_("Add number _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -654,14 +609,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean at the end of a scene array variable."),
|
||||
_("Add boolean _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -671,14 +624,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"variable."),
|
||||
_("Remove variable at index _PARAM1_ from scene array "
|
||||
"variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -687,15 +638,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Number of children"),
|
||||
_("Compare the number of children in a scene array variable."),
|
||||
_("The number of children in the array variable _PARAM0_"),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -704,12 +653,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("First text child"),
|
||||
_("Get the value of the first element of a scene array variable, if "
|
||||
"it is a text (string)."),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
@@ -717,12 +664,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("First number child"),
|
||||
_("Get the value of the first element of a scene array variable, if "
|
||||
"it is a number."),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
@@ -730,12 +675,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Last text child"),
|
||||
_("Get the value of the last element of a scene array variable, if "
|
||||
"it is a text (string)."),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
@@ -743,12 +686,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Last number child"),
|
||||
_("Get the value of the last element of a scene array variable, if "
|
||||
"it is a number."),
|
||||
_("External variables ❯ Scene variables ❯ Arrays and structures"),
|
||||
_("External variables/Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
@@ -756,7 +697,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add existing variable"),
|
||||
_("Adds an existing variable at the end of a global array variable."),
|
||||
_("Add variable _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
@@ -764,9 +705,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.SetParameterLongDescription(
|
||||
_("The content of the variable will *be copied* and added at the "
|
||||
"end of the array."))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -776,14 +715,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"array variable."),
|
||||
_("Remove variable at index _PARAM1_ from global array "
|
||||
"variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -792,14 +729,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) at the end of a global array variable."),
|
||||
_("Add text _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -807,14 +742,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add number variable"),
|
||||
_("Adds a number at the end of a global array variable."),
|
||||
_("Add number _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -822,14 +755,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean at the end of a global array variable."),
|
||||
_("Add boolean _PARAM1_ to array variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -838,15 +769,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Number of children"),
|
||||
_("Compare the number of children in a global array variable."),
|
||||
_("The number of children of the array variable _PARAM0_"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -854,24 +783,20 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("First text child"),
|
||||
_("Value of the first element of a global array "
|
||||
"variable, if it is a text (string) variable."),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariableFirstNumber",
|
||||
_("First number child"),
|
||||
_("Value of the first element of a global array "
|
||||
"variable, if it is a number variable"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
@@ -879,12 +804,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Last text child"),
|
||||
_("Value of the last element of a global array variable, if "
|
||||
"it is a text (string) variable."),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
@@ -892,23 +815,20 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
_("Last number child"),
|
||||
_("Value of the last element of a global array variable, if "
|
||||
"it is a number variable"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Number of children in a global array or "
|
||||
"structure variable"),
|
||||
_("External variables ❯ Global variables ❯ Arrays and structures"),
|
||||
_("External variables/Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array or structure variable"))
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression("VariableChildCount",
|
||||
@@ -917,48 +837,43 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"structure variable"),
|
||||
_("Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("variable", _("Array or structure variable"), "AllowUndeclaredVariable")
|
||||
.SetHelpPath("/all-features/variables/structures-and-arrays/");
|
||||
.AddParameter("variable", _("Array or structure variable"), "AllowUndeclaredVariable");
|
||||
|
||||
extension
|
||||
.AddExpression("Variable",
|
||||
_("Number variable"),
|
||||
_("Number value of a scene variable"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddStrExpression("VariableString",
|
||||
_("Text variable"),
|
||||
_("Text of a scene variable"),
|
||||
_("External variables ❯ Scene variables"),
|
||||
_("External variables/Scene variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariable",
|
||||
_("Number variable"),
|
||||
_("Number value of a global variable"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Name of the global variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddStrExpression("GlobalVariableString",
|
||||
_("Text variable"),
|
||||
_("Text of a global variable"),
|
||||
_("External variables ❯ Global variables"),
|
||||
_("External variables/Global variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.SetHidden();
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -46,25 +46,30 @@ ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& icon24x24)
|
||||
: name(name_),
|
||||
iconFilename(icon24x24),
|
||||
extensionNamespace(extensionNamespace_) {
|
||||
SetFullName(gd::String(fullname_));
|
||||
SetDescription(gd::String(description_));
|
||||
}
|
||||
: ObjectMetadata(extensionNamespace_,
|
||||
name_,
|
||||
fullname_,
|
||||
description_,
|
||||
icon24x24,
|
||||
[]() -> std::unique_ptr<gd::ObjectConfiguration> {
|
||||
gd::LogFatalError(
|
||||
"Error: Event-based objects don't have blueprint. "
|
||||
"This method should never be called.");
|
||||
return nullptr;
|
||||
}) {}
|
||||
|
||||
ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
|
||||
const gd::String& name_,
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& icon24x24,
|
||||
CreateFunPtr createFunPtr_)
|
||||
: ObjectMetadata(extensionNamespace_,
|
||||
name_,
|
||||
fullname_,
|
||||
description_,
|
||||
icon24x24) {
|
||||
createFunPtr = createFunPtr_;
|
||||
CreateFunPtr createFunPtrP)
|
||||
: name(name_),
|
||||
iconFilename(icon24x24),
|
||||
createFunPtr(createFunPtrP),
|
||||
extensionNamespace(extensionNamespace_) {
|
||||
SetFullName(gd::String(fullname_));
|
||||
SetDescription(gd::String(description_));
|
||||
}
|
||||
|
||||
gd::InstructionMetadata& ObjectMetadata::AddCondition(
|
||||
|
@@ -39,8 +39,6 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
|
||||
/**
|
||||
* \brief Construct an object metadata, using a "blueprint" object that will
|
||||
* be copied when a new object is requested.
|
||||
*
|
||||
* \note This is used for objects declared in JavaScript extensions.
|
||||
*/
|
||||
ObjectMetadata(const gd::String& extensionNamespace_,
|
||||
const gd::String& name_,
|
||||
@@ -49,9 +47,9 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
|
||||
const gd::String& icon24x24_,
|
||||
std::shared_ptr<gd::ObjectConfiguration> blueprintObject_);
|
||||
/**
|
||||
* \brief Construct an object metadata.
|
||||
* \brief Construct an object metadata, without "blueprint" object
|
||||
*
|
||||
* \note This is used by events based objects ("custom objects").
|
||||
* \note This is used by events based objects.
|
||||
*/
|
||||
ObjectMetadata(const gd::String& extensionNamespace_,
|
||||
const gd::String& name_,
|
||||
@@ -62,17 +60,14 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
|
||||
/**
|
||||
* \brief Construct an object metadata, with a function that will be called
|
||||
* to instantiate a new object.
|
||||
*
|
||||
* \note This is used for objects declared in C++ extensions.
|
||||
*/
|
||||
ObjectMetadata(const gd::String& extensionNamespace_,
|
||||
const gd::String& name_,
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& icon24x24_,
|
||||
CreateFunPtr createFunPtr_);
|
||||
|
||||
ObjectMetadata() {}
|
||||
CreateFunPtr createFunPtrP);
|
||||
ObjectMetadata() : createFunPtr(NULL) {}
|
||||
virtual ~ObjectMetadata(){};
|
||||
|
||||
/**
|
||||
@@ -365,7 +360,7 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
|
||||
|
||||
std::vector<gd::String> includeFiles;
|
||||
gd::String className;
|
||||
CreateFunPtr createFunPtr = nullptr;
|
||||
CreateFunPtr createFunPtr;
|
||||
|
||||
private:
|
||||
gd::String extensionNamespace;
|
||||
|
@@ -33,8 +33,7 @@ void ParameterMetadataTools::ParametersToObjectsContainer(
|
||||
const auto& parameter = parameters.GetParameter(i);
|
||||
if (parameter.GetName().empty()) continue;
|
||||
|
||||
auto &valueTypeMetadata = parameter.GetValueTypeMetadata();
|
||||
if (valueTypeMetadata.IsObject()) {
|
||||
if (gd::ParameterMetadata::IsObject(parameter.GetType())) {
|
||||
const gd::String& objectName = parameter.GetName();
|
||||
const gd::String& objectType = parameter.GetExtraInfo();
|
||||
allObjectNames.insert(objectName);
|
||||
@@ -69,7 +68,7 @@ void ParameterMetadataTools::ParametersToObjectsContainer(
|
||||
// Search "lastObjectName" in the codebase for other place where this
|
||||
// convention is enforced.
|
||||
lastObjectName = objectName;
|
||||
} else if (valueTypeMetadata.IsBehavior()) {
|
||||
} else if (gd::ParameterMetadata::IsBehavior(parameter.GetType())) {
|
||||
if (!lastObjectName.empty()) {
|
||||
if (outputObjectsContainer.HasObjectNamed(lastObjectName)) {
|
||||
const gd::String& behaviorName = parameter.GetName();
|
||||
|
@@ -79,8 +79,6 @@ const gd::String ValueTypeMetadata::colorValueType = "color";
|
||||
const gd::String ValueTypeMetadata::choiceValueType = "stringWithSelector";
|
||||
const gd::String ValueTypeMetadata::behaviorValueType = "behavior";
|
||||
const gd::String ValueTypeMetadata::leaderboardIdValueType = "leaderboardId";
|
||||
const gd::String ValueTypeMetadata::objectAnimationNameValueType = "objectAnimationName";
|
||||
const gd::String ValueTypeMetadata::keyboardKeyValueType = "keyboardKey";
|
||||
|
||||
const gd::String &ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
const gd::String &propertyType) {
|
||||
@@ -96,12 +94,8 @@ const gd::String &ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
return behaviorValueType;
|
||||
} else if (propertyType == "LeaderboardId") {
|
||||
return leaderboardIdValueType;
|
||||
} else if (propertyType == "ObjectAnimationName") {
|
||||
return objectAnimationNameValueType;
|
||||
} else if (propertyType == "KeyboardKey") {
|
||||
return keyboardKeyValueType;
|
||||
}
|
||||
// For "String", "Resource", "MultilineString" or default
|
||||
// For "String" or default
|
||||
return stringValueType;
|
||||
};
|
||||
|
||||
|
@@ -129,7 +129,7 @@ class GD_CORE_API ValueTypeMetadata {
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return true if the type of the parameter is a variable.
|
||||
* \brief Return true if the type of the parameter is a number.
|
||||
* \note If you had a new type of parameter, also add it in the IDE (
|
||||
* see EventsFunctionParametersEditor, ParameterRenderingService
|
||||
* and ExpressionAutocompletion) and in the EventsCodeGenerator.
|
||||
@@ -148,19 +148,6 @@ class GD_CORE_API ValueTypeMetadata {
|
||||
return gd::ValueTypeMetadata::GetPrimitiveValueType(type) == "variable";
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return true if the type of the parameter is a variable and not a
|
||||
* property or a parameter.
|
||||
*/
|
||||
bool IsVariableOnly() const {
|
||||
return
|
||||
// Any variable.
|
||||
name == "variable" ||
|
||||
// Old, "pre-scoped" variables:
|
||||
name == "objectvar" || name == "globalvar" ||
|
||||
name == "scenevar";
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return true if the type is a variable but from a specific scope
|
||||
* (scene, project or object). In new code, prefer to use the more generic "variable"
|
||||
@@ -225,20 +212,15 @@ class GD_CORE_API ValueTypeMetadata {
|
||||
parameterType == "functionParameterName" ||
|
||||
parameterType == "externalLayoutName" ||
|
||||
parameterType == "leaderboardId" ||
|
||||
parameterType == "keyboardKey" ||
|
||||
parameterType == "mouseButton" ||
|
||||
parameterType == "identifier";
|
||||
} else if (type == "boolean") {
|
||||
return parameterType == "yesorno" || parameterType == "trueorfalse";
|
||||
} else if (type == "variable") {
|
||||
return
|
||||
// Any variable.
|
||||
parameterType == "variable" ||
|
||||
parameterType == "variableOrProperty" ||
|
||||
parameterType == "variableOrPropertyOrParameter" ||
|
||||
// Old, "pre-scoped" variables:
|
||||
parameterType == "objectvar" || parameterType == "globalvar" ||
|
||||
parameterType == "scenevar";
|
||||
parameterType == "variable" || // Any variable.
|
||||
// Old, "pre-scoped" variables:
|
||||
parameterType == "objectvar" || parameterType == "globalvar" ||
|
||||
parameterType == "scenevar";
|
||||
} else if (type == "resource") {
|
||||
return parameterType == "fontResource" ||
|
||||
parameterType == "audioResource" ||
|
||||
@@ -334,8 +316,6 @@ class GD_CORE_API ValueTypeMetadata {
|
||||
static const gd::String choiceValueType;
|
||||
static const gd::String behaviorValueType;
|
||||
static const gd::String leaderboardIdValueType;
|
||||
static const gd::String objectAnimationNameValueType;
|
||||
static const gd::String keyboardKeyValueType;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -38,14 +38,12 @@ bool Platform::AddExtension(std::shared_ptr<gd::PlatformExtension> extension) {
|
||||
|
||||
extensionsLoaded.push_back(extension);
|
||||
|
||||
// Load all creation functions for objects provided by the
|
||||
// extension.
|
||||
// Load all creation/destruction functions for objects provided by the
|
||||
// extension
|
||||
vector<gd::String> objectsTypes = extension->GetExtensionObjectsTypes();
|
||||
for (std::size_t i = 0; i < objectsTypes.size(); ++i) {
|
||||
CreateFunPtr createFunPtr = extension->GetObjectCreationFunctionPtr(objectsTypes[i]);
|
||||
if (createFunPtr != nullptr) {
|
||||
creationFunctionTable[objectsTypes[i]] = createFunPtr;
|
||||
}
|
||||
creationFunctionTable[objectsTypes[i]] =
|
||||
extension->GetObjectCreationFunctionPtr(objectsTypes[i]);
|
||||
}
|
||||
|
||||
for (const auto& it :
|
||||
@@ -64,9 +62,7 @@ void Platform::RemoveExtension(const gd::String& name) {
|
||||
if (extension->GetName() == name) {
|
||||
vector<gd::String> objectsTypes = extension->GetExtensionObjectsTypes();
|
||||
for (std::size_t i = 0; i < objectsTypes.size(); ++i) {
|
||||
if (creationFunctionTable.find(objectsTypes[i]) != creationFunctionTable.end()) {
|
||||
creationFunctionTable.erase(objectsTypes[i]);
|
||||
}
|
||||
creationFunctionTable.erase(objectsTypes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -141,7 +141,7 @@ class GD_CORE_API ExpressionParameterReplacer
|
||||
parameterMetadata->GetValueTypeMetadata();
|
||||
if (gd::EventsParameterReplacer::CanContainParameter(
|
||||
parameterTypeMetadata)) {
|
||||
isParentTypeAVariable = parameterTypeMetadata.IsVariableOnly();
|
||||
isParentTypeAVariable = parameterTypeMetadata.IsVariable();
|
||||
parameter->Visit(*this);
|
||||
}
|
||||
}
|
||||
@@ -197,7 +197,7 @@ bool EventsParameterReplacer::DoVisitInstruction(gd::Instruction& instruction,
|
||||
if (node) {
|
||||
ExpressionParameterReplacer renamer(
|
||||
platform, GetProjectScopedContainers(),
|
||||
parameterMetadata.GetValueTypeMetadata().IsVariableOnly(),
|
||||
parameterMetadata.GetValueTypeMetadata().IsVariable(),
|
||||
oldToNewPropertyNames);
|
||||
node->Visit(renamer);
|
||||
|
||||
@@ -221,7 +221,7 @@ bool EventsParameterReplacer::DoVisitEventExpression(
|
||||
if (node) {
|
||||
ExpressionParameterReplacer renamer(
|
||||
platform, GetProjectScopedContainers(),
|
||||
metadata.GetValueTypeMetadata().IsVariableOnly(), oldToNewPropertyNames);
|
||||
metadata.GetValueTypeMetadata().IsVariable(), oldToNewPropertyNames);
|
||||
node->Visit(renamer);
|
||||
|
||||
if (renamer.HasDoneRenaming()) {
|
||||
|
@@ -168,7 +168,7 @@ class GD_CORE_API ExpressionPropertyReplacer
|
||||
parameterMetadata->GetValueTypeMetadata();
|
||||
if (gd::EventsPropertyReplacer::CanContainProperty(
|
||||
parameterTypeMetadata)) {
|
||||
isParentTypeAVariable = parameterTypeMetadata.IsVariableOnly();
|
||||
isParentTypeAVariable = parameterTypeMetadata.IsVariable();
|
||||
parameter->Visit(*this);
|
||||
}
|
||||
}
|
||||
@@ -231,7 +231,7 @@ bool EventsPropertyReplacer::DoVisitInstruction(gd::Instruction& instruction,
|
||||
if (node) {
|
||||
ExpressionPropertyReplacer renamer(
|
||||
platform, GetProjectScopedContainers(), targetPropertiesContainer,
|
||||
parameterMetadata.GetValueTypeMetadata().IsVariableOnly(),
|
||||
parameterMetadata.GetValueTypeMetadata().IsVariable(),
|
||||
oldToNewPropertyNames, removedPropertyNames);
|
||||
node->Visit(renamer);
|
||||
|
||||
@@ -257,7 +257,7 @@ bool EventsPropertyReplacer::DoVisitEventExpression(
|
||||
if (node) {
|
||||
ExpressionPropertyReplacer renamer(
|
||||
platform, GetProjectScopedContainers(), targetPropertiesContainer,
|
||||
metadata.GetValueTypeMetadata().IsVariableOnly(), oldToNewPropertyNames,
|
||||
metadata.GetValueTypeMetadata().IsVariable(), oldToNewPropertyNames,
|
||||
removedPropertyNames);
|
||||
node->Visit(renamer);
|
||||
|
||||
|
@@ -71,18 +71,13 @@ bool EventsVariableInstructionTypeSwitcher::DoVisitInstruction(gd::Instruction&
|
||||
.GetObjectsContainersList()
|
||||
.GetObjectOrGroupVariablesContainer(lastObjectName);
|
||||
}
|
||||
} else if (type == "variableOrProperty") {
|
||||
variablesContainer =
|
||||
&GetProjectScopedContainers()
|
||||
.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyName(variableName);
|
||||
} else {
|
||||
if (GetProjectScopedContainers().GetVariablesContainersList().Has(
|
||||
variableName)) {
|
||||
variablesContainer =
|
||||
&GetProjectScopedContainers()
|
||||
.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(variableName);
|
||||
.GetVariablesContainerFromVariableName(variableName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -122,7 +122,7 @@ class GD_CORE_API ExpressionVariableReplacer
|
||||
[&]() {
|
||||
// This is a variable.
|
||||
if (&projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(node.name) ==
|
||||
.GetVariablesContainerFromVariableName(node.name) ==
|
||||
&targetVariablesContainer) {
|
||||
// The node represents a variable, that can come from the target
|
||||
// (because the target is in the scope), replace or remove it:
|
||||
@@ -235,7 +235,7 @@ class GD_CORE_API ExpressionVariableReplacer
|
||||
[&]() {
|
||||
// This is a variable.
|
||||
if (&projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(
|
||||
.GetVariablesContainerFromVariableName(
|
||||
node.identifierName) == &targetVariablesContainer) {
|
||||
// The node represents a variable, that can come from the target
|
||||
// (because the target is in the scope), replace or remove it:
|
||||
|
@@ -73,7 +73,6 @@ class GD_CORE_API EventsVariableReplacer
|
||||
*/
|
||||
const gd::String targetGroupName;
|
||||
const VariablesRenamingChangesetNode &variablesRenamingChangesetRoot;
|
||||
// TODO There is no reason de delete events. This dead code should be removed.
|
||||
const std::unordered_set<gd::String> &removedVariableNames;
|
||||
|
||||
static VariablesContainer nullVariablesContainer;
|
||||
|
@@ -1,235 +0,0 @@
|
||||
#include "ExampleExtensionUsagesFinder.h"
|
||||
|
||||
#include "GDCore/Events/Instruction.h"
|
||||
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
||||
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
#include "GDCore/IDE/WholeProjectRefactorer.h"
|
||||
#include "GDCore/Project/Behavior.h"
|
||||
#include "GDCore/Project/EventsFunctionsExtension.h"
|
||||
#include "GDCore/Project/Object.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
std::set<gd::String>
|
||||
ExampleExtensionUsagesFinder::GetUsedExtensions(gd::Project &project) {
|
||||
ExampleExtensionUsagesFinder worker(project);
|
||||
gd::ProjectBrowserHelper::ExposeProjectObjects(project, worker);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(project,
|
||||
worker);
|
||||
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
worker.isStoreExtension =
|
||||
eventsFunctionsExtension.GetOriginName() == "gdevelop-extension-store";
|
||||
ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
|
||||
project, eventsFunctionsExtension, worker);
|
||||
}
|
||||
if (!worker.has3DObjects) {
|
||||
worker.usedExtensions.erase("Scene3D");
|
||||
}
|
||||
return worker.usedExtensions;
|
||||
};
|
||||
|
||||
void ExampleExtensionUsagesFinder::AddUsedExtension(
|
||||
const gd::PlatformExtension &extension) {
|
||||
usedExtensions.insert(extension.GetName());
|
||||
}
|
||||
|
||||
void ExampleExtensionUsagesFinder::AddUsedBuiltinExtension(
|
||||
const gd::String &extensionName) {
|
||||
usedExtensions.insert(extensionName);
|
||||
}
|
||||
|
||||
// Objects scanner
|
||||
|
||||
void ExampleExtensionUsagesFinder::DoVisitObject(gd::Object &object) {
|
||||
auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata(
|
||||
project.GetCurrentPlatform(), object.GetType());
|
||||
if (metadata.GetMetadata().IsRenderedIn3D()) {
|
||||
has3DObjects = true;
|
||||
}
|
||||
AddUsedExtension(metadata.GetExtension());
|
||||
};
|
||||
|
||||
// Behaviors scanner
|
||||
|
||||
void ExampleExtensionUsagesFinder::DoVisitBehavior(gd::Behavior &behavior) {
|
||||
auto metadata = gd::MetadataProvider::GetExtensionAndBehaviorMetadata(
|
||||
project.GetCurrentPlatform(), behavior.GetTypeName());
|
||||
AddUsedExtension(metadata.GetExtension());
|
||||
};
|
||||
|
||||
// Instructions scanner
|
||||
|
||||
bool ExampleExtensionUsagesFinder::DoVisitInstruction(
|
||||
gd::Instruction &instruction, bool isCondition) {
|
||||
auto metadata =
|
||||
isCondition ? gd::MetadataProvider::GetExtensionAndConditionMetadata(
|
||||
project.GetCurrentPlatform(), instruction.GetType())
|
||||
: gd::MetadataProvider::GetExtensionAndActionMetadata(
|
||||
project.GetCurrentPlatform(), instruction.GetType());
|
||||
// Unused event-based objects or events-based behaviors may use object and
|
||||
// behavior instructions that should not be detected as extension usage.
|
||||
// The extension of actually used objects and behaviors will be detected on
|
||||
// scene objects. This is why object or behavior instructions usually don't
|
||||
// have any import.
|
||||
// Built-in extensions that are included by default don't declare any include
|
||||
// files on their instructions either. To still detect their usage, we
|
||||
// consider that main events and dedicated extensions can't have dead code.
|
||||
if (!isStoreExtension || !metadata.GetMetadata().GetIncludeFiles().empty()) {
|
||||
AddUsedExtension(metadata.GetExtension());
|
||||
}
|
||||
|
||||
gd::ParameterMetadataTools::IterateOverParameters(
|
||||
instruction.GetParameters(), metadata.GetMetadata().GetParameters(),
|
||||
[this](const gd::ParameterMetadata ¶meterMetadata,
|
||||
const gd::Expression ¶meterValue,
|
||||
const gd::String &lastObjectName) {
|
||||
const gd::String ¶meterType = parameterMetadata.GetType();
|
||||
|
||||
if (gd::ParameterMetadata::IsExpression("string", parameterType)) {
|
||||
rootType = "string";
|
||||
parameterValue.GetRootNode()->Visit(*this);
|
||||
} else if (gd::ParameterMetadata::IsExpression("number",
|
||||
parameterType)) {
|
||||
rootType = "number";
|
||||
parameterValue.GetRootNode()->Visit(*this);
|
||||
} else if (gd::ParameterMetadata::IsExpression("variable",
|
||||
parameterType))
|
||||
AddUsedBuiltinExtension("BuiltinVariables");
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Expressions scanner
|
||||
|
||||
// Ignore literals nodes
|
||||
void ExampleExtensionUsagesFinder::OnVisitNumberNode(NumberNode &node){};
|
||||
void ExampleExtensionUsagesFinder::OnVisitTextNode(TextNode &node){};
|
||||
|
||||
// Ignore nodes without valid extensions
|
||||
void ExampleExtensionUsagesFinder::OnVisitEmptyNode(EmptyNode &node){};
|
||||
void ExampleExtensionUsagesFinder::OnVisitObjectFunctionNameNode(
|
||||
ObjectFunctionNameNode &node){};
|
||||
|
||||
// Visit sub-expressions
|
||||
void ExampleExtensionUsagesFinder::OnVisitSubExpressionNode(
|
||||
SubExpressionNode &node) {
|
||||
node.expression->Visit(*this);
|
||||
};
|
||||
|
||||
void ExampleExtensionUsagesFinder::OnVisitOperatorNode(OperatorNode &node) {
|
||||
node.leftHandSide->Visit(*this);
|
||||
node.rightHandSide->Visit(*this);
|
||||
};
|
||||
|
||||
void ExampleExtensionUsagesFinder::OnVisitUnaryOperatorNode(
|
||||
UnaryOperatorNode &node) {
|
||||
node.factor->Visit(*this);
|
||||
};
|
||||
|
||||
// Add variable extension and visit sub-expressions on variable nodes
|
||||
void ExampleExtensionUsagesFinder::OnVisitVariableNode(VariableNode &node) {
|
||||
AddUsedBuiltinExtension("BuiltinVariables");
|
||||
|
||||
auto type = gd::ExpressionTypeFinder::GetType(project.GetCurrentPlatform(),
|
||||
GetProjectScopedContainers(),
|
||||
rootType, node);
|
||||
|
||||
if (gd::ParameterMetadata::IsExpression("variable", type)) {
|
||||
// Nothing to do (this can't reference an object)
|
||||
} else {
|
||||
GetProjectScopedContainers().MatchIdentifierWithName<void>(
|
||||
node.name,
|
||||
[&]() {
|
||||
// This represents an object.
|
||||
auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata(
|
||||
project.GetCurrentPlatform(), node.name);
|
||||
AddUsedExtension(metadata.GetExtension());
|
||||
},
|
||||
[&]() {
|
||||
// This is a variable.
|
||||
},
|
||||
[&]() {
|
||||
// This is a property.
|
||||
},
|
||||
[&]() {
|
||||
// This is a parameter.
|
||||
},
|
||||
[&]() {
|
||||
// This is something else.
|
||||
});
|
||||
}
|
||||
|
||||
if (node.child)
|
||||
node.child->Visit(*this);
|
||||
};
|
||||
|
||||
void ExampleExtensionUsagesFinder::OnVisitVariableAccessorNode(
|
||||
VariableAccessorNode &node) {
|
||||
AddUsedBuiltinExtension("BuiltinVariables");
|
||||
if (node.child)
|
||||
node.child->Visit(*this);
|
||||
};
|
||||
|
||||
void ExampleExtensionUsagesFinder::OnVisitVariableBracketAccessorNode(
|
||||
VariableBracketAccessorNode &node) {
|
||||
AddUsedBuiltinExtension("BuiltinVariables");
|
||||
node.expression->Visit(*this);
|
||||
if (node.child)
|
||||
node.child->Visit(*this);
|
||||
};
|
||||
|
||||
// Add extensions bound to Objects/Behaviors/Functions
|
||||
void ExampleExtensionUsagesFinder::OnVisitIdentifierNode(IdentifierNode &node) {
|
||||
auto type = gd::ExpressionTypeFinder::GetType(project.GetCurrentPlatform(),
|
||||
GetProjectScopedContainers(),
|
||||
rootType, node);
|
||||
if (gd::ParameterMetadata::IsObject(type) ||
|
||||
GetObjectsContainersList().HasObjectOrGroupNamed(node.identifierName)) {
|
||||
// An object or object variable is used.
|
||||
auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata(
|
||||
project.GetCurrentPlatform(), node.identifierName);
|
||||
AddUsedExtension(metadata.GetExtension());
|
||||
}
|
||||
};
|
||||
|
||||
void ExampleExtensionUsagesFinder::OnVisitFunctionCallNode(
|
||||
FunctionCallNode &node) {
|
||||
// Extensions of non-free functions are already found when scanning objects.
|
||||
if (!(node.objectName.empty() && node.behaviorName.empty()))
|
||||
return;
|
||||
gd::ExtensionAndMetadata<gd::ExpressionMetadata> metadata;
|
||||
|
||||
// Try to find a free number expression
|
||||
metadata = gd::MetadataProvider::GetExtensionAndExpressionMetadata(
|
||||
project.GetCurrentPlatform(), node.functionName);
|
||||
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata.GetMetadata())) {
|
||||
// Try to find a free str expression
|
||||
metadata = gd::MetadataProvider::GetExtensionAndStrExpressionMetadata(
|
||||
project.GetCurrentPlatform(), node.functionName);
|
||||
// No valid expression found, return.
|
||||
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata.GetMetadata()))
|
||||
return;
|
||||
}
|
||||
|
||||
// Unused event-based objects or events-based behaviors may use object and
|
||||
// behavior expressions that should not be detected as extension usage.
|
||||
// The extension of actually used objects and behaviors will be detected on
|
||||
// scene objects. This is why object or behavior expressions usually don't
|
||||
// have any import.
|
||||
// Built-in extensions that are included by default don't declare any include
|
||||
// files on their instructions either. To still detect their usage, we
|
||||
// consider that main events and dedicated extensions can't have dead code.
|
||||
if (!isStoreExtension || !metadata.GetMetadata().GetIncludeFiles().empty()) {
|
||||
AddUsedExtension(metadata.GetExtension());
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
#include "GDCore/Extensions/Metadata/SourceFileMetadata.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class Object;
|
||||
class Behavior;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* @brief List extension usages for generated example web-pages.
|
||||
*
|
||||
* Dependency transitivity is not ensured (see UsedExtensionsFinder).
|
||||
*/
|
||||
class GD_CORE_API ExampleExtensionUsagesFinder
|
||||
: public ArbitraryObjectsWorker,
|
||||
public ArbitraryEventsWorkerWithContext,
|
||||
public ExpressionParser2NodeWorker {
|
||||
public:
|
||||
static std::set<gd::String> GetUsedExtensions(gd::Project &project);
|
||||
|
||||
private:
|
||||
ExampleExtensionUsagesFinder(gd::Project &project_) : project(project_){};
|
||||
gd::Project &project;
|
||||
gd::String rootType;
|
||||
bool isStoreExtension = false;
|
||||
|
||||
// Result
|
||||
std::set<gd::String> usedExtensions;
|
||||
bool has3DObjects = false;
|
||||
|
||||
void AddUsedExtension(const gd::PlatformExtension &extension);
|
||||
void AddUsedBuiltinExtension(const gd::String &extensionName);
|
||||
|
||||
// Object Visitor
|
||||
void DoVisitObject(gd::Object &object) override;
|
||||
|
||||
// Behavior Visitor
|
||||
void DoVisitBehavior(gd::Behavior &behavior) override;
|
||||
|
||||
// Instructions Visitor
|
||||
bool DoVisitInstruction(gd::Instruction &instruction,
|
||||
bool isCondition) override;
|
||||
|
||||
// Expression Visitor
|
||||
void OnVisitSubExpressionNode(SubExpressionNode &node) override;
|
||||
void OnVisitOperatorNode(OperatorNode &node) override;
|
||||
void OnVisitUnaryOperatorNode(UnaryOperatorNode &node) override;
|
||||
void OnVisitNumberNode(NumberNode &node) override;
|
||||
void OnVisitTextNode(TextNode &node) override;
|
||||
void OnVisitVariableNode(VariableNode &node) override;
|
||||
void OnVisitVariableAccessorNode(VariableAccessorNode &node) override;
|
||||
void OnVisitVariableBracketAccessorNode(
|
||||
VariableBracketAccessorNode &node) override;
|
||||
void OnVisitIdentifierNode(IdentifierNode &node) override;
|
||||
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode &node) override;
|
||||
void OnVisitFunctionCallNode(FunctionCallNode &node) override;
|
||||
void OnVisitEmptyNode(EmptyNode &node) override;
|
||||
};
|
||||
|
||||
}; // namespace gd
|
@@ -1034,7 +1034,7 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
description.SetVariableType(variable.GetType());
|
||||
description.SetVariableScope(
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(variableName)
|
||||
.GetVariablesContainerFromVariableName(variableName)
|
||||
.GetSourceType());
|
||||
completions.push_back(description);
|
||||
|
||||
@@ -1086,7 +1086,7 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
description.SetVariableType(variable.GetType());
|
||||
description.SetVariableScope(
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(variableName)
|
||||
.GetVariablesContainerFromVariableName(variableName)
|
||||
.GetSourceType());
|
||||
completions.push_back(description);
|
||||
|
||||
|
@@ -460,12 +460,10 @@ const gd::String& ExpressionValidator::TypeToString(Type type) {
|
||||
case Type::NumberOrString:
|
||||
return numberOrStringTypeString;
|
||||
case Type::Variable:
|
||||
// This function is only used to display errors.
|
||||
// Users don't care if it's legacy or not or
|
||||
// if it allows properties and parameters.
|
||||
case Type::VariableOrProperty:
|
||||
case Type::VariableOrPropertyOrParameter:
|
||||
return variableTypeString;
|
||||
case Type::LegacyVariable:
|
||||
// This function is only used to display error.
|
||||
// Users don't care if it's legacy or not.
|
||||
return variableTypeString;
|
||||
case Type::Object:
|
||||
return objectTypeString;
|
||||
@@ -495,11 +493,8 @@ ExpressionValidator::Type ExpressionValidator::StringToType(
|
||||
ExpressionValidator::variableTypeString, type)) {
|
||||
if (gd::ValueTypeMetadata::IsTypeLegacyPreScopedVariable(type)) {
|
||||
return Type::LegacyVariable;
|
||||
} else if (type == "variableOrProperty") {
|
||||
return Type::VariableOrProperty;
|
||||
} else if (type == "variableOrPropertyOrParameter") {
|
||||
return Type::VariableOrPropertyOrParameter;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
return Type::Variable;
|
||||
}
|
||||
}
|
||||
|
@@ -203,12 +203,10 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
|
||||
void OnVisitVariableNode(VariableNode& node) override {
|
||||
ReportAnyError(node);
|
||||
|
||||
if (parentType == Type::Variable ||
|
||||
parentType == Type::VariableOrProperty ||
|
||||
parentType == Type::VariableOrPropertyOrParameter) {
|
||||
if (parentType == Type::Variable) {
|
||||
childType = parentType;
|
||||
|
||||
CheckVariableExistence(node.location, node.name, node.child != nullptr);
|
||||
CheckVariableExistence(node.location, node.name);
|
||||
if (node.child) {
|
||||
node.child->Visit(*this);
|
||||
}
|
||||
@@ -218,8 +216,7 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
|
||||
if (node.child) {
|
||||
node.child->Visit(*this);
|
||||
}
|
||||
} else if (parentType == Type::String || parentType == Type::Number ||
|
||||
parentType == Type::NumberOrString) {
|
||||
} else if (parentType == Type::String || parentType == Type::Number || parentType == Type::NumberOrString) {
|
||||
// The node represents a variable or an object variable in an expression waiting for its *value* to be returned.
|
||||
childType = parentType;
|
||||
|
||||
@@ -339,12 +336,11 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
|
||||
_("You must enter a number or a text, wrapped inside double quotes (example: \"Hello world\"), or a variable name."),
|
||||
node.location);
|
||||
}
|
||||
} else if (parentType == Type::Variable ||
|
||||
parentType == Type::VariableOrProperty ||
|
||||
parentType == Type::VariableOrPropertyOrParameter) {
|
||||
CheckVariableExistence(node.location, node.identifierName, !node.childIdentifierName.empty());
|
||||
} else if (parentType != Type::Object &&
|
||||
parentType != Type::LegacyVariable) {
|
||||
}
|
||||
else if (parentType == Type::Variable) {
|
||||
CheckVariableExistence(node.location, node.identifierName);
|
||||
}
|
||||
else if (parentType != Type::Object && parentType != Type::LegacyVariable) {
|
||||
// It can't happen.
|
||||
RaiseTypeError(
|
||||
_("You've entered a name, but this type was expected:") + " " + TypeToString(parentType),
|
||||
@@ -380,19 +376,8 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
|
||||
childType = Type::Empty;
|
||||
}
|
||||
|
||||
private:
|
||||
enum Type {
|
||||
Unknown = 0,
|
||||
Number,
|
||||
String,
|
||||
NumberOrString,
|
||||
Variable,
|
||||
LegacyVariable,
|
||||
Object,
|
||||
Empty,
|
||||
VariableOrProperty,
|
||||
VariableOrPropertyOrParameter
|
||||
};
|
||||
private:
|
||||
enum Type {Unknown = 0, Number, String, NumberOrString, Variable, LegacyVariable, Object, Empty};
|
||||
Type ValidateFunction(const gd::FunctionCallNode& function);
|
||||
bool ValidateObjectVariableOrVariableOrProperty(const gd::IdentifierNode& identifier);
|
||||
bool ValidateObjectVariableOrVariableOrProperty(
|
||||
@@ -401,10 +386,8 @@ private:
|
||||
const gd::String &childIdentifierName,
|
||||
const gd::ExpressionParserLocation childIdentifierNameLocation);
|
||||
|
||||
void CheckVariableExistence(const ExpressionParserLocation &location,
|
||||
const gd::String &name, bool hasChild) {
|
||||
if (!currentParameterExtraInfo ||
|
||||
*currentParameterExtraInfo != "AllowUndeclaredVariable") {
|
||||
void CheckVariableExistence(const ExpressionParserLocation &location, const gd::String& name) {
|
||||
if (!currentParameterExtraInfo || *currentParameterExtraInfo != "AllowUndeclaredVariable") {
|
||||
projectScopedContainers.MatchIdentifierWithName<void>(
|
||||
name,
|
||||
[&]() {
|
||||
@@ -419,28 +402,19 @@ private:
|
||||
},
|
||||
[&]() {
|
||||
// This is a property.
|
||||
if (parentType != Type::VariableOrProperty &&
|
||||
parentType != Type::VariableOrPropertyOrParameter) {
|
||||
RaiseVariableNameCollisionError(
|
||||
_("This variable has the same name as a property. Consider "
|
||||
"renaming one or the other."),
|
||||
location, name);
|
||||
} else if (hasChild) {
|
||||
RaiseMalformedVariableParameter(
|
||||
_("Properties can't have children."), location, name);
|
||||
}
|
||||
// This error won't happen unless the priority is changed.
|
||||
RaiseVariableNameCollisionError(
|
||||
_("This variable has the same name as a property. Consider "
|
||||
"renaming one or the other."),
|
||||
location, name);
|
||||
},
|
||||
[&]() {
|
||||
// This is a parameter.
|
||||
if (parentType != Type::VariableOrPropertyOrParameter) {
|
||||
RaiseVariableNameCollisionError(
|
||||
_("This variable has the same name as a parameter. Consider "
|
||||
"renaming one or the other."),
|
||||
location, name);
|
||||
} else if (hasChild) {
|
||||
RaiseMalformedVariableParameter(
|
||||
_("Properties can't have children."), location, name);
|
||||
}
|
||||
// This error won't happen unless the priority is changed.
|
||||
RaiseVariableNameCollisionError(
|
||||
_("This variable has the same name as a parameter. Consider "
|
||||
"renaming one or the other."),
|
||||
location, name);
|
||||
},
|
||||
[&]() {
|
||||
// This is something else.
|
||||
@@ -502,13 +476,6 @@ private:
|
||||
message, location, false, variableName, objectName);
|
||||
}
|
||||
|
||||
void RaiseMalformedVariableParameter(const gd::String &message,
|
||||
const ExpressionParserLocation &location,
|
||||
const gd::String &variableName) {
|
||||
RaiseError(gd::ExpressionParserError::ErrorType::MalformedVariableParameter,
|
||||
message, location, true, variableName, "");
|
||||
}
|
||||
|
||||
void RaiseTypeError(const gd::String &message,
|
||||
const ExpressionParserLocation &location,
|
||||
bool isFatal = true) {
|
||||
|
@@ -215,7 +215,7 @@ class GD_CORE_API ExpressionVariablePathFinder
|
||||
if (projectScopedContainers.GetVariablesContainersList().Has(identifier)) {
|
||||
variablesContainer =
|
||||
&(projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(identifier));
|
||||
.GetVariablesContainerFromVariableName(identifier));
|
||||
variableName = identifier;
|
||||
if (childIdentifier) {
|
||||
childVariableNames.push_back(*childIdentifier);
|
||||
@@ -223,28 +223,12 @@ class GD_CORE_API ExpressionVariablePathFinder
|
||||
}
|
||||
},
|
||||
[&]() {
|
||||
// This is a property.
|
||||
if (parameterType != "objectvar" &&
|
||||
projectScopedContainers.GetVariablesContainersList().Has(
|
||||
identifier)) {
|
||||
variablesContainer =
|
||||
&(projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(identifier));
|
||||
variableName = identifier;
|
||||
// There is no support for "children" of properties.
|
||||
}
|
||||
// Ignore properties here.
|
||||
// There is no support for "children" of properties.
|
||||
},
|
||||
[&]() {
|
||||
// This is a parameter.
|
||||
if (parameterType != "objectvar" &&
|
||||
projectScopedContainers.GetVariablesContainersList().Has(
|
||||
identifier)) {
|
||||
variablesContainer =
|
||||
&(projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName(identifier));
|
||||
variableName = identifier;
|
||||
// There is no support for "children" of parameters.
|
||||
}
|
||||
// Ignore parameters here.
|
||||
// There is no support for "children" of parameters.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore unrecognised identifiers here.
|
||||
|
@@ -9,10 +9,7 @@
|
||||
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
|
||||
#include "GDCore/Project/EventsBasedBehavior.h"
|
||||
#include "GDCore/Project/EventsBasedObject.h"
|
||||
#include "GDCore/Project/ObjectsContainer.h"
|
||||
#include "GDCore/Project/ParameterMetadataContainer.h"
|
||||
#include "GDCore/Project/PropertiesContainer.h"
|
||||
#include "GDCore/Project/VariablesContainer.h"
|
||||
//#include "GDCore/Project/ObjectsContainer.h"
|
||||
#include "GDCore/Project/EventsFunction.h"
|
||||
#include "GDCore/Project/Object.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
@@ -103,72 +100,4 @@ void EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
|
||||
}
|
||||
}
|
||||
|
||||
void EventsFunctionTools::ParametersToVariablesContainer(
|
||||
const ParameterMetadataContainer ¶meters,
|
||||
gd::VariablesContainer &outputVariablesContainer) {
|
||||
if (outputVariablesContainer.GetSourceType() !=
|
||||
gd::VariablesContainer::SourceType::Parameters) {
|
||||
throw std::logic_error("Tried to generate a variables container from "
|
||||
"parameters with the wrong source type.");
|
||||
}
|
||||
outputVariablesContainer.Clear();
|
||||
|
||||
gd::String lastObjectName;
|
||||
for (std::size_t i = 0; i < parameters.GetParametersCount(); ++i) {
|
||||
const auto ¶meter = parameters.GetParameter(i);
|
||||
if (parameter.GetName().empty())
|
||||
continue;
|
||||
|
||||
auto &valueTypeMetadata = parameter.GetValueTypeMetadata();
|
||||
if (valueTypeMetadata.IsNumber()) {
|
||||
auto &variable = outputVariablesContainer.InsertNew(
|
||||
parameter.GetName(), outputVariablesContainer.Count());
|
||||
variable.SetValue(0);
|
||||
} else if (valueTypeMetadata.IsString()) {
|
||||
auto &variable = outputVariablesContainer.InsertNew(
|
||||
parameter.GetName(), outputVariablesContainer.Count());
|
||||
variable.SetString("");
|
||||
} else if (valueTypeMetadata.IsBoolean()) {
|
||||
auto &variable = outputVariablesContainer.InsertNew(
|
||||
parameter.GetName(), outputVariablesContainer.Count());
|
||||
variable.SetBool(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EventsFunctionTools::PropertiesToVariablesContainer(
|
||||
const PropertiesContainer &properties,
|
||||
gd::VariablesContainer &outputVariablesContainer) {
|
||||
if (outputVariablesContainer.GetSourceType() !=
|
||||
gd::VariablesContainer::SourceType::Properties) {
|
||||
throw std::logic_error("Tried to generate a variables container from "
|
||||
"properties with the wrong source type.");
|
||||
}
|
||||
outputVariablesContainer.Clear();
|
||||
|
||||
gd::String lastObjectName;
|
||||
for (std::size_t i = 0; i < properties.GetCount(); ++i) {
|
||||
const auto &property = properties.Get(i);
|
||||
if (property.GetName().empty())
|
||||
continue;
|
||||
|
||||
auto &propertyType = gd::ValueTypeMetadata::GetPrimitiveValueType(
|
||||
gd::ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
property.GetType()));
|
||||
if (propertyType == "number") {
|
||||
auto &variable = outputVariablesContainer.InsertNew(
|
||||
property.GetName(), outputVariablesContainer.Count());
|
||||
variable.SetValue(0);
|
||||
} else if (propertyType == "string") {
|
||||
auto &variable = outputVariablesContainer.InsertNew(
|
||||
property.GetName(), outputVariablesContainer.Count());
|
||||
variable.SetString("");
|
||||
} else if (propertyType == "boolean") {
|
||||
auto &variable = outputVariablesContainer.InsertNew(
|
||||
property.GetName(), outputVariablesContainer.Count());
|
||||
variable.SetBool(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -12,9 +12,6 @@ namespace gd {
|
||||
class Project;
|
||||
class EventsFunctionsContainer;
|
||||
class ObjectsContainer;
|
||||
class ParameterMetadataContainer;
|
||||
class PropertiesContainer;
|
||||
class VariablesContainer;
|
||||
class ParameterMetadata;
|
||||
class EventsFunction;
|
||||
class EventsBasedBehavior;
|
||||
@@ -71,13 +68,5 @@ class GD_CORE_API EventsFunctionTools {
|
||||
const gd::EventsBasedObject& eventsBasedObject,
|
||||
const gd::EventsFunction& eventsFunction,
|
||||
gd::ObjectsContainer& outputObjectsContainer);
|
||||
|
||||
static void ParametersToVariablesContainer(
|
||||
const ParameterMetadataContainer ¶meters,
|
||||
gd::VariablesContainer &outputVariablesContainer);
|
||||
|
||||
static void PropertiesToVariablesContainer(
|
||||
const PropertiesContainer &properties,
|
||||
gd::VariablesContainer &outputVariablesContainer);
|
||||
};
|
||||
} // namespace gd
|
||||
|
@@ -3,10 +3,9 @@
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ObjectVariableHelper.h"
|
||||
#include "GroupVariableHelper.h"
|
||||
|
||||
#include "GDCore/IDE/WholeProjectRefactorer.h"
|
||||
#include "GDCore/Project/InitialInstancesContainer.h"
|
||||
#include "GDCore/Project/Object.h"
|
||||
#include "GDCore/Project/ObjectGroup.h"
|
||||
#include "GDCore/Project/ObjectsContainer.h"
|
||||
@@ -17,7 +16,7 @@
|
||||
|
||||
namespace gd {
|
||||
|
||||
void ObjectVariableHelper::FillAnyVariableBetweenObjects(
|
||||
void GroupVariableHelper::FillAnyVariableBetweenObjects(
|
||||
gd::ObjectsContainer &globalObjectsContainer,
|
||||
gd::ObjectsContainer &objectsContainer,
|
||||
const gd::ObjectGroup &objectGroup) {
|
||||
@@ -66,7 +65,7 @@ void ObjectVariableHelper::FillAnyVariableBetweenObjects(
|
||||
}
|
||||
}
|
||||
|
||||
gd::VariablesContainer ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::VariablesContainer GroupVariableHelper::MergeVariableContainers(
|
||||
const gd::ObjectsContainersList &objectsContainersList,
|
||||
const gd::ObjectGroup &objectGroup) {
|
||||
gd::VariablesContainer mergedVariablesContainer;
|
||||
@@ -114,7 +113,7 @@ gd::VariablesContainer ObjectVariableHelper::MergeVariableContainers(
|
||||
return mergedVariablesContainer;
|
||||
}
|
||||
|
||||
void ObjectVariableHelper::FillMissingGroupVariablesToObjects(
|
||||
void GroupVariableHelper::FillMissingGroupVariablesToObjects(
|
||||
gd::ObjectsContainer &globalObjectsContainer,
|
||||
gd::ObjectsContainer &objectsContainer, const gd::ObjectGroup &objectGroup,
|
||||
const gd::SerializerElement &originalSerializedVariables) {
|
||||
@@ -146,7 +145,7 @@ void ObjectVariableHelper::FillMissingGroupVariablesToObjects(
|
||||
// TODO Handle position changes for group variables.
|
||||
// We could try to change the order of object variables in a way that the next
|
||||
// call to MergeVariableContainers rebuild them in the same order.
|
||||
void ObjectVariableHelper::ApplyChangesToObjects(
|
||||
void GroupVariableHelper::ApplyChangesToObjects(
|
||||
gd::ObjectsContainer &globalObjectsContainer,
|
||||
gd::ObjectsContainer &objectsContainer,
|
||||
const gd::VariablesContainer &groupVariablesContainer,
|
||||
@@ -194,48 +193,4 @@ void ObjectVariableHelper::ApplyChangesToObjects(
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectVariableHelper::ApplyChangesToObjectInstances(
|
||||
gd::VariablesContainer &objectVariablesContainer,
|
||||
gd::InitialInstancesContainer &initialInstancesContainer,
|
||||
const gd::String &objectName, const gd::VariablesChangeset &changeset) {
|
||||
initialInstancesContainer.IterateOverInstances(
|
||||
[&objectVariablesContainer, &objectName,
|
||||
&changeset](gd::InitialInstance &instance) {
|
||||
if (instance.GetObjectName() == objectName) {
|
||||
auto &destinationVariablesContainer = instance.GetVariables();
|
||||
for (const gd::String &variableName :
|
||||
changeset.removedVariableNames) {
|
||||
destinationVariablesContainer.Remove(variableName);
|
||||
}
|
||||
for (const gd::String &variableName : changeset.addedVariableNames) {
|
||||
// Instance variables may already exist with another type.
|
||||
if (destinationVariablesContainer.Has(variableName) &&
|
||||
destinationVariablesContainer.Get(variableName).GetType() !=
|
||||
objectVariablesContainer.Get(variableName).GetType()) {
|
||||
destinationVariablesContainer.Remove(variableName);
|
||||
}
|
||||
}
|
||||
for (const auto &pair : changeset.oldToNewVariableNames) {
|
||||
const gd::String &oldVariableName = pair.first;
|
||||
const gd::String &newVariableName = pair.second;
|
||||
if (destinationVariablesContainer.Has(newVariableName)) {
|
||||
// It can happens if an instance already had the variable.
|
||||
destinationVariablesContainer.Remove(oldVariableName);
|
||||
} else {
|
||||
destinationVariablesContainer.Rename(oldVariableName,
|
||||
newVariableName);
|
||||
}
|
||||
}
|
||||
// Apply type changes
|
||||
for (const gd::String &variableName :
|
||||
changeset.valueChangedVariableNames) {
|
||||
if (destinationVariablesContainer.Has(variableName) &&
|
||||
destinationVariablesContainer.Get(variableName).GetType() !=
|
||||
objectVariablesContainer.Get(variableName).GetType()) {
|
||||
destinationVariablesContainer.Remove(variableName);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
} // namespace gd
|
@@ -8,7 +8,6 @@
|
||||
#include "GDCore/Project/VariablesContainer.h"
|
||||
|
||||
namespace gd {
|
||||
class InitialInstancesContainer;
|
||||
class ObjectsContainersList;
|
||||
class ObjectsContainer;
|
||||
class ObjectGroup;
|
||||
@@ -23,7 +22,7 @@ namespace gd {
|
||||
*
|
||||
* This is used by the object group variable editor.
|
||||
*/
|
||||
class GD_CORE_API ObjectVariableHelper {
|
||||
class GD_CORE_API GroupVariableHelper {
|
||||
public:
|
||||
/**
|
||||
* Copy every variable from every object of the group to the other objects
|
||||
@@ -71,17 +70,6 @@ public:
|
||||
const gd::VariablesContainer &groupVariablesContainer,
|
||||
const gd::ObjectGroup &objectGroup,
|
||||
const gd::VariablesChangeset &changeset);
|
||||
|
||||
static void ApplyChangesToObjectInstances(
|
||||
gd::VariablesContainer &objectVariablesContainer,
|
||||
gd::InitialInstancesContainer &initialInstancesContainer,
|
||||
const gd::String &objectName, const gd::VariablesChangeset &changeset);
|
||||
|
||||
private:
|
||||
static void ApplyChangesToVariableContainer(
|
||||
const gd::VariablesContainer &originalVariablesContainer,
|
||||
gd::VariablesContainer &destinationVariablesContainer,
|
||||
const gd::VariablesChangeset &changeset, bool shouldApplyValueChanges);
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
} // namespace gd
|
@@ -39,22 +39,6 @@ void ProjectBrowserHelper::ExposeProjectEvents(
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
// See also gd::ResourceExposer::ExposeWholeProjectResources
|
||||
// for a method that traverses the whole project (this time for resources)
|
||||
// and ExposeProjectEffects (this time for effects).
|
||||
|
||||
ExposeProjectEventsWithoutExtensions(project, worker);
|
||||
|
||||
// Add events based extensions
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(project, eventsFunctionsExtension, worker);
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(
|
||||
gd::Project& project, gd::ArbitraryEventsWorker& worker) {
|
||||
// Add layouts events
|
||||
@@ -67,28 +51,6 @@ void ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(
|
||||
gd::Project& project, gd::ArbitraryEventsWorkerWithContext& worker) {
|
||||
// Add layouts events
|
||||
for (std::size_t s = 0; s < project.GetLayoutsCount(); s++) {
|
||||
auto &layout = project.GetLayout(s);
|
||||
auto projectScopedContainers =
|
||||
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout);
|
||||
worker.Launch(layout.GetEvents(), projectScopedContainers);
|
||||
}
|
||||
// Add external events events
|
||||
for (std::size_t s = 0; s < project.GetExternalEventsCount(); s++) {
|
||||
const auto &externalEvents = project.GetExternalEvents(s);
|
||||
const gd::String &associatedLayout = externalEvents.GetAssociatedLayout();
|
||||
if (project.HasLayoutNamed(associatedLayout)) {
|
||||
auto &layout = project.GetLayout(associatedLayout);
|
||||
auto projectScopedContainers =
|
||||
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout);
|
||||
worker.Launch(project.GetExternalEvents(s).GetEvents(), projectScopedContainers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(
|
||||
gd::Project &project, gd::Layout &layout,
|
||||
gd::ArbitraryEventsWorker &worker) {
|
||||
@@ -149,12 +111,43 @@ void ProjectBrowserHelper::ExposeLayoutEventsAndDependencies(
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
// See also gd::ResourceExposer::ExposeWholeProjectResources
|
||||
// for a method that traverses the whole project (this time for resources)
|
||||
// and ExposeProjectEffects (this time for effects).
|
||||
|
||||
// Add layouts events
|
||||
for (std::size_t s = 0; s < project.GetLayoutsCount(); s++) {
|
||||
auto &layout = project.GetLayout(s);
|
||||
auto projectScopedContainers =
|
||||
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout);
|
||||
worker.Launch(layout.GetEvents(), projectScopedContainers);
|
||||
}
|
||||
// Add external events events
|
||||
for (std::size_t s = 0; s < project.GetExternalEventsCount(); s++) {
|
||||
const auto &externalEvents = project.GetExternalEvents(s);
|
||||
const gd::String &associatedLayout = externalEvents.GetAssociatedLayout();
|
||||
if (project.HasLayoutNamed(associatedLayout)) {
|
||||
auto &layout = project.GetLayout(associatedLayout);
|
||||
auto projectScopedContainers =
|
||||
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout);
|
||||
worker.Launch(project.GetExternalEvents(s).GetEvents(), projectScopedContainers);
|
||||
}
|
||||
}
|
||||
// Add events based extensions
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(project, eventsFunctionsExtension, worker);
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
|
||||
gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
gd::ArbitraryEventsWorker &worker) {
|
||||
// Add (free) events functions
|
||||
for (auto &&eventsFunction :
|
||||
eventsFunctionsExtension.GetEventsFunctions().GetInternalVector()) {
|
||||
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
|
||||
@@ -176,18 +169,13 @@ void ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
|
||||
gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
// Add (free) events functions
|
||||
for (auto &&eventsFunction :
|
||||
eventsFunctionsExtension.GetEventsFunctions().GetInternalVector()) {
|
||||
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
gd::ObjectsContainer parameterObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
gd::VariablesContainer propertyVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Properties);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsFunctionsExtension, *eventsFunction,
|
||||
parameterObjectsContainer, parameterVariablesContainer);
|
||||
parameterObjectsContainer);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(), projectScopedContainers);
|
||||
}
|
||||
@@ -219,32 +207,15 @@ void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
gd::VariablesContainer propertyVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Properties);
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
project, eventsFunctionsExtension,
|
||||
eventsBasedBehavior,
|
||||
propertyVariablesContainer,
|
||||
worker);
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::VariablesContainer &propertyVariablesContainer,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
auto &behaviorEventsFunctions = eventsBasedBehavior.GetEventsFunctions();
|
||||
for (auto &&eventsFunction : behaviorEventsFunctions.GetInternalVector()) {
|
||||
|
||||
gd::ObjectsContainer parameterObjectsContainers(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForBehaviorEventsFunction(
|
||||
project, eventsFunctionsExtension, eventsBasedBehavior,
|
||||
*eventsFunction, parameterObjectsContainers,
|
||||
parameterVariablesContainer, propertyVariablesContainer);
|
||||
*eventsFunction, parameterObjectsContainers);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(), projectScopedContainers);
|
||||
}
|
||||
@@ -264,31 +235,15 @@ void ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
gd::VariablesContainer propertyVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Properties);
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
|
||||
project, eventsFunctionsExtension, eventsBasedObject,
|
||||
propertyVariablesContainer, worker);
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
gd::VariablesContainer &propertyVariablesContainer,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
auto &objectEventsFunctions = eventsBasedObject.GetEventsFunctions();
|
||||
for (auto &&eventsFunction : objectEventsFunctions.GetInternalVector()) {
|
||||
|
||||
gd::ObjectsContainer parameterObjectsContainers(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForObjectEventsFunction(
|
||||
project, eventsFunctionsExtension, eventsBasedObject,
|
||||
*eventsFunction, parameterObjectsContainers,
|
||||
parameterVariablesContainer, propertyVariablesContainer);
|
||||
*eventsFunction, parameterObjectsContainers);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(), projectScopedContainers);
|
||||
}
|
||||
@@ -332,7 +287,7 @@ void ProjectBrowserHelper::ExposeProjectFunctions(
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
worker.Launch(eventsFunctionsExtension.GetEventsFunctions());
|
||||
worker.Launch(eventsFunctionsExtension);
|
||||
|
||||
for (auto &&eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
|
@@ -19,7 +19,6 @@ class ArbitraryEventsFunctionsWorker;
|
||||
class ArbitraryObjectsWorker;
|
||||
class ArbitraryEventBasedBehaviorsWorker;
|
||||
class ArbitraryBehaviorSharedDataWorker;
|
||||
class VariablesContainer;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
@@ -57,15 +56,6 @@ public:
|
||||
ExposeProjectEventsWithoutExtensions(gd::Project &project,
|
||||
gd::ArbitraryEventsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout and
|
||||
* external events) but not events from extensions.
|
||||
*
|
||||
* Only use this for stats.
|
||||
*/
|
||||
static void ExposeProjectEventsWithoutExtensions(
|
||||
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of a layout and
|
||||
* its external events.
|
||||
@@ -137,20 +127,6 @@ public:
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* behavior.
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an
|
||||
* event-based behavior.
|
||||
*/
|
||||
static void ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::VariablesContainer &propertyVariablesContainer,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* object.
|
||||
@@ -176,20 +152,6 @@ public:
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* object.
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an
|
||||
* event-based object.
|
||||
*/
|
||||
static void ExposeEventsBasedObjectEvents(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
gd::VariablesContainer &propertyVariablesContainer,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all ObjectContainers of the project
|
||||
* (global, layouts...)
|
||||
|
@@ -63,7 +63,7 @@ void GD_CORE_API ProjectStripper::StripProjectForExport(gd::Project &project) {
|
||||
eventsBasedObject.GetPropertyDescriptors().GetInternalVector().clear();
|
||||
}
|
||||
extension.GetEventsBasedBehaviors().Clear();
|
||||
extension.GetEventsFunctions().ClearEventsFunctions();
|
||||
extension.ClearEventsFunctions();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -42,9 +42,6 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
const gd::NamedPropertyDescriptor &property, const gd::String &objectType,
|
||||
bool isBehavior, bool isSharedProperties) {
|
||||
auto &propertyName = property.GetName();
|
||||
const auto &primitiveType = gd::ValueTypeMetadata::GetPrimitiveValueType(
|
||||
gd::ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
property.GetType()));
|
||||
auto &functionsContainer = eventsBasedEntity.GetEventsFunctions();
|
||||
gd::String capitalizedName = CapitalizeFirstLetter(property.GetName());
|
||||
gd::String setterName = "Set" + capitalizedName;
|
||||
@@ -62,9 +59,9 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
property.GetLabel().empty() ? property.GetName() : property.GetLabel();
|
||||
|
||||
gd::String descriptionSubject =
|
||||
(primitiveType == "boolean" ? "if " : "the ") +
|
||||
(property.GetType() == "Boolean" ? "if " : "the ") +
|
||||
UnCapitalizeFirstLetter(propertyLabel) +
|
||||
(isSharedProperties || primitiveType == "boolean"
|
||||
(isSharedProperties || property.GetType() == "Boolean"
|
||||
? "."
|
||||
: " of the object.") +
|
||||
(property.GetDescription().empty() ? ""
|
||||
@@ -74,7 +71,19 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
"objects using the behavior."
|
||||
: "");
|
||||
|
||||
gd::String propertyGetterName =
|
||||
(isSharedProperties ? "SharedProperty" : "Property") + property.GetName();
|
||||
gd::String getterType =
|
||||
gd::PlatformExtension::GetBehaviorEventsFunctionFullType(
|
||||
extension.GetName(), eventsBasedEntity.GetName(), propertyGetterName);
|
||||
gd::String setterType =
|
||||
gd::PlatformExtension::GetBehaviorEventsFunctionFullType(
|
||||
extension.GetName(), eventsBasedEntity.GetName(),
|
||||
"Set" + propertyGetterName);
|
||||
|
||||
gd::String getterName = capitalizedName;
|
||||
gd::String numberOrString =
|
||||
property.GetType() == "Number" ? "Number" : "String";
|
||||
|
||||
if (!functionsContainer.HasEventsFunctionNamed(getterName)) {
|
||||
auto &getter = functionsContainer.InsertNewEventsFunction(
|
||||
@@ -90,7 +99,7 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
.SetName(legacyExpressionType)
|
||||
.SetExtraInfo(GetStringifiedExtraInfo(property));
|
||||
getter.SetFullName(propertyLabel).SetGroup(functionGroupName);
|
||||
if (primitiveType == "boolean") {
|
||||
if (property.GetType() == "Boolean") {
|
||||
getter.SetFunctionType(gd::EventsFunction::Condition)
|
||||
.SetDescription("Check " + descriptionSubject)
|
||||
.SetSentence("_PARAM0_ " + UnCapitalizeFirstLetter(propertyLabel));
|
||||
@@ -103,12 +112,13 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
auto &event =
|
||||
dynamic_cast<gd::StandardEvent &>(getter.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Standard", 0));
|
||||
if (primitiveType == "boolean") {
|
||||
if (property.GetType() == "Boolean") {
|
||||
gd::Instruction condition;
|
||||
condition.SetType("BooleanVariable");
|
||||
condition.AddParameter(propertyName);
|
||||
condition.AddParameter("True");
|
||||
condition.AddParameter("");
|
||||
condition.SetType(getterType);
|
||||
condition.AddParameter("Object");
|
||||
if (isBehavior) {
|
||||
condition.AddParameter("Behavior");
|
||||
}
|
||||
event.GetConditions().Insert(condition, 0);
|
||||
|
||||
gd::Instruction action;
|
||||
@@ -117,8 +127,6 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
event.GetActions().Insert(action, 0);
|
||||
} else {
|
||||
gd::Instruction action;
|
||||
gd::String numberOrString =
|
||||
primitiveType == "number" ? "Number" : "String";
|
||||
action.SetType("SetReturn" + numberOrString);
|
||||
action.AddParameter(property.GetName());
|
||||
event.GetActions().Insert(action, 0);
|
||||
@@ -128,7 +136,7 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
if (!functionsContainer.HasEventsFunctionNamed(setterName)) {
|
||||
auto &setter = functionsContainer.InsertNewEventsFunction(
|
||||
setterName, functionsContainer.GetEventsFunctionsCount());
|
||||
if (primitiveType == "boolean") {
|
||||
if (property.GetType() == "Boolean") {
|
||||
setter.SetFunctionType(gd::EventsFunction::Action)
|
||||
.SetFullName(propertyLabel)
|
||||
.SetGroup(functionGroupName)
|
||||
@@ -169,24 +177,26 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
setter.SetGetterName(getterName);
|
||||
}
|
||||
|
||||
if (primitiveType == "boolean") {
|
||||
if (property.GetType() == "Boolean") {
|
||||
{
|
||||
auto &event =
|
||||
dynamic_cast<gd::StandardEvent &>(setter.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Standard", 0));
|
||||
|
||||
gd::Instruction condition;
|
||||
condition.SetType("BooleanVariable");
|
||||
condition.AddParameter("Value");
|
||||
condition.AddParameter("True");
|
||||
condition.AddParameter("");
|
||||
condition.SetType("GetArgumentAsBoolean");
|
||||
condition.AddParameter("\"Value\"");
|
||||
event.GetConditions().Insert(condition, 0);
|
||||
|
||||
gd::Instruction action;
|
||||
action.SetType("SetBooleanVariable");
|
||||
action.AddParameter(propertyName);
|
||||
action.AddParameter("True");
|
||||
action.AddParameter("");
|
||||
action.SetType(setterType);
|
||||
action.AddParameter("Object");
|
||||
if (isBehavior) {
|
||||
action.AddParameter("Behavior");
|
||||
action.AddParameter("yes");
|
||||
} else {
|
||||
action.AddParameter("yes");
|
||||
}
|
||||
event.GetActions().Insert(action, 0);
|
||||
}
|
||||
{
|
||||
@@ -195,17 +205,20 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
project, "BuiltinCommonInstructions::Standard", 0));
|
||||
|
||||
gd::Instruction condition;
|
||||
condition.SetType("BooleanVariable");
|
||||
condition.AddParameter("Value");
|
||||
condition.AddParameter("False");
|
||||
condition.AddParameter("");
|
||||
condition.SetType("GetArgumentAsBoolean");
|
||||
condition.AddParameter("\"Value\"");
|
||||
condition.SetInverted(true);
|
||||
event.GetConditions().Insert(condition, 0);
|
||||
|
||||
gd::Instruction action;
|
||||
action.SetType("SetBooleanVariable");
|
||||
action.AddParameter(propertyName);
|
||||
action.AddParameter("False");
|
||||
action.AddParameter("");
|
||||
action.SetType(setterType);
|
||||
action.AddParameter("Object");
|
||||
if (isBehavior) {
|
||||
action.AddParameter("Behavior");
|
||||
action.AddParameter("no");
|
||||
} else {
|
||||
action.AddParameter("no");
|
||||
}
|
||||
event.GetActions().Insert(action, 0);
|
||||
}
|
||||
} else {
|
||||
@@ -214,11 +227,16 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
project, "BuiltinCommonInstructions::Standard", 0));
|
||||
|
||||
gd::Instruction action;
|
||||
action.SetType(primitiveType == "number" ? "SetNumberVariable"
|
||||
: "SetStringVariable");
|
||||
action.AddParameter(propertyName);
|
||||
action.AddParameter("=");
|
||||
action.AddParameter("Value");
|
||||
action.SetType(setterType);
|
||||
action.AddParameter("Object");
|
||||
if (isBehavior) {
|
||||
action.AddParameter("Behavior");
|
||||
action.AddParameter("=");
|
||||
action.AddParameter("Value");
|
||||
} else {
|
||||
action.AddParameter("=");
|
||||
action.AddParameter("Value");
|
||||
}
|
||||
event.GetActions().Insert(action, 0);
|
||||
}
|
||||
}
|
||||
@@ -227,11 +245,9 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
bool PropertyFunctionGenerator::CanGenerateGetterAndSetter(
|
||||
const gd::AbstractEventsBasedEntity &eventsBasedEntity,
|
||||
const gd::NamedPropertyDescriptor &property) {
|
||||
const auto &primitiveType = gd::ValueTypeMetadata::GetPrimitiveValueType(
|
||||
gd::ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
property.GetType()));
|
||||
if (primitiveType != "boolean" && primitiveType != "number" &&
|
||||
primitiveType != "string") {
|
||||
auto &type = property.GetType();
|
||||
if (type != "Boolean" && type != "Number" && type != "String" &&
|
||||
type != "Choice" && type != "Color" && type != "LeaderboardId") {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@@ -3,7 +3,8 @@
|
||||
* Copyright 2008-2022 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef GDCORE_PROPERTYFUNCTIONGENERATOR_H
|
||||
#define GDCORE_PROPERTYFUNCTIONGENERATOR_H
|
||||
|
||||
namespace gd {
|
||||
class String;
|
||||
@@ -72,3 +73,5 @@ class GD_CORE_API PropertyFunctionGenerator {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // GDCORE_PROPERTYFUNCTIONGENERATOR_H
|
||||
|
@@ -11,7 +11,7 @@
|
||||
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/IDE/DependenciesAnalyzer.h"
|
||||
#include "GDCore/IDE/ObjectVariableHelper.h"
|
||||
#include "GDCore/IDE/GroupVariableHelper.h"
|
||||
#include "GDCore/IDE/EventBasedBehaviorBrowser.h"
|
||||
#include "GDCore/IDE/EventBasedObjectBrowser.h"
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
@@ -314,16 +314,9 @@ void WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
variablesContainer.SerializeTo(editedSerializedVariables);
|
||||
variablesContainer.UnserializeFrom(originalSerializedVariables);
|
||||
|
||||
// Rename variables
|
||||
// Pass an empty set to avoid deletion of actions/conditions or events using
|
||||
// them.
|
||||
// While we support refactoring that would remove all references (actions,
|
||||
// conditions...) it's both a bit dangerous for the user and we would need to
|
||||
// show the user what will be removed before doing so. For now, just clear the
|
||||
// removed variables so they don't trigger any refactoring.
|
||||
std::unordered_set<gd::String> removedVariableNames;
|
||||
// Rename and remove variables
|
||||
gd::EventsVariableReplacer eventsVariableReplacer(
|
||||
project.GetCurrentPlatform(), changeset, removedVariableNames,
|
||||
project.GetCurrentPlatform(), changeset, changeset.removedVariableNames,
|
||||
variablesContainer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project,
|
||||
eventsVariableReplacer);
|
||||
@@ -340,25 +333,9 @@ void WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, eventsVariableInstructionTypeSwitcher);
|
||||
}
|
||||
|
||||
// TODO Apply the refactor to external layouts.
|
||||
void WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
gd::Project &project, gd::VariablesContainer &objectVariablesContainer,
|
||||
gd::InitialInstancesContainer &initialInstancesContainer,
|
||||
const gd::String &objectName, const gd::VariablesChangeset &changeset,
|
||||
const gd::SerializerElement &originalSerializedVariables) {
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, objectVariablesContainer, changeset,
|
||||
originalSerializedVariables);
|
||||
|
||||
gd::ObjectVariableHelper::ApplyChangesToObjectInstances(
|
||||
objectVariablesContainer, initialInstancesContainer, objectName,
|
||||
changeset);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
gd::Project &project, gd::ObjectsContainer &globalObjectsContainer,
|
||||
gd::ObjectsContainer &objectsContainer,
|
||||
gd::InitialInstancesContainer &initialInstancesContainer,
|
||||
const gd::VariablesContainer &groupVariablesContainer,
|
||||
const gd::ObjectGroup &objectGroup,
|
||||
const gd::VariablesChangeset &changeset,
|
||||
@@ -378,15 +355,11 @@ void WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
}
|
||||
auto &object = hasObject ? objectsContainer.GetObject(objectName)
|
||||
: globalObjectsContainer.GetObject(objectName);
|
||||
auto &objectVariablesContainer = object.GetVariables();
|
||||
|
||||
gd::ObjectVariableHelper::ApplyChangesToObjectInstances(
|
||||
objectVariablesContainer, initialInstancesContainer, objectName,
|
||||
changeset);
|
||||
auto &variablesContainer = object.GetVariables();
|
||||
|
||||
gd::EventsVariableReplacer eventsVariableReplacer(
|
||||
project.GetCurrentPlatform(), changeset,
|
||||
removedVariableNames, objectVariablesContainer);
|
||||
removedVariableNames, variablesContainer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project,
|
||||
eventsVariableReplacer);
|
||||
}
|
||||
@@ -399,12 +372,12 @@ void WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
eventsVariableReplacer);
|
||||
|
||||
// Apply changes to objects.
|
||||
gd::ObjectVariableHelper::FillMissingGroupVariablesToObjects(
|
||||
gd::GroupVariableHelper::FillMissingGroupVariablesToObjects(
|
||||
globalObjectsContainer,
|
||||
objectsContainer,
|
||||
objectGroup,
|
||||
originalSerializedVariables);
|
||||
gd::ObjectVariableHelper::ApplyChangesToObjects(
|
||||
gd::GroupVariableHelper::ApplyChangesToObjects(
|
||||
globalObjectsContainer, objectsContainer, groupVariablesContainer,
|
||||
objectGroup, changeset);
|
||||
|
||||
@@ -627,8 +600,7 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
// instructions after they are renamed.
|
||||
|
||||
// Free expressions
|
||||
for (auto &&eventsFunction :
|
||||
eventsFunctionsExtension.GetEventsFunctions().GetInternalVector()) {
|
||||
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
if (eventsFunction->IsExpression()) {
|
||||
renameEventsFunction(*eventsFunction);
|
||||
}
|
||||
@@ -645,8 +617,7 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
}
|
||||
|
||||
// Free instructions
|
||||
for (auto &&eventsFunction :
|
||||
eventsFunctionsExtension.GetEventsFunctions().GetInternalVector()) {
|
||||
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
if (eventsFunction->IsAction() || eventsFunction->IsCondition()) {
|
||||
renameEventsFunction(*eventsFunction);
|
||||
}
|
||||
@@ -726,12 +697,11 @@ void WholeProjectRefactorer::RenameEventsFunction(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::String &oldFunctionName, const gd::String &newFunctionName) {
|
||||
const auto &eventsFunctions = eventsFunctionsExtension.GetEventsFunctions();
|
||||
if (!eventsFunctions.HasEventsFunctionNamed(oldFunctionName))
|
||||
if (!eventsFunctionsExtension.HasEventsFunctionNamed(oldFunctionName))
|
||||
return;
|
||||
|
||||
const gd::EventsFunction &eventsFunction =
|
||||
eventsFunctions.GetEventsFunction(oldFunctionName);
|
||||
eventsFunctionsExtension.GetEventsFunction(oldFunctionName);
|
||||
|
||||
const WholeProjectBrowser wholeProjectExposer;
|
||||
DoRenameEventsFunction(
|
||||
@@ -744,7 +714,7 @@ void WholeProjectRefactorer::RenameEventsFunction(
|
||||
|
||||
if (eventsFunction.GetFunctionType() ==
|
||||
gd::EventsFunction::ExpressionAndCondition) {
|
||||
for (auto &&otherFunction : eventsFunctions.GetInternalVector()) {
|
||||
for (auto &&otherFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
if (otherFunction->GetFunctionType() ==
|
||||
gd::EventsFunction::ActionWithOperator &&
|
||||
otherFunction->GetGetterName() == oldFunctionName) {
|
||||
@@ -892,34 +862,16 @@ void WholeProjectRefactorer::RenameParameter(
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ChangeParameterType(
|
||||
gd::Project &project, gd::ProjectScopedContainers &projectScopedContainers,
|
||||
gd::EventsFunction &eventsFunction,
|
||||
const gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
const gd::String ¶meterName) {
|
||||
std::unordered_set<gd::String> typeChangedPropertyNames;
|
||||
typeChangedPropertyNames.insert(parameterName);
|
||||
gd::VariablesContainer propertyVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Properties);
|
||||
gd::EventsVariableInstructionTypeSwitcher
|
||||
eventsVariableInstructionTypeSwitcher(project.GetCurrentPlatform(),
|
||||
typeChangedPropertyNames,
|
||||
propertyVariablesContainer);
|
||||
eventsVariableInstructionTypeSwitcher.Launch(eventsFunction.GetEvents(),
|
||||
projectScopedContainers);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::MoveEventsFunctionParameter(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::String &functionName, std::size_t oldIndex,
|
||||
std::size_t newIndex) {
|
||||
const auto &eventsFunctions = eventsFunctionsExtension.GetEventsFunctions();
|
||||
if (!eventsFunctions.HasEventsFunctionNamed(functionName))
|
||||
if (!eventsFunctionsExtension.HasEventsFunctionNamed(functionName))
|
||||
return;
|
||||
|
||||
const gd::EventsFunction &eventsFunction =
|
||||
eventsFunctions.GetEventsFunction(functionName);
|
||||
eventsFunctionsExtension.GetEventsFunction(functionName);
|
||||
|
||||
const gd::String &eventsFunctionType =
|
||||
gd::PlatformExtension::GetEventsFunctionFullType(
|
||||
@@ -1223,42 +1175,6 @@ void WholeProjectRefactorer::RenameEventsBasedObjectProperty(
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ChangeEventsBasedBehaviorPropertyType(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::String &propertyName) {
|
||||
std::unordered_set<gd::String> typeChangedPropertyNames;
|
||||
typeChangedPropertyNames.insert(propertyName);
|
||||
gd::VariablesContainer propertyVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Properties);
|
||||
gd::EventsVariableInstructionTypeSwitcher
|
||||
eventsVariableInstructionTypeSwitcher(project.GetCurrentPlatform(),
|
||||
typeChangedPropertyNames,
|
||||
propertyVariablesContainer);
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
project, eventsFunctionsExtension, eventsBasedBehavior,
|
||||
propertyVariablesContainer, eventsVariableInstructionTypeSwitcher);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ChangeEventsBasedObjectPropertyType(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::String &propertyName) {
|
||||
std::unordered_set<gd::String> typeChangedPropertyNames;
|
||||
typeChangedPropertyNames.insert(propertyName);
|
||||
gd::VariablesContainer propertyVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Properties);
|
||||
gd::EventsVariableInstructionTypeSwitcher
|
||||
eventsVariableInstructionTypeSwitcher(project.GetCurrentPlatform(),
|
||||
typeChangedPropertyNames,
|
||||
propertyVariablesContainer);
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
|
||||
project, eventsFunctionsExtension, eventsBasedObject,
|
||||
propertyVariablesContainer, eventsVariableInstructionTypeSwitcher);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::AddBehaviorAndRequiredBehaviors(
|
||||
gd::Project &project, gd::Object &object, const gd::String &behaviorType,
|
||||
const gd::String &behaviorName) {
|
||||
|
@@ -32,7 +32,6 @@ class UnfilledRequiredBehaviorPropertyProblem;
|
||||
class ProjectBrowser;
|
||||
class SerializerElement;
|
||||
class ProjectScopedContainers;
|
||||
class InitialInstancesContainer;
|
||||
struct VariablesRenamingChangesetNode;
|
||||
} // namespace gd
|
||||
|
||||
@@ -81,23 +80,13 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
|
||||
/**
|
||||
* \brief Refactor the project according to the changes (renaming or deletion)
|
||||
* made to global or scene variables.
|
||||
* made to variables.
|
||||
*/
|
||||
static void ApplyRefactoringForVariablesContainer(
|
||||
gd::Project &project, gd::VariablesContainer &variablesContainer,
|
||||
const gd::VariablesChangeset &changeset,
|
||||
const gd::SerializerElement &originalSerializedVariables);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project according to the changes (renaming or deletion)
|
||||
* made to object variables.
|
||||
*/
|
||||
static void ApplyRefactoringForObjectVariablesContainer(
|
||||
gd::Project &project, gd::VariablesContainer &objectVariablesContainer,
|
||||
gd::InitialInstancesContainer &initialInstancesContainer,
|
||||
const gd::String &objectName, const gd::VariablesChangeset &changeset,
|
||||
const gd::SerializerElement &originalSerializedVariables);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project according to the changes (renaming or deletion)
|
||||
* made to variables of a group.
|
||||
@@ -105,7 +94,6 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
static void ApplyRefactoringForGroupVariablesContainer(
|
||||
gd::Project &project, gd::ObjectsContainer &globalObjectsContainer,
|
||||
gd::ObjectsContainer &objectsContainer,
|
||||
gd::InitialInstancesContainer &initialInstancesContainer,
|
||||
const gd::VariablesContainer &groupVariablesContainer,
|
||||
const gd::ObjectGroup &objectGroup,
|
||||
const gd::VariablesChangeset &changeset,
|
||||
@@ -203,16 +191,6 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
const gd::String &oldParameterName,
|
||||
const gd::String &newParameterName);
|
||||
|
||||
/**
|
||||
* \brief Refactor the function **after** a parameter has changed of type.
|
||||
*/
|
||||
static void
|
||||
ChangeParameterType(gd::Project &project,
|
||||
gd::ProjectScopedContainers &projectScopedContainers,
|
||||
gd::EventsFunction &eventsFunction,
|
||||
const gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
const gd::String ¶meterName);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project **before** an events function parameter
|
||||
* is moved.
|
||||
@@ -305,26 +283,6 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
const gd::String& oldPropertyName,
|
||||
const gd::String& newPropertyName);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project **after** a property of a behavior has
|
||||
* changed of type.
|
||||
*/
|
||||
static void ChangeEventsBasedBehaviorPropertyType(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::String &propertyName);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project **after** a property of an object has
|
||||
* changed of type.
|
||||
*/
|
||||
static void ChangeEventsBasedObjectPropertyType(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::String &propertyName);
|
||||
|
||||
/**
|
||||
* \brief Add a behavior to an object and add required behaviors if necessary
|
||||
* to fill every behavior properties of the added behaviors.
|
||||
|
@@ -22,17 +22,15 @@ void CustomConfigurationHelper::InitializeContent(
|
||||
gd::SerializerElement &configurationContent) {
|
||||
for (auto &&property : properties.GetInternalVector()) {
|
||||
auto &element = configurationContent.AddChild(property->GetName());
|
||||
auto propertyType = property->GetType();
|
||||
|
||||
const auto &valueType =
|
||||
gd::ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
property->GetType());
|
||||
const auto &primitiveType =
|
||||
gd::ValueTypeMetadata::GetPrimitiveValueType(valueType);
|
||||
if (primitiveType == "string" || valueType == "behavior") {
|
||||
if (propertyType == "String" || propertyType == "Choice" ||
|
||||
propertyType == "Color" || propertyType == "Behavior" ||
|
||||
propertyType == "Resource" || propertyType == "LeaderboardId") {
|
||||
element.SetStringValue(property->GetValue());
|
||||
} else if (primitiveType == "number") {
|
||||
} else if (propertyType == "Number") {
|
||||
element.SetDoubleValue(property->GetValue().To<double>());
|
||||
} else if (primitiveType == "boolean") {
|
||||
} else if (propertyType == "Boolean") {
|
||||
element.SetBoolValue(property->GetValue() == "true");
|
||||
}
|
||||
}
|
||||
@@ -45,25 +43,23 @@ std::map<gd::String, gd::PropertyDescriptor> CustomConfigurationHelper::GetPrope
|
||||
|
||||
for (auto &property : properties.GetInternalVector()) {
|
||||
const auto &propertyName = property->GetName();
|
||||
const auto &propertyType = property->GetType();
|
||||
|
||||
// Copy the property
|
||||
objectProperties[propertyName] = *property;
|
||||
|
||||
auto &newProperty = objectProperties[propertyName];
|
||||
|
||||
const auto &valueType =
|
||||
gd::ValueTypeMetadata::ConvertPropertyTypeToValueType(
|
||||
property->GetType());
|
||||
const auto &primitiveType =
|
||||
gd::ValueTypeMetadata::GetPrimitiveValueType(valueType);
|
||||
if (configurationContent.HasChild(propertyName)) {
|
||||
if (primitiveType == "string" || valueType == "behavior") {
|
||||
if (propertyType == "String" || propertyType == "Choice" ||
|
||||
propertyType == "Color" || propertyType == "Behavior" ||
|
||||
propertyType == "Resource" || propertyType == "LeaderboardId") {
|
||||
newProperty.SetValue(
|
||||
configurationContent.GetChild(propertyName).GetStringValue());
|
||||
} else if (primitiveType == "number") {
|
||||
} else if (propertyType == "Number") {
|
||||
newProperty.SetValue(gd::String::From(
|
||||
configurationContent.GetChild(propertyName).GetDoubleValue()));
|
||||
} else if (primitiveType == "boolean") {
|
||||
} else if (propertyType == "Boolean") {
|
||||
newProperty.SetValue(
|
||||
configurationContent.GetChild(propertyName).GetBoolValue()
|
||||
? "true"
|
||||
@@ -89,16 +85,15 @@ bool CustomConfigurationHelper::UpdateProperty(
|
||||
const auto &property = properties.Get(propertyName);
|
||||
|
||||
auto &element = configurationContent.AddChild(propertyName);
|
||||
const gd::String &propertyType = property.GetType();
|
||||
|
||||
const auto &valueType =
|
||||
gd::ValueTypeMetadata::ConvertPropertyTypeToValueType(property.GetType());
|
||||
const auto &primitiveType =
|
||||
gd::ValueTypeMetadata::GetPrimitiveValueType(valueType);
|
||||
if (primitiveType == "string" || valueType == "behavior") {
|
||||
if (propertyType == "String" || propertyType == "Choice" ||
|
||||
propertyType == "Color" || propertyType == "Behavior" ||
|
||||
propertyType == "Resource" || propertyType == "LeaderboardId") {
|
||||
element.SetStringValue(newValue);
|
||||
} else if (primitiveType == "number") {
|
||||
} else if (propertyType == "Number") {
|
||||
element.SetDoubleValue(newValue.To<double>());
|
||||
} else if (primitiveType == "boolean") {
|
||||
} else if (propertyType == "Boolean") {
|
||||
element.SetBoolValue(newValue == "1");
|
||||
}
|
||||
|
||||
|
@@ -33,20 +33,6 @@ public:
|
||||
|
||||
EventsFunctionsContainer(FunctionOwner source_) : owner(source_) {}
|
||||
|
||||
EventsFunctionsContainer(const EventsFunctionsContainer &other)
|
||||
: owner(other.owner) {
|
||||
Init(other);
|
||||
}
|
||||
|
||||
EventsFunctionsContainer &operator=(const EventsFunctionsContainer &other) {
|
||||
if (this != &other) {
|
||||
owner = other.owner;
|
||||
Init(other);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the source of the function container.
|
||||
*
|
||||
|
@@ -15,13 +15,14 @@
|
||||
namespace gd {
|
||||
|
||||
EventsFunctionsExtension::EventsFunctionsExtension() :
|
||||
eventsFunctionsContainer(gd::EventsFunctionsContainer::FunctionOwner::Extension),
|
||||
gd::EventsFunctionsContainer(
|
||||
gd::EventsFunctionsContainer::FunctionOwner::Extension),
|
||||
globalVariables(gd::VariablesContainer::SourceType::ExtensionGlobal),
|
||||
sceneVariables(gd::VariablesContainer::SourceType::ExtensionScene) {}
|
||||
|
||||
EventsFunctionsExtension::EventsFunctionsExtension(
|
||||
const EventsFunctionsExtension& other) :
|
||||
eventsFunctionsContainer(
|
||||
gd::EventsFunctionsContainer(
|
||||
gd::EventsFunctionsContainer::FunctionOwner::Extension) {
|
||||
Init(other);
|
||||
}
|
||||
@@ -47,8 +48,7 @@ void EventsFunctionsExtension::Init(const gd::EventsFunctionsExtension& other) {
|
||||
previewIconUrl = other.previewIconUrl;
|
||||
iconUrl = other.iconUrl;
|
||||
helpPath = other.helpPath;
|
||||
gdevelopVersion = other.gdevelopVersion;
|
||||
eventsFunctionsContainer = other.eventsFunctionsContainer;
|
||||
EventsFunctionsContainer::Init(other);
|
||||
eventsBasedBehaviors = other.eventsBasedBehaviors;
|
||||
eventsBasedObjects = other.eventsBasedObjects;
|
||||
globalVariables = other.GetGlobalVariables();
|
||||
@@ -82,7 +82,6 @@ void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
|
||||
element.SetAttribute("previewIconUrl", previewIconUrl);
|
||||
element.SetAttribute("iconUrl", iconUrl);
|
||||
element.SetAttribute("helpPath", helpPath);
|
||||
element.SetAttribute("gdevelopVersion", gdevelopVersion);
|
||||
auto& dependenciesElement = element.AddChild("dependencies");
|
||||
dependenciesElement.ConsiderAsArray();
|
||||
for (auto& dependency : dependencies)
|
||||
@@ -98,8 +97,7 @@ void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
|
||||
GetGlobalVariables().SerializeTo(element.AddChild("globalVariables"));
|
||||
GetSceneVariables().SerializeTo(element.AddChild("sceneVariables"));
|
||||
|
||||
eventsFunctionsContainer.SerializeEventsFunctionsTo(
|
||||
element.AddChild("eventsFunctions"));
|
||||
SerializeEventsFunctionsTo(element.AddChild("eventsFunctions"));
|
||||
eventsBasedBehaviors.SerializeElementsTo(
|
||||
"eventsBasedBehavior", element.AddChild("eventsBasedBehaviors"));
|
||||
eventsBasedObjects.SerializeElementsTo(
|
||||
@@ -128,7 +126,6 @@ void EventsFunctionsExtension::UnserializeExtensionDeclarationFrom(
|
||||
previewIconUrl = element.GetStringAttribute("previewIconUrl");
|
||||
iconUrl = element.GetStringAttribute("iconUrl");
|
||||
helpPath = element.GetStringAttribute("helpPath");
|
||||
gdevelopVersion = element.GetStringAttribute("gdevelopVersion");
|
||||
|
||||
if (element.HasChild("origin")) {
|
||||
gd::String originName =
|
||||
@@ -208,8 +205,7 @@ void EventsFunctionsExtension::UnserializeExtensionDeclarationFrom(
|
||||
void EventsFunctionsExtension::UnserializeExtensionImplementationFrom(
|
||||
gd::Project& project,
|
||||
const SerializerElement& element) {
|
||||
eventsFunctionsContainer.UnserializeEventsFunctionsFrom(
|
||||
project, element.GetChild("eventsFunctions"));
|
||||
UnserializeEventsFunctionsFrom(project, element.GetChild("eventsFunctions"));
|
||||
eventsBasedBehaviors.UnserializeElementsFrom(
|
||||
"eventsBasedBehavior", project, element.GetChild("eventsBasedBehaviors"));
|
||||
|
||||
|
@@ -36,7 +36,7 @@ namespace gd {
|
||||
*
|
||||
* \ingroup PlatformDefinition
|
||||
*/
|
||||
class GD_CORE_API EventsFunctionsExtension {
|
||||
class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
|
||||
public:
|
||||
EventsFunctionsExtension();
|
||||
EventsFunctionsExtension(const EventsFunctionsExtension&);
|
||||
@@ -134,19 +134,6 @@ class GD_CORE_API EventsFunctionsExtension {
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the GDevelop version required by this extension.
|
||||
*/
|
||||
const gd::String& GetGDevelopVersion() const { return gdevelopVersion; };
|
||||
|
||||
/**
|
||||
* \brief Set the GDevelop version required by this extension.
|
||||
*/
|
||||
EventsFunctionsExtension& SetGDevelopVersion(const gd::String& gdevelopVersion_) {
|
||||
gdevelopVersion = gdevelopVersion_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return a reference to the list of the events based behaviors.
|
||||
*/
|
||||
@@ -194,21 +181,6 @@ class GD_CORE_API EventsFunctionsExtension {
|
||||
return originIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return a reference to the functions of the events based behavior or object.
|
||||
*/
|
||||
EventsFunctionsContainer& GetEventsFunctions() {
|
||||
return eventsFunctionsContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return a const reference to the functions of the events based
|
||||
* behavior or object.
|
||||
*/
|
||||
const EventsFunctionsContainer& GetEventsFunctions() const {
|
||||
return eventsFunctionsContainer;
|
||||
}
|
||||
|
||||
/** \name Dependencies
|
||||
*/
|
||||
///@{
|
||||
@@ -398,13 +370,11 @@ class GD_CORE_API EventsFunctionsExtension {
|
||||
gd::String iconUrl;
|
||||
gd::String helpPath; ///< The relative path to the help for this extension in
|
||||
///< the documentation (or an absolute URL).
|
||||
gd::String gdevelopVersion;
|
||||
gd::SerializableWithNameList<EventsBasedBehavior> eventsBasedBehaviors;
|
||||
gd::SerializableWithNameList<EventsBasedObject> eventsBasedObjects;
|
||||
std::vector<gd::DependencyMetadata> dependencies;
|
||||
std::vector<gd::SourceFileMetadata> sourceFiles;
|
||||
|
||||
gd::EventsFunctionsContainer eventsFunctionsContainer;
|
||||
gd::VariablesContainer globalVariables;
|
||||
gd::VariablesContainer sceneVariables;
|
||||
};
|
||||
|
@@ -41,11 +41,6 @@ void InitialInstancesContainer::IterateOverInstances(
|
||||
for (auto& instance : initialInstances) func(instance);
|
||||
}
|
||||
|
||||
void InitialInstancesContainer::IterateOverInstances(
|
||||
const std::function< void(gd::InitialInstance &) >& func) {
|
||||
for (auto& instance : initialInstances) func(instance);
|
||||
}
|
||||
|
||||
void InitialInstancesContainer::IterateOverInstancesWithZOrdering(
|
||||
gd::InitialInstanceFunctor& func, const gd::String& layerName) {
|
||||
std::vector<std::reference_wrapper<gd::InitialInstance>> sortedInstances;
|
||||
|
@@ -87,13 +87,6 @@ class GD_CORE_API InitialInstancesContainer {
|
||||
*/
|
||||
void IterateOverInstances(InitialInstanceFunctor &func);
|
||||
|
||||
/**
|
||||
* \brief Apply \a func to each instance of the container.
|
||||
* \see InitialInstanceFunctor
|
||||
*/
|
||||
void IterateOverInstances(
|
||||
const std::function< void(gd::InitialInstance &) >& func);
|
||||
|
||||
/**
|
||||
* Get the instances on the specified layer,
|
||||
* sort them regarding their Z order and then apply \a func on them.
|
||||
|
@@ -137,15 +137,6 @@ void ObjectFolderOrObject::RemoveRecursivelyObjectNamed(
|
||||
}
|
||||
};
|
||||
|
||||
void ObjectFolderOrObject::Clear() {
|
||||
if (IsFolder()) {
|
||||
for (auto& it : children) {
|
||||
it->Clear();
|
||||
}
|
||||
children.clear();
|
||||
}
|
||||
};
|
||||
|
||||
bool ObjectFolderOrObject::IsADescendantOf(
|
||||
const ObjectFolderOrObject& otherObjectFolderOrObject) {
|
||||
if (parent == nullptr) return false;
|
||||
|
@@ -134,10 +134,6 @@ class GD_CORE_API ObjectFolderOrObject {
|
||||
* the instance children and recursively does it for every folder children.
|
||||
*/
|
||||
void RemoveRecursivelyObjectNamed(const gd::String& name);
|
||||
/**
|
||||
* \brief Clears all children
|
||||
*/
|
||||
void Clear();
|
||||
|
||||
/**
|
||||
* \brief Inserts an instance representing the given object at the given
|
||||
|
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2025 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ObjectTools.h"
|
||||
|
||||
#include "GDCore/Extensions/Metadata/BehaviorMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
||||
#include "GDCore/Extensions/Platform.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
bool ObjectTools::IsBehaviorCompatibleWithObject(
|
||||
const gd::Platform &platform, const gd::String &objectType,
|
||||
const gd::String &behaviorType,
|
||||
std::unordered_set<gd::String> coveredBehaviorType) {
|
||||
bool isBehaviorTypeAlreadyCovered =
|
||||
!coveredBehaviorType.insert(behaviorType).second;
|
||||
if (isBehaviorTypeAlreadyCovered) {
|
||||
return true;
|
||||
}
|
||||
const gd::BehaviorMetadata &behaviorMetadata =
|
||||
MetadataProvider::GetBehaviorMetadata(platform, behaviorType);
|
||||
if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
|
||||
// Should not happen because the behavior was added successfully (so its
|
||||
// metadata are valid) - but double check anyway and bail out if the
|
||||
// behavior metadata are invalid.
|
||||
return false;
|
||||
}
|
||||
if (!behaviorMetadata.GetObjectType().empty() &&
|
||||
behaviorMetadata.GetObjectType() != objectType) {
|
||||
return false;
|
||||
}
|
||||
for (const gd::String &requiredBehaviorType :
|
||||
behaviorMetadata.GetRequiredBehaviorTypes()) {
|
||||
const gd::BehaviorMetadata &requiredBehaviorMetadata =
|
||||
gd::MetadataProvider::GetBehaviorMetadata(platform, requiredBehaviorType);
|
||||
if (requiredBehaviorMetadata.IsHidden()) {
|
||||
const gd::ObjectMetadata &objectMetadata =
|
||||
gd::MetadataProvider::GetObjectMetadata(platform, objectType);
|
||||
if (objectMetadata.GetDefaultBehaviors().find(requiredBehaviorType) ==
|
||||
objectMetadata.GetDefaultBehaviors().end()) {
|
||||
// A capability is missing in the object.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!gd::ObjectTools::IsBehaviorCompatibleWithObject(
|
||||
platform, objectType, requiredBehaviorType, coveredBehaviorType)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace gd
|
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2025 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/String.h"
|
||||
#include <unordered_set>
|
||||
|
||||
namespace gd {
|
||||
class Platform;
|
||||
class Object;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
class GD_CORE_API ObjectTools {
|
||||
public:
|
||||
static bool IsBehaviorCompatibleWithObject(const gd::Platform &platform,
|
||||
const gd::String &objectType,
|
||||
const gd::String &behaviorType) {
|
||||
std::unordered_set<gd::String> coveredBehaviorType;
|
||||
return IsBehaviorCompatibleWithObject(platform, objectType, behaviorType,
|
||||
coveredBehaviorType);
|
||||
}
|
||||
|
||||
private:
|
||||
static bool IsBehaviorCompatibleWithObject(
|
||||
const gd::Platform &platform, const gd::String &objectType,
|
||||
const gd::String &behaviorType,
|
||||
std::unordered_set<gd::String> coveredBehaviorType);
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -7,12 +7,12 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "GDCore/Tools/PolymorphicClone.h"
|
||||
#include "GDCore/Extensions/Platform.h"
|
||||
#include "GDCore/Project/Object.h"
|
||||
#include "GDCore/Project/ObjectFolderOrObject.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "GDCore/Serialization/SerializerElement.h"
|
||||
#include "GDCore/Tools/PolymorphicClone.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
@@ -28,7 +28,8 @@ ObjectsContainer::ObjectsContainer(const ObjectsContainer& other) {
|
||||
Init(other);
|
||||
}
|
||||
|
||||
ObjectsContainer& ObjectsContainer::operator=(const ObjectsContainer& other) {
|
||||
ObjectsContainer& ObjectsContainer::operator=(
|
||||
const ObjectsContainer& other) {
|
||||
if (this != &other) Init(other);
|
||||
|
||||
return *this;
|
||||
@@ -68,7 +69,7 @@ void ObjectsContainer::AddMissingObjectsInRootFolder() {
|
||||
|
||||
void ObjectsContainer::UnserializeObjectsFrom(
|
||||
gd::Project& project, const SerializerElement& element) {
|
||||
Clear();
|
||||
initialObjects.clear();
|
||||
element.ConsiderAsArrayOf("object", "Objet");
|
||||
for (std::size_t i = 0; i < element.GetChildrenCount(); ++i) {
|
||||
const SerializerElement& objectElement = element.GetChild(i);
|
||||
@@ -183,11 +184,6 @@ void ObjectsContainer::RemoveObject(const gd::String& name) {
|
||||
initialObjects.erase(objectIt);
|
||||
}
|
||||
|
||||
void ObjectsContainer::Clear() {
|
||||
rootFolder->Clear();
|
||||
initialObjects.clear();
|
||||
}
|
||||
|
||||
void ObjectsContainer::MoveObjectFolderOrObjectToAnotherContainerInFolder(
|
||||
gd::ObjectFolderOrObject& objectFolderOrObject,
|
||||
gd::ObjectsContainer& newContainer,
|
||||
|
@@ -166,11 +166,6 @@ class GD_CORE_API ObjectsContainer {
|
||||
gd::ObjectFolderOrObject& newParentFolder,
|
||||
std::size_t newPosition);
|
||||
|
||||
/**
|
||||
* \brief Clear all groups of the container.
|
||||
*/
|
||||
void Clear();
|
||||
|
||||
/**
|
||||
* Provide a raw access to the vector containing the objects
|
||||
*/
|
||||
|
@@ -70,29 +70,24 @@ ProjectScopedContainers::MakeNewProjectScopedContainersForEventsFunctionsExtensi
|
||||
|
||||
ProjectScopedContainers
|
||||
ProjectScopedContainers::MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
const gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
gd::VariablesContainer ¶meterVariablesContainer) {
|
||||
gd::ObjectsContainer ¶meterObjectsContainer) {
|
||||
|
||||
gd::EventsFunctionTools::FreeEventsFunctionToObjectsContainer(
|
||||
project, eventsFunctionsExtension.GetEventsFunctions(), eventsFunction,
|
||||
parameterObjectsContainer);
|
||||
project, eventsFunctionsExtension, eventsFunction, parameterObjectsContainer);
|
||||
|
||||
ProjectScopedContainers projectScopedContainers(
|
||||
ObjectsContainersList::MakeNewObjectsContainersListForContainer(
|
||||
parameterObjectsContainer),
|
||||
VariablesContainersList::
|
||||
MakeNewVariablesContainersListForFreeEventsFunction(
|
||||
eventsFunctionsExtension, eventsFunction,
|
||||
parameterVariablesContainer),
|
||||
MakeNewVariablesContainersListForEventsFunctionsExtension(eventsFunctionsExtension),
|
||||
&eventsFunctionsExtension.GetGlobalVariables(),
|
||||
&eventsFunctionsExtension.GetSceneVariables(),
|
||||
PropertiesContainersList::MakeNewEmptyPropertiesContainersList());
|
||||
|
||||
projectScopedContainers.AddParameters(eventsFunction.GetParametersForEvents(
|
||||
eventsFunctionsExtension.GetEventsFunctions()));
|
||||
projectScopedContainers.AddParameters(
|
||||
eventsFunction.GetParametersForEvents(eventsFunctionsExtension));
|
||||
|
||||
return projectScopedContainers;
|
||||
};
|
||||
@@ -102,9 +97,7 @@ ProjectScopedContainers::MakeNewProjectScopedContainersForBehaviorEventsFunction
|
||||
const gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer) {
|
||||
gd::ObjectsContainer ¶meterObjectsContainer) {
|
||||
|
||||
gd::EventsFunctionTools::BehaviorEventsFunctionToObjectsContainer(
|
||||
project,
|
||||
@@ -116,9 +109,7 @@ ProjectScopedContainers::MakeNewProjectScopedContainersForBehaviorEventsFunction
|
||||
ObjectsContainersList::MakeNewObjectsContainersListForContainer(
|
||||
parameterObjectsContainer),
|
||||
VariablesContainersList::
|
||||
MakeNewVariablesContainersListForBehaviorEventsFunction(
|
||||
eventsFunctionsExtension, eventsBasedBehavior, eventsFunction,
|
||||
parameterVariablesContainer, propertyVariablesContainer),
|
||||
MakeNewVariablesContainersListForEventsFunctionsExtension(eventsFunctionsExtension),
|
||||
&eventsFunctionsExtension.GetGlobalVariables(),
|
||||
&eventsFunctionsExtension.GetSceneVariables(),
|
||||
PropertiesContainersList::MakeNewEmptyPropertiesContainersList());
|
||||
@@ -139,9 +130,7 @@ ProjectScopedContainers::MakeNewProjectScopedContainersForObjectEventsFunction(
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer) {
|
||||
gd::ObjectsContainer ¶meterObjectsContainer) {
|
||||
|
||||
gd::EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
|
||||
project, eventsBasedObject, eventsFunction, parameterObjectsContainer);
|
||||
@@ -151,9 +140,8 @@ ProjectScopedContainers::MakeNewProjectScopedContainersForObjectEventsFunction(
|
||||
eventsBasedObject.GetObjects(),
|
||||
parameterObjectsContainer),
|
||||
VariablesContainersList::
|
||||
MakeNewVariablesContainersListForObjectEventsFunction(
|
||||
eventsFunctionsExtension, eventsBasedObject, eventsFunction,
|
||||
parameterVariablesContainer, propertyVariablesContainer),
|
||||
MakeNewVariablesContainersListForEventsFunctionsExtension(
|
||||
eventsFunctionsExtension),
|
||||
&eventsFunctionsExtension.GetGlobalVariables(),
|
||||
&eventsFunctionsExtension.GetSceneVariables(),
|
||||
PropertiesContainersList::MakeNewEmptyPropertiesContainersList());
|
||||
@@ -178,7 +166,7 @@ ProjectScopedContainers::MakeNewProjectScopedContainersForEventsBasedObject(
|
||||
// created below.
|
||||
// Search for "ProjectScopedContainers wrongly containing temporary objects containers or objects"
|
||||
// in the codebase.
|
||||
outputObjectsContainer.Clear();
|
||||
outputObjectsContainer.GetObjects().clear();
|
||||
outputObjectsContainer.GetObjectGroups().Clear();
|
||||
|
||||
// This object named "Object" represents the parent and is used by events.
|
||||
|
@@ -69,9 +69,8 @@ class ProjectScopedContainers {
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
const gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
gd::VariablesContainer ¶meterVariablesContainer);
|
||||
const gd::EventsFunction& eventsFunction,
|
||||
gd::ObjectsContainer& parameterObjectsContainer);
|
||||
|
||||
static ProjectScopedContainers
|
||||
MakeNewProjectScopedContainersForBehaviorEventsFunction(
|
||||
@@ -79,9 +78,7 @@ class ProjectScopedContainers {
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer);
|
||||
gd::ObjectsContainer ¶meterObjectsContainer);
|
||||
|
||||
static ProjectScopedContainers
|
||||
MakeNewProjectScopedContainersForObjectEventsFunction(
|
||||
@@ -89,9 +86,7 @@ class ProjectScopedContainers {
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ObjectsContainer ¶meterObjectsContainer,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer);
|
||||
gd::ObjectsContainer ¶meterObjectsContainer);
|
||||
|
||||
static ProjectScopedContainers
|
||||
MakeNewProjectScopedContainersForEventsBasedObject(
|
||||
@@ -129,17 +124,9 @@ class ProjectScopedContainers {
|
||||
std::function<ReturnType()> notFoundCallback) const {
|
||||
if (objectsContainersList.HasObjectOrGroupNamed(name))
|
||||
return objectCallback();
|
||||
else if (variablesContainersList.Has(name)) {
|
||||
const auto &variablesContainer =
|
||||
variablesContainersList.GetVariablesContainerFromVariableOrPropertyOrParameterName(name);
|
||||
const auto sourceType = variablesContainer.GetSourceType();
|
||||
if (sourceType == gd::VariablesContainer::SourceType::Properties) {
|
||||
return propertyCallback();
|
||||
} else if (sourceType == gd::VariablesContainer::SourceType::Parameters) {
|
||||
return parameterCallback();
|
||||
}
|
||||
else if (variablesContainersList.Has(name))
|
||||
return variableCallback();
|
||||
} else if (ParameterMetadataTools::Has(parametersVectorsList, name))
|
||||
else if (ParameterMetadataTools::Has(parametersVectorsList, name))
|
||||
return parameterCallback();
|
||||
else if (propertiesContainersList.Has(name))
|
||||
return propertyCallback();
|
||||
|
@@ -34,9 +34,7 @@ class GD_CORE_API VariablesContainer {
|
||||
Object,
|
||||
Local,
|
||||
ExtensionGlobal,
|
||||
ExtensionScene,
|
||||
Parameters,
|
||||
Properties,
|
||||
ExtensionScene
|
||||
};
|
||||
|
||||
VariablesContainer();
|
||||
|
@@ -6,7 +6,6 @@
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "GDCore/Project/Variable.h"
|
||||
#include "GDCore/Project/EventsFunctionsExtension.h"
|
||||
#include "GDCore/IDE/EventsFunctionTools.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
@@ -42,78 +41,6 @@ VariablesContainersList::MakeNewVariablesContainersListForEventsFunctionsExtensi
|
||||
return variablesContainersList;
|
||||
}
|
||||
|
||||
VariablesContainersList
|
||||
VariablesContainersList::MakeNewVariablesContainersListForFreeEventsFunction(
|
||||
const gd::EventsFunctionsExtension &extension,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::VariablesContainer ¶meterVariablesContainer) {
|
||||
VariablesContainersList variablesContainersList;
|
||||
variablesContainersList.Push(extension.GetGlobalVariables());
|
||||
variablesContainersList.Push(extension.GetSceneVariables());
|
||||
|
||||
gd::EventsFunctionTools::ParametersToVariablesContainer(
|
||||
eventsFunction.GetParametersForEvents(extension.GetEventsFunctions()),
|
||||
parameterVariablesContainer);
|
||||
variablesContainersList.Push(parameterVariablesContainer);
|
||||
|
||||
variablesContainersList.firstLocalVariableContainerIndex = 3;
|
||||
return variablesContainersList;
|
||||
}
|
||||
|
||||
VariablesContainersList VariablesContainersList::
|
||||
MakeNewVariablesContainersListForBehaviorEventsFunction(
|
||||
const gd::EventsFunctionsExtension &extension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer) {
|
||||
VariablesContainersList variablesContainersList;
|
||||
variablesContainersList.Push(extension.GetGlobalVariables());
|
||||
variablesContainersList.Push(extension.GetSceneVariables());
|
||||
|
||||
gd::EventsFunctionTools::PropertiesToVariablesContainer(
|
||||
eventsBasedBehavior.GetSharedPropertyDescriptors(), propertyVariablesContainer);
|
||||
variablesContainersList.Push(propertyVariablesContainer);
|
||||
|
||||
gd::EventsFunctionTools::PropertiesToVariablesContainer(
|
||||
eventsBasedBehavior.GetPropertyDescriptors(), propertyVariablesContainer);
|
||||
variablesContainersList.Push(propertyVariablesContainer);
|
||||
|
||||
gd::EventsFunctionTools::ParametersToVariablesContainer(
|
||||
eventsFunction.GetParametersForEvents(
|
||||
eventsBasedBehavior.GetEventsFunctions()),
|
||||
parameterVariablesContainer);
|
||||
variablesContainersList.Push(parameterVariablesContainer);
|
||||
|
||||
variablesContainersList.firstLocalVariableContainerIndex = 5;
|
||||
return variablesContainersList;
|
||||
}
|
||||
|
||||
VariablesContainersList
|
||||
VariablesContainersList::MakeNewVariablesContainersListForObjectEventsFunction(
|
||||
const gd::EventsFunctionsExtension &extension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer) {
|
||||
VariablesContainersList variablesContainersList;
|
||||
variablesContainersList.Push(extension.GetGlobalVariables());
|
||||
variablesContainersList.Push(extension.GetSceneVariables());
|
||||
|
||||
gd::EventsFunctionTools::PropertiesToVariablesContainer(
|
||||
eventsBasedObject.GetPropertyDescriptors(), propertyVariablesContainer);
|
||||
variablesContainersList.Push(propertyVariablesContainer);
|
||||
|
||||
gd::EventsFunctionTools::ParametersToVariablesContainer(
|
||||
eventsFunction.GetParametersForEvents(
|
||||
eventsBasedObject.GetEventsFunctions()),
|
||||
parameterVariablesContainer);
|
||||
variablesContainersList.Push(parameterVariablesContainer);
|
||||
|
||||
variablesContainersList.firstLocalVariableContainerIndex = 4;
|
||||
return variablesContainersList;
|
||||
}
|
||||
|
||||
VariablesContainersList
|
||||
VariablesContainersList::MakeNewVariablesContainersListPushing(
|
||||
const VariablesContainersList& variablesContainersList, const gd::VariablesContainer& variablesContainer) {
|
||||
@@ -147,7 +74,7 @@ const Variable& VariablesContainersList::Get(const gd::String& name) const {
|
||||
}
|
||||
|
||||
const VariablesContainer &
|
||||
VariablesContainersList::GetVariablesContainerFromVariableOrPropertyOrParameterName(
|
||||
VariablesContainersList::GetVariablesContainerFromVariableName(
|
||||
const gd::String &variableName) const {
|
||||
for (auto it = variablesContainers.rbegin(); it != variablesContainers.rend();
|
||||
++it) {
|
||||
@@ -157,34 +84,6 @@ VariablesContainersList::GetVariablesContainerFromVariableOrPropertyOrParameterN
|
||||
return badVariablesContainer;
|
||||
}
|
||||
|
||||
const VariablesContainer &VariablesContainersList::
|
||||
GetVariablesContainerFromVariableOrPropertyName(
|
||||
const gd::String &variableName) const {
|
||||
for (auto it = variablesContainers.rbegin(); it != variablesContainers.rend();
|
||||
++it) {
|
||||
if ((*it)->GetSourceType() !=
|
||||
gd::VariablesContainer::SourceType::Parameters &&
|
||||
(*it)->Has(variableName))
|
||||
return **it;
|
||||
}
|
||||
return badVariablesContainer;
|
||||
}
|
||||
|
||||
const VariablesContainer &VariablesContainersList::
|
||||
GetVariablesContainerFromVariableNameOnly(
|
||||
const gd::String &variableName) const {
|
||||
for (auto it = variablesContainers.rbegin(); it != variablesContainers.rend();
|
||||
++it) {
|
||||
if ((*it)->GetSourceType() !=
|
||||
gd::VariablesContainer::SourceType::Parameters &&
|
||||
(*it)->GetSourceType() !=
|
||||
gd::VariablesContainer::SourceType::Properties &&
|
||||
(*it)->Has(variableName))
|
||||
return **it;
|
||||
}
|
||||
return badVariablesContainer;
|
||||
}
|
||||
|
||||
std::size_t
|
||||
VariablesContainersList::GetVariablesContainerPositionFromVariableName(
|
||||
const gd::String &variableName) const {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
|
||||
namespace gd {
|
||||
class String;
|
||||
@@ -9,10 +9,7 @@ class Layout;
|
||||
class VariablesContainer;
|
||||
class Variable;
|
||||
class EventsFunctionsExtension;
|
||||
class EventsBasedBehavior;
|
||||
class EventsBasedObject;
|
||||
class EventsFunction;
|
||||
} // namespace gd
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
@@ -27,42 +24,20 @@ namespace gd {
|
||||
* \ingroup PlatformDefinition
|
||||
*/
|
||||
class GD_CORE_API VariablesContainersList {
|
||||
public:
|
||||
public:
|
||||
virtual ~VariablesContainersList(){};
|
||||
|
||||
static VariablesContainersList
|
||||
MakeNewVariablesContainersListForProjectAndLayout(const gd::Project &project,
|
||||
const gd::Layout &layout);
|
||||
MakeNewVariablesContainersListForProjectAndLayout(const gd::Project& project,
|
||||
const gd::Layout& layout);
|
||||
|
||||
static VariablesContainersList
|
||||
MakeNewVariablesContainersListForProject(const gd::Project &project);
|
||||
MakeNewVariablesContainersListForProject(const gd::Project& project);
|
||||
|
||||
static VariablesContainersList
|
||||
MakeNewVariablesContainersListForEventsFunctionsExtension(
|
||||
const gd::EventsFunctionsExtension &extension);
|
||||
|
||||
static VariablesContainersList
|
||||
MakeNewVariablesContainersListForFreeEventsFunction(
|
||||
const gd::EventsFunctionsExtension &extension,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::VariablesContainer ¶meterVariablesContainer);
|
||||
|
||||
static VariablesContainersList
|
||||
MakeNewVariablesContainersListForBehaviorEventsFunction(
|
||||
const gd::EventsFunctionsExtension &extension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer);
|
||||
|
||||
static VariablesContainersList
|
||||
MakeNewVariablesContainersListForObjectEventsFunction(
|
||||
const gd::EventsFunctionsExtension &extension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::VariablesContainer ¶meterVariablesContainer,
|
||||
gd::VariablesContainer &propertyVariablesContainer);
|
||||
|
||||
static VariablesContainersList MakeNewVariablesContainersListPushing(
|
||||
const VariablesContainersList &variablesContainersList,
|
||||
const gd::VariablesContainer &variablesContainer);
|
||||
@@ -75,31 +50,28 @@ public:
|
||||
/**
|
||||
* \brief Return true if the specified variable is in one of the containers.
|
||||
*/
|
||||
bool Has(const gd::String &name) const;
|
||||
bool Has(const gd::String& name) const;
|
||||
|
||||
/**
|
||||
* \brief Return a reference to the variable called \a name.
|
||||
*/
|
||||
const Variable &Get(const gd::String &name) const;
|
||||
const Variable& Get(const gd::String& name) const;
|
||||
|
||||
/**
|
||||
* \brief Return true if the specified variable container is present.
|
||||
*/
|
||||
bool
|
||||
HasVariablesContainer(const gd::VariablesContainer &variablesContainer) const;
|
||||
bool HasVariablesContainer(const gd::VariablesContainer& variablesContainer) const;
|
||||
|
||||
// TODO: Rename GetTopMostVariablesContainer and
|
||||
// GetBottomMostVariablesContainer to give a clearer access to segments of the
|
||||
// container list. For instance, a project tree segment and an event tree
|
||||
// segment.
|
||||
// TODO: Rename GetTopMostVariablesContainer and GetBottomMostVariablesContainer
|
||||
// to give a clearer access to segments of the container list.
|
||||
// For instance, a project tree segment and an event tree segment.
|
||||
|
||||
/**
|
||||
* Get the variables container at the top of the scope (so the most "global"
|
||||
* one). \brief Avoid using apart when a scope must be forced.
|
||||
* Get the variables container at the top of the scope (so the most "global" one).
|
||||
* \brief Avoid using apart when a scope must be forced.
|
||||
*/
|
||||
const VariablesContainer *GetTopMostVariablesContainer() const {
|
||||
if (variablesContainers.empty())
|
||||
return nullptr;
|
||||
const VariablesContainer* GetTopMostVariablesContainer() const {
|
||||
if (variablesContainers.empty()) return nullptr;
|
||||
return variablesContainers.front();
|
||||
};
|
||||
|
||||
@@ -108,29 +80,16 @@ public:
|
||||
* (so the most "local" one) excluding local variables.
|
||||
* \brief Avoid using apart when a scope must be forced.
|
||||
*/
|
||||
const VariablesContainer *GetBottomMostVariablesContainer() const {
|
||||
if (variablesContainers.empty())
|
||||
return nullptr;
|
||||
const VariablesContainer* GetBottomMostVariablesContainer() const {
|
||||
if (variablesContainers.empty()) return nullptr;
|
||||
return variablesContainers.at(firstLocalVariableContainerIndex - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the variables container for a given variable or property or parameter.
|
||||
*/
|
||||
const VariablesContainer &
|
||||
GetVariablesContainerFromVariableOrPropertyOrParameterName(const gd::String &variableName) const;
|
||||
|
||||
/**
|
||||
* Get the variables container for a given variable or property.
|
||||
*/
|
||||
const VariablesContainer &
|
||||
GetVariablesContainerFromVariableOrPropertyName(const gd::String &variableName) const;
|
||||
|
||||
/**
|
||||
* Get the variables container for a given variable.
|
||||
*/
|
||||
const VariablesContainer &
|
||||
GetVariablesContainerFromVariableNameOnly(const gd::String &variableName) const;
|
||||
GetVariablesContainerFromVariableName(const gd::String &variableName) const;
|
||||
|
||||
/**
|
||||
* Get the variables container index for a given variable.
|
||||
@@ -150,47 +109,43 @@ public:
|
||||
* \warning Trying to access to a not existing variable container will result
|
||||
* in undefined behavior.
|
||||
*/
|
||||
const gd::VariablesContainer &GetVariablesContainer(std::size_t index) const {
|
||||
const gd::VariablesContainer& GetVariablesContainer(std::size_t index) const {
|
||||
return *variablesContainers.at(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return the number variable containers.
|
||||
*/
|
||||
std::size_t GetVariablesContainersCount() const {
|
||||
return variablesContainers.size();
|
||||
}
|
||||
std::size_t GetVariablesContainersCount() const { return variablesContainers.size(); }
|
||||
|
||||
/**
|
||||
* \brief Call the callback for each variable having a name matching the
|
||||
* specified search.
|
||||
* \brief Call the callback for each variable having a name matching the specified search.
|
||||
*/
|
||||
void ForEachVariableMatchingSearch(
|
||||
const gd::String &search,
|
||||
std::function<void(const gd::String &name, const gd::Variable &variable)>
|
||||
fn) const;
|
||||
void ForEachVariableMatchingSearch(const gd::String& search, std::function<void(const gd::String& name, const gd::Variable& variable)> fn) const;
|
||||
|
||||
/**
|
||||
* \brief Push a new variables container to the context.
|
||||
*/
|
||||
void Push(const gd::VariablesContainer &variablesContainer) {
|
||||
void Push(const gd::VariablesContainer& variablesContainer) {
|
||||
variablesContainers.push_back(&variablesContainer);
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Pop a variables container from the context.
|
||||
*/
|
||||
void Pop() { variablesContainers.pop_back(); };
|
||||
void Pop() {
|
||||
variablesContainers.pop_back();
|
||||
};
|
||||
|
||||
/** Do not use - should be private but accessible to let Emscripten create a
|
||||
* temporary. */
|
||||
VariablesContainersList() : firstLocalVariableContainerIndex(0){};
|
||||
|
||||
private:
|
||||
std::vector<const gd::VariablesContainer *> variablesContainers;
|
||||
/** Do not use - should be private but accessible to let Emscripten create a temporary. */
|
||||
VariablesContainersList(): firstLocalVariableContainerIndex(0) {};
|
||||
private:
|
||||
|
||||
std::vector<const gd::VariablesContainer*> variablesContainers;
|
||||
std::size_t firstLocalVariableContainerIndex;
|
||||
static Variable badVariable;
|
||||
static VariablesContainer badVariablesContainer;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
} // namespace gd
|
@@ -268,9 +268,8 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto &function = extension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeFunction", 0);
|
||||
|
||||
auto& function = extension.InsertNewEventsFunction("MyFreeFunction", 0);
|
||||
|
||||
gd::StandardEvent standardEvent;
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("MyExtension::DoSomethingWithResources");
|
||||
@@ -778,9 +777,8 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto &function = extension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeFunction", 0);
|
||||
|
||||
auto& function = extension.InsertNewEventsFunction("MyFreeFunction", 0);
|
||||
|
||||
gd::StandardEvent standardEvent;
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("MyExtension::DoSomethingWithResources");
|
||||
|
@@ -263,46 +263,6 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
|
||||
extension->SetExtensionInformation(
|
||||
"BuiltinVariables", "My testing extension for variables", "", "", "");
|
||||
|
||||
extension
|
||||
->AddCondition("NumberVariable",
|
||||
"Variable value",
|
||||
"Compare the number value of a variable.",
|
||||
"The variable _PARAM0_",
|
||||
"",
|
||||
"",
|
||||
"")
|
||||
.AddParameter("variableOrPropertyOrParameter", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", gd::ParameterOptions::MakeNewOptions());
|
||||
|
||||
extension
|
||||
->AddCondition("StringVariable",
|
||||
"Variable value",
|
||||
"Compare the text (string) of a variable.",
|
||||
"The variable _PARAM0_",
|
||||
"",
|
||||
"",
|
||||
"")
|
||||
.AddParameter("variableOrPropertyOrParameter", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", gd::ParameterOptions::MakeNewOptions());
|
||||
|
||||
extension
|
||||
->AddCondition(
|
||||
"BooleanVariable",
|
||||
"Variable value",
|
||||
"Compare the boolean value of a variable.",
|
||||
"The variable _PARAM0_ is _PARAM1_",
|
||||
"",
|
||||
"",
|
||||
"")
|
||||
.AddParameter("variableOrPropertyOrParameter", _("Variable"))
|
||||
.AddParameter("trueorfalse", _("Check if the value is"))
|
||||
.SetDefaultValue("true")
|
||||
// This parameter allows to keep the operand expression
|
||||
// when the editor switch between variable instructions.
|
||||
.AddCodeOnlyParameter("trueorfalse", "");
|
||||
|
||||
extension
|
||||
->AddAction("SetNumberVariable",
|
||||
"Change variable value",
|
||||
@@ -311,7 +271,7 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
|
||||
"",
|
||||
"",
|
||||
"")
|
||||
.AddParameter("variableOrProperty", "Variable")
|
||||
.AddParameter("variable", "Variable")
|
||||
.AddParameter("operator", "Operator", "number")
|
||||
.AddParameter("number", "Value")
|
||||
.SetFunctionName("setNumberVariable");
|
||||
@@ -324,7 +284,7 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
|
||||
"",
|
||||
"",
|
||||
"")
|
||||
.AddParameter("variableOrProperty", "Variable")
|
||||
.AddParameter("variable", "Variable")
|
||||
.AddParameter("operator", "Operator", "string")
|
||||
.AddParameter("string", "Value")
|
||||
.SetFunctionName("setStringVariable");
|
||||
@@ -337,7 +297,7 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
|
||||
"",
|
||||
"",
|
||||
"")
|
||||
.AddParameter("variableOrProperty", "Variable")
|
||||
.AddParameter("variable", "Variable")
|
||||
.AddParameter("operator", "Operator", "boolean")
|
||||
// This parameter allows to keep the operand expression
|
||||
// when the editor switch between variable instructions.
|
||||
|
@@ -38,8 +38,6 @@ TEST_CASE("EventsFunctionsContainer", "[common]") {
|
||||
"Function2.x");
|
||||
REQUIRE(eventsFunctionContainer.GetEventsFunction(2).GetName() ==
|
||||
"Function3");
|
||||
REQUIRE(eventsFunctionContainer.GetOwner() ==
|
||||
gd::EventsFunctionsContainer::FunctionOwner::Extension);
|
||||
REQUIRE(eventsFunctionContainer2.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(eventsFunctionContainer2.GetEventsFunction(0).GetName() ==
|
||||
"Function1.y");
|
||||
|
@@ -11,10 +11,9 @@
|
||||
TEST_CASE("EventsFunctionsExtension", "[common]") {
|
||||
SECTION("Sanity checks") {
|
||||
gd::EventsFunctionsExtension eventsFunctionExtension;
|
||||
auto &freeEventsFunctions = eventsFunctionExtension.GetEventsFunctions();
|
||||
freeEventsFunctions.InsertNewEventsFunction("Function1", 0);
|
||||
freeEventsFunctions.InsertNewEventsFunction("Function2", 1);
|
||||
freeEventsFunctions.InsertNewEventsFunction("Function3", 2);
|
||||
eventsFunctionExtension.InsertNewEventsFunction("Function1", 0);
|
||||
eventsFunctionExtension.InsertNewEventsFunction("Function2", 1);
|
||||
eventsFunctionExtension.InsertNewEventsFunction("Function3", 2);
|
||||
eventsFunctionExtension.GetEventsBasedBehaviors().InsertNew("MyBehavior",
|
||||
0);
|
||||
eventsFunctionExtension.GetEventsBasedBehaviors().InsertNew("MyBehavior2",
|
||||
@@ -23,13 +22,12 @@ TEST_CASE("EventsFunctionsExtension", "[common]") {
|
||||
// Check that copy operator is working
|
||||
gd::EventsFunctionsExtension eventsFunctionExtension2 =
|
||||
eventsFunctionExtension;
|
||||
auto &freeEventsFunctions2 = eventsFunctionExtension2.GetEventsFunctions();
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunction(0).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunction(0).GetName() ==
|
||||
"Function1");
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunction(1).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunction(1).GetName() ==
|
||||
"Function2");
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunction(2).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunction(2).GetName() ==
|
||||
"Function3");
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsBasedBehaviors().GetCount() == 2);
|
||||
REQUIRE(
|
||||
@@ -41,21 +39,21 @@ TEST_CASE("EventsFunctionsExtension", "[common]") {
|
||||
|
||||
// Check that the copy has not somehow shared the same pointers
|
||||
// to the events functions.
|
||||
freeEventsFunctions.GetEventsFunction(1).SetName("Function2.x");
|
||||
freeEventsFunctions2.GetEventsFunction(0).SetName("Function1.y");
|
||||
REQUIRE(freeEventsFunctions.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(freeEventsFunctions.GetEventsFunction(0).GetName() ==
|
||||
eventsFunctionExtension.GetEventsFunction(1).SetName("Function2.x");
|
||||
eventsFunctionExtension2.GetEventsFunction(0).SetName("Function1.y");
|
||||
REQUIRE(eventsFunctionExtension.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(eventsFunctionExtension.GetEventsFunction(0).GetName() ==
|
||||
"Function1");
|
||||
REQUIRE(freeEventsFunctions.GetEventsFunction(1).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension.GetEventsFunction(1).GetName() ==
|
||||
"Function2.x");
|
||||
REQUIRE(freeEventsFunctions.GetEventsFunction(2).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension.GetEventsFunction(2).GetName() ==
|
||||
"Function3");
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunction(0).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunctionsCount() == 3);
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunction(0).GetName() ==
|
||||
"Function1.y");
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunction(1).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunction(1).GetName() ==
|
||||
"Function2");
|
||||
REQUIRE(freeEventsFunctions2.GetEventsFunction(2).GetName() ==
|
||||
REQUIRE(eventsFunctionExtension2.GetEventsFunction(2).GetName() ==
|
||||
"Function3");
|
||||
}
|
||||
}
|
||||
|
@@ -2035,319 +2035,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Valid property (in variableOrPropertyOrParameter parameter)") {
|
||||
{
|
||||
gd::PropertiesContainer propertiesContainer(
|
||||
gd::EventsFunctionsContainer::Extension);
|
||||
|
||||
auto projectScopedContainersWithProperties = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithProperties.AddPropertiesContainer(
|
||||
propertiesContainer);
|
||||
|
||||
propertiesContainer.InsertNew("MyProperty");
|
||||
|
||||
auto node = parser.ParseExpression("MyProperty");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetAllErrors().size() == 0);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Valid property (in variableOrProperty parameter)") {
|
||||
{
|
||||
gd::PropertiesContainer propertiesContainer(
|
||||
gd::EventsFunctionsContainer::Extension);
|
||||
|
||||
auto projectScopedContainersWithProperties = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithProperties.AddPropertiesContainer(
|
||||
propertiesContainer);
|
||||
|
||||
propertiesContainer.InsertNew("MyProperty");
|
||||
|
||||
auto node = parser.ParseExpression("MyProperty");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrProperty");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetAllErrors().size() == 0);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid property (in variable parameter)") {
|
||||
{
|
||||
gd::PropertiesContainer propertiesContainer(
|
||||
gd::EventsFunctionsContainer::Extension);
|
||||
|
||||
auto projectScopedContainersWithProperties = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithProperties.AddPropertiesContainer(
|
||||
propertiesContainer);
|
||||
|
||||
propertiesContainer.InsertNew("MyProperty");
|
||||
|
||||
auto node = parser.ParseExpression("MyProperty");
|
||||
|
||||
gd::ExpressionValidator validator(
|
||||
platform, projectScopedContainersWithProperties, "variable");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetAllErrors().size() == 1);
|
||||
REQUIRE(validator.GetAllErrors()[0]->GetMessage() ==
|
||||
"This variable has the same name as a property. Consider "
|
||||
"renaming one or the other.");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid property (property with child in variableOrProperty parameter)") {
|
||||
{
|
||||
gd::PropertiesContainer propertiesContainer(
|
||||
gd::EventsFunctionsContainer::Extension);
|
||||
|
||||
auto projectScopedContainersWithProperties = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithProperties.AddPropertiesContainer(
|
||||
propertiesContainer);
|
||||
|
||||
propertiesContainer.InsertNew("MyProperty");
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty.MyChild");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrProperty");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty.MyChild.MyGrandChild");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrProperty");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty[\"MyChild\"]");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrProperty");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty[0]");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrProperty");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid property (property with child in variableOrPropertyOrParameter parameter)") {
|
||||
{
|
||||
gd::PropertiesContainer propertiesContainer(
|
||||
gd::EventsFunctionsContainer::Extension);
|
||||
|
||||
auto projectScopedContainersWithProperties = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithProperties.AddPropertiesContainer(
|
||||
propertiesContainer);
|
||||
|
||||
propertiesContainer.InsertNew("MyProperty");
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty.MyChild");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty.MyChild.MyGrandChild");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty[\"MyChild\"]");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyProperty[0]");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithProperties,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Valid parameter (in variableOrPropertyOrParameter parameter)") {
|
||||
{
|
||||
gd::ParameterMetadataContainer parameters;
|
||||
parameters.InsertNewParameter("MyParameter", 0).SetType("number");
|
||||
|
||||
auto projectScopedContainersWithParameters = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithParameters.AddParameters(parameters);
|
||||
|
||||
auto node = parser.ParseExpression("MyParameter");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithParameters,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetAllErrors().size() == 0);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid parameter (in variableOrProperty parameter)") {
|
||||
{
|
||||
gd::ParameterMetadataContainer parameters;
|
||||
parameters.InsertNewParameter("MyParameter", 0).SetType("number");
|
||||
|
||||
auto projectScopedContainersWithParameters = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithParameters.AddParameters(parameters);
|
||||
|
||||
auto node = parser.ParseExpression("MyParameter");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithParameters,
|
||||
"variableOrProperty");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetAllErrors().size() == 1);
|
||||
REQUIRE(validator.GetAllErrors()[0]->GetMessage() ==
|
||||
"This variable has the same name as a parameter. Consider "
|
||||
"renaming one or the other.");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid parameter (in variable parameter)") {
|
||||
{
|
||||
gd::ParameterMetadataContainer parameters;
|
||||
parameters.InsertNewParameter("MyParameter", 0).SetType("number");
|
||||
|
||||
auto projectScopedContainersWithParameters = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithParameters.AddParameters(parameters);
|
||||
|
||||
auto node = parser.ParseExpression("MyParameter");
|
||||
|
||||
gd::ExpressionValidator validator(
|
||||
platform, projectScopedContainersWithParameters, "variable");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetAllErrors().size() == 1);
|
||||
REQUIRE(validator.GetAllErrors()[0]->GetMessage() ==
|
||||
"This variable has the same name as a parameter. Consider "
|
||||
"renaming one or the other.");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid parameter (parameter with child in variableOrPropertyOrParameter parameter)") {
|
||||
{
|
||||
gd::ParameterMetadataContainer parameters;
|
||||
parameters.InsertNewParameter("MyParameter", 0).SetType("number");
|
||||
|
||||
auto projectScopedContainersWithParameters = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, layout1);
|
||||
projectScopedContainersWithParameters.AddParameters(parameters);
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyParameter.MyChild");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithParameters,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyParameter.MyChild.MyGrandChild");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithParameters,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyParameter[\"MyChild\"]");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithParameters,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
|
||||
{
|
||||
auto node = parser.ParseExpression("MyParameter[0]");
|
||||
|
||||
gd::ExpressionValidator validator(platform,
|
||||
projectScopedContainersWithParameters,
|
||||
"variableOrPropertyOrParameter");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Properties can't have children.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Valid parameter") {
|
||||
gd::ParameterMetadataContainer parameters;
|
||||
parameters.InsertNewParameter("MyParameter1", 0).SetType("number");
|
||||
|
@@ -116,11 +116,14 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterEvent.GetConditions().size() == 0);
|
||||
REQUIRE(setterEvent.GetActions().size() == 1);
|
||||
auto &setterAction = setterEvent.GetActions().at(0);
|
||||
REQUIRE(setterAction.GetType() == "SetNumberVariable");
|
||||
REQUIRE(setterAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "MovementAngle");
|
||||
REQUIRE(setterAction.GetParameter(1).GetPlainString() == "=");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() == "Value");
|
||||
REQUIRE(
|
||||
setterAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedBehavior::SetPropertyMovementAngle");
|
||||
REQUIRE(setterAction.GetParametersCount() == 4);
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterAction.GetParameter(1).GetPlainString() == "Behavior");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() == "=");
|
||||
REQUIRE(setterAction.GetParameter(3).GetPlainString() == "Value");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,12 +206,12 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(getterEvent.GetActions().size() == 1);
|
||||
|
||||
auto &getterCondition = getterEvent.GetConditions().at(0);
|
||||
REQUIRE(getterCondition.GetType() == "BooleanVariable");
|
||||
REQUIRE(getterCondition.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedBehavior::PropertyRotate");
|
||||
REQUIRE(!getterCondition.IsInverted());
|
||||
REQUIRE(getterCondition.GetParametersCount() == 3);
|
||||
REQUIRE(getterCondition.GetParameter(0).GetPlainString() == "Rotate");
|
||||
REQUIRE(getterCondition.GetParameter(1).GetPlainString() == "True");
|
||||
REQUIRE(getterCondition.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(getterCondition.GetParametersCount() == 2);
|
||||
REQUIRE(getterCondition.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(getterCondition.GetParameter(1).GetPlainString() == "Behavior");
|
||||
|
||||
auto &getterAction = getterEvent.GetActions().at(0);
|
||||
REQUIRE(getterAction.GetType() == "SetReturnBoolean");
|
||||
@@ -254,19 +257,19 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterNoEvent.GetActions().size() == 1);
|
||||
|
||||
auto &setterNoCondition = setterNoEvent.GetConditions().at(0);
|
||||
REQUIRE(setterNoCondition.GetType() == "BooleanVariable");
|
||||
REQUIRE(!setterNoCondition.IsInverted());
|
||||
REQUIRE(setterNoCondition.GetParametersCount() == 3);
|
||||
REQUIRE(setterNoCondition.GetParameter(0).GetPlainString() == "Value");
|
||||
REQUIRE(setterNoCondition.GetParameter(1).GetPlainString() == "False");
|
||||
REQUIRE(setterNoCondition.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterNoCondition.GetType() == "GetArgumentAsBoolean");
|
||||
REQUIRE(setterNoCondition.IsInverted());
|
||||
REQUIRE(setterNoCondition.GetParametersCount() == 1);
|
||||
REQUIRE(setterNoCondition.GetParameter(0).GetPlainString() ==
|
||||
"\"Value\"");
|
||||
|
||||
auto &setterNoAction = setterNoEvent.GetActions().at(0);
|
||||
REQUIRE(setterNoAction.GetType() == "SetBooleanVariable");
|
||||
REQUIRE(setterNoAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedBehavior::SetPropertyRotate");
|
||||
REQUIRE(setterNoAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterNoAction.GetParameter(0).GetPlainString() == "Rotate");
|
||||
REQUIRE(setterNoAction.GetParameter(1).GetPlainString() == "False");
|
||||
REQUIRE(setterNoAction.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterNoAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterNoAction.GetParameter(1).GetPlainString() == "Behavior");
|
||||
REQUIRE(setterNoAction.GetParameter(2).GetPlainString() == "no");
|
||||
|
||||
auto &setterYesEvent =
|
||||
dynamic_cast<gd::StandardEvent &>(setter.GetEvents().GetEvent(1));
|
||||
@@ -274,19 +277,19 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterYesEvent.GetActions().size() == 1);
|
||||
|
||||
auto &setterYesCondition = setterYesEvent.GetConditions().at(0);
|
||||
REQUIRE(setterYesCondition.GetType() == "BooleanVariable");
|
||||
REQUIRE(setterYesCondition.GetType() == "GetArgumentAsBoolean");
|
||||
REQUIRE(!setterYesCondition.IsInverted());
|
||||
REQUIRE(setterYesCondition.GetParametersCount() == 3);
|
||||
REQUIRE(setterYesCondition.GetParameter(0).GetPlainString() == "Value");
|
||||
REQUIRE(setterYesCondition.GetParameter(1).GetPlainString() == "True");
|
||||
REQUIRE(setterYesCondition.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterYesCondition.GetParametersCount() == 1);
|
||||
REQUIRE(setterYesCondition.GetParameter(0).GetPlainString() ==
|
||||
"\"Value\"");
|
||||
|
||||
auto &setterYesAction = setterYesEvent.GetActions().at(0);
|
||||
REQUIRE(setterYesAction.GetType() == "SetBooleanVariable");
|
||||
REQUIRE(setterYesAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedBehavior::SetPropertyRotate");
|
||||
REQUIRE(setterYesAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterYesAction.GetParameter(0).GetPlainString() == "Rotate");
|
||||
REQUIRE(setterYesAction.GetParameter(1).GetPlainString() == "True");
|
||||
REQUIRE(setterYesAction.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterYesAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterYesAction.GetParameter(1).GetPlainString() == "Behavior");
|
||||
REQUIRE(setterYesAction.GetParameter(2).GetPlainString() == "yes");
|
||||
}
|
||||
}
|
||||
SECTION("Can generate functions for a number property in an object") {
|
||||
@@ -363,9 +366,11 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterEvent.GetConditions().size() == 0);
|
||||
REQUIRE(setterEvent.GetActions().size() == 1);
|
||||
auto &setterAction = setterEvent.GetActions().at(0);
|
||||
REQUIRE(setterAction.GetType() == "SetNumberVariable");
|
||||
REQUIRE(
|
||||
setterAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedObject::SetPropertyMovementAngle");
|
||||
REQUIRE(setterAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "MovementAngle");
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterAction.GetParameter(1).GetPlainString() == "=");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() == "Value");
|
||||
}
|
||||
@@ -449,12 +454,11 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(getterEvent.GetActions().size() == 1);
|
||||
|
||||
auto &getterCondition = getterEvent.GetConditions().at(0);
|
||||
REQUIRE(getterCondition.GetType() == "BooleanVariable");
|
||||
REQUIRE(getterCondition.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedObject::PropertyRotate");
|
||||
REQUIRE(!getterCondition.IsInverted());
|
||||
REQUIRE(getterCondition.GetParametersCount() == 3);
|
||||
REQUIRE(getterCondition.GetParameter(0).GetPlainString() == "Rotate");
|
||||
REQUIRE(getterCondition.GetParameter(1).GetPlainString() == "True");
|
||||
REQUIRE(getterCondition.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(getterCondition.GetParametersCount() == 1);
|
||||
REQUIRE(getterCondition.GetParameter(0).GetPlainString() == "Object");
|
||||
|
||||
auto &getterAction = getterEvent.GetActions().at(0);
|
||||
REQUIRE(getterAction.GetType() == "SetReturnBoolean");
|
||||
@@ -496,19 +500,18 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterNoEvent.GetActions().size() == 1);
|
||||
|
||||
auto &setterNoCondition = setterNoEvent.GetConditions().at(0);
|
||||
REQUIRE(setterNoCondition.GetType() == "BooleanVariable");
|
||||
REQUIRE(!setterNoCondition.IsInverted());
|
||||
REQUIRE(setterNoCondition.GetParametersCount() == 3);
|
||||
REQUIRE(setterNoCondition.GetParameter(0).GetPlainString() == "Value");
|
||||
REQUIRE(setterNoCondition.GetParameter(1).GetPlainString() == "False");
|
||||
REQUIRE(setterNoCondition.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterNoCondition.GetType() == "GetArgumentAsBoolean");
|
||||
REQUIRE(setterNoCondition.IsInverted());
|
||||
REQUIRE(setterNoCondition.GetParametersCount() == 1);
|
||||
REQUIRE(setterNoCondition.GetParameter(0).GetPlainString() ==
|
||||
"\"Value\"");
|
||||
|
||||
auto &setterNoAction = setterNoEvent.GetActions().at(0);
|
||||
REQUIRE(setterNoAction.GetType() == "SetBooleanVariable");
|
||||
REQUIRE(setterNoAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterNoAction.GetParameter(0).GetPlainString() == "Rotate");
|
||||
REQUIRE(setterNoAction.GetParameter(1).GetPlainString() == "False");
|
||||
REQUIRE(setterNoAction.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterNoAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedObject::SetPropertyRotate");
|
||||
REQUIRE(setterNoAction.GetParametersCount() == 2);
|
||||
REQUIRE(setterNoAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterNoAction.GetParameter(1).GetPlainString() == "no");
|
||||
|
||||
auto &setterYesEvent =
|
||||
dynamic_cast<gd::StandardEvent &>(setter.GetEvents().GetEvent(1));
|
||||
@@ -516,19 +519,18 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterYesEvent.GetActions().size() == 1);
|
||||
|
||||
auto &setterYesCondition = setterYesEvent.GetConditions().at(0);
|
||||
REQUIRE(setterYesCondition.GetType() == "BooleanVariable");
|
||||
REQUIRE(setterYesCondition.GetType() == "GetArgumentAsBoolean");
|
||||
REQUIRE(!setterYesCondition.IsInverted());
|
||||
REQUIRE(setterYesCondition.GetParametersCount() == 3);
|
||||
REQUIRE(setterYesCondition.GetParameter(0).GetPlainString() == "Value");
|
||||
REQUIRE(setterYesCondition.GetParameter(1).GetPlainString() == "True");
|
||||
REQUIRE(setterYesCondition.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterYesCondition.GetParametersCount() == 1);
|
||||
REQUIRE(setterYesCondition.GetParameter(0).GetPlainString() ==
|
||||
"\"Value\"");
|
||||
|
||||
auto &setterYesAction = setterYesEvent.GetActions().at(0);
|
||||
REQUIRE(setterYesAction.GetType() == "SetBooleanVariable");
|
||||
REQUIRE(setterYesAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterYesAction.GetParameter(0).GetPlainString() == "Rotate");
|
||||
REQUIRE(setterYesAction.GetParameter(1).GetPlainString() == "True");
|
||||
REQUIRE(setterYesAction.GetParameter(2).GetPlainString() == "");
|
||||
REQUIRE(setterYesAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedObject::SetPropertyRotate");
|
||||
REQUIRE(setterYesAction.GetParametersCount() == 2);
|
||||
REQUIRE(setterYesAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterYesAction.GetParameter(1).GetPlainString() == "yes");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -586,11 +588,9 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterEvent.GetConditions().size() == 0);
|
||||
REQUIRE(setterEvent.GetActions().size() == 1);
|
||||
auto &setterAction = setterEvent.GetActions().at(0);
|
||||
REQUIRE(setterAction.GetType() == "SetNumberVariable");
|
||||
REQUIRE(setterAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "MovementAngle");
|
||||
REQUIRE(setterAction.GetParameter(1).GetPlainString() == "=");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() == "Value");
|
||||
REQUIRE(setterAction.GetType() ==
|
||||
"MyEventsExtension::MyEventsBasedBehavior::"
|
||||
"SetSharedPropertyMovementAngle");
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -19,7 +19,7 @@
|
||||
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
|
||||
#include "GDCore/Extensions/Platform.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/IDE/ObjectVariableHelper.h"
|
||||
#include "GDCore/IDE/GroupVariableHelper.h"
|
||||
#include "GDCore/IDE/WholeProjectRefactorer.h"
|
||||
#include "GDCore/Project/Behavior.h"
|
||||
#include "GDCore/Project/EventsFunctionsExtension.h"
|
||||
@@ -760,33 +760,33 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
|
||||
// Check the first layout is updated.
|
||||
{
|
||||
REQUIRE(event.GetActions().GetCount() == 40);
|
||||
REQUIRE(event.GetActions().GetCount() == 19);
|
||||
|
||||
// clang-format off
|
||||
// All the actions using the removed variables are kept.
|
||||
REQUIRE(event.GetActions()[1].GetParameter(0).GetPlainString() == "1 + MySceneVariable2");
|
||||
REQUIRE(event.GetActions()[3].GetParameter(0).GetPlainString() == "1 + Object2.MyObjectVariable");
|
||||
REQUIRE(event.GetActions()[5].GetParameter(0).GetPlainString() == "1 + Object2.MyObjectStructureVariable.MyChild");
|
||||
REQUIRE(event.GetActions()[7].GetParameter(0).GetPlainString() == "1 + MySceneStructureVariable2.MyChild");
|
||||
REQUIRE(event.GetActions()[9].GetParameter(0).GetPlainString() == "1 + MyGlobalVariable2");
|
||||
REQUIRE(event.GetActions()[11].GetParameter(0).GetPlainString() == "1 + MyGlobalStructureVariable2.MyChild");
|
||||
REQUIRE(event.GetActions()[13].GetParameter(0).GetPlainString() == "1 + MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object2, MyObjectVariable, Object2, MyObjectVariable)");
|
||||
REQUIRE(event.GetActions()[15].GetParameter(0).GetPlainString() == "1 + MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object2, MyObjectStructureVariable.MyChild, Object2, MyObjectStructureVariable.MyChild)");
|
||||
REQUIRE(event.GetActions()[17].GetParameter(0).GetPlainString() == "1 + Object2.GetObjectVariableAsNumber(MyObjectVariable)");
|
||||
REQUIRE(event.GetActions()[19].GetParameter(0).GetPlainString() == "1 + Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild)");
|
||||
REQUIRE(event.GetActions()[21].GetParameter(0).GetPlainString() == "1 + Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild.GrandChild)");
|
||||
REQUIRE(event.GetActions()[23].GetParameter(0).GetPlainString() == "1 + MyExtension::GetGlobalVariableAsNumber(MyGlobalVariable2)");
|
||||
REQUIRE(event.GetActions()[26].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(MySceneVariable2)");
|
||||
REQUIRE(event.GetActions()[27].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(SharedVariableName)");
|
||||
REQUIRE(event.GetActions()[29].GetParameter(0).GetPlainString() == "1 + MyExtension::GetGlobalVariableAsNumber(MyGlobalStructureVariable2.MyChild)");
|
||||
REQUIRE(event.GetActions()[31].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(MySceneStructureVariable2.MyChild)");
|
||||
REQUIRE(event.GetActions()[33].GetParameter(0).GetPlainString() == "1 + MyExtension::GetGlobalVariableAsNumber(MyGlobalStructureVariable2.MyChild.GrandChild)");
|
||||
REQUIRE(event.GetActions()[35].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(MySceneStructureVariable2.MyChild.GrandChild)");
|
||||
// All the actions using the removed variables are gone.
|
||||
REQUIRE(event.GetActions()[0].GetParameter(0).GetPlainString() == "1 + MySceneVariable2");
|
||||
REQUIRE(event.GetActions()[1].GetParameter(0).GetPlainString() == "1 + Object2.MyObjectVariable");
|
||||
REQUIRE(event.GetActions()[2].GetParameter(0).GetPlainString() == "1 + Object2.MyObjectStructureVariable.MyChild");
|
||||
REQUIRE(event.GetActions()[3].GetParameter(0).GetPlainString() == "1 + MySceneStructureVariable2.MyChild");
|
||||
REQUIRE(event.GetActions()[4].GetParameter(0).GetPlainString() == "1 + MyGlobalVariable2");
|
||||
REQUIRE(event.GetActions()[5].GetParameter(0).GetPlainString() == "1 + MyGlobalStructureVariable2.MyChild");
|
||||
REQUIRE(event.GetActions()[6].GetParameter(0).GetPlainString() == "1 + MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object2, MyObjectVariable, Object2, MyObjectVariable)");
|
||||
REQUIRE(event.GetActions()[7].GetParameter(0).GetPlainString() == "1 + MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object2, MyObjectStructureVariable.MyChild, Object2, MyObjectStructureVariable.MyChild)");
|
||||
REQUIRE(event.GetActions()[8].GetParameter(0).GetPlainString() == "1 + Object2.GetObjectVariableAsNumber(MyObjectVariable)");
|
||||
REQUIRE(event.GetActions()[9].GetParameter(0).GetPlainString() == "1 + Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild)");
|
||||
REQUIRE(event.GetActions()[10].GetParameter(0).GetPlainString() == "1 + Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild.GrandChild)");
|
||||
REQUIRE(event.GetActions()[11].GetParameter(0).GetPlainString() == "1 + MyExtension::GetGlobalVariableAsNumber(MyGlobalVariable2)");
|
||||
REQUIRE(event.GetActions()[12].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(MySceneVariable2)");
|
||||
REQUIRE(event.GetActions()[13].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(SharedVariableName)");
|
||||
REQUIRE(event.GetActions()[14].GetParameter(0).GetPlainString() == "1 + MyExtension::GetGlobalVariableAsNumber(MyGlobalStructureVariable2.MyChild)");
|
||||
REQUIRE(event.GetActions()[15].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(MySceneStructureVariable2.MyChild)");
|
||||
REQUIRE(event.GetActions()[16].GetParameter(0).GetPlainString() == "1 + MyExtension::GetGlobalVariableAsNumber(MyGlobalStructureVariable2.MyChild.GrandChild)");
|
||||
REQUIRE(event.GetActions()[17].GetParameter(0).GetPlainString() == "1 + MyExtension::GetVariableAsNumber(MySceneStructureVariable2.MyChild.GrandChild)");
|
||||
|
||||
REQUIRE(event.GetActions()[39].GetParameter(0).GetPlainString() == "MySceneVariable2");
|
||||
REQUIRE(event.GetActions()[39].GetParameter(1).GetPlainString() == "MyGlobalVariable2");
|
||||
REQUIRE(event.GetActions()[39].GetParameter(2).GetPlainString() == "Object2");
|
||||
REQUIRE(event.GetActions()[39].GetParameter(3).GetPlainString() == "MyObjectVariable");
|
||||
REQUIRE(event.GetActions()[18].GetParameter(0).GetPlainString() == "MySceneVariable2");
|
||||
REQUIRE(event.GetActions()[18].GetParameter(1).GetPlainString() == "MyGlobalVariable2");
|
||||
REQUIRE(event.GetActions()[18].GetParameter(2).GetPlainString() == "Object2");
|
||||
REQUIRE(event.GetActions()[18].GetParameter(3).GetPlainString() == "MyObjectVariable");
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
@@ -1021,140 +1021,6 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
"MyVariable.MyRenamedChild");
|
||||
}
|
||||
|
||||
SECTION("Can rename an object variable") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
|
||||
auto &scene = project.InsertNewLayout("Scene", 0);
|
||||
auto &object = scene.GetObjects().InsertNewObject(
|
||||
project, "MyExtension::Sprite", "Object", 0);
|
||||
object.GetVariables().InsertNew("MyVariable").SetValue(123);
|
||||
auto &instance = scene.GetInitialInstances().InsertNewInitialInstance();
|
||||
instance.SetObjectName("Object");
|
||||
instance.GetVariables().InsertNew("MyVariable").SetValue(456);
|
||||
|
||||
gd::StandardEvent &event =
|
||||
dynamic_cast<gd::StandardEvent &>(scene.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Standard"));
|
||||
|
||||
{
|
||||
gd::Instruction action;
|
||||
action.SetType("SetNumberObjectVariable");
|
||||
action.SetParametersCount(4);
|
||||
action.SetParameter(0, gd::Expression("Object"));
|
||||
action.SetParameter(1, gd::Expression("MyVariable"));
|
||||
action.SetParameter(2, gd::Expression("="));
|
||||
action.SetParameter(3, gd::Expression("Object.MyVariable"));
|
||||
event.GetActions().Insert(action);
|
||||
}
|
||||
|
||||
// Do the changes and launch the refactoring.
|
||||
object.GetVariables().ResetPersistentUuid();
|
||||
gd::SerializerElement originalSerializedVariables;
|
||||
object.GetVariables().SerializeTo(originalSerializedVariables);
|
||||
|
||||
object.GetVariables().Rename("MyVariable", "MyRenamedVariable");
|
||||
auto changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
originalSerializedVariables, object.GetVariables());
|
||||
|
||||
REQUIRE(changeset.oldToNewVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(event.GetActions()[0].GetParameter(1).GetPlainString() ==
|
||||
"MyRenamedVariable");
|
||||
REQUIRE(event.GetActions()[0].GetParameter(3).GetPlainString() ==
|
||||
"Object.MyRenamedVariable");
|
||||
REQUIRE(instance.GetVariables().Get("MyRenamedVariable").GetValue() == 456);
|
||||
}
|
||||
|
||||
SECTION("Can delete an object variable") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
|
||||
auto &scene = project.InsertNewLayout("Scene", 0);
|
||||
auto &object = scene.GetObjects().InsertNewObject(
|
||||
project, "MyExtension::Sprite", "Object", 0);
|
||||
object.GetVariables().InsertNew("MyVariable").SetValue(123);
|
||||
auto &instance = scene.GetInitialInstances().InsertNewInitialInstance();
|
||||
instance.SetObjectName("Object");
|
||||
instance.GetVariables().InsertNew("MyVariable").SetValue(456);
|
||||
|
||||
gd::StandardEvent &event =
|
||||
dynamic_cast<gd::StandardEvent &>(scene.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Standard"));
|
||||
|
||||
{
|
||||
gd::Instruction action;
|
||||
action.SetType("SetNumberObjectVariable");
|
||||
action.SetParametersCount(4);
|
||||
action.SetParameter(0, gd::Expression("Object"));
|
||||
action.SetParameter(1, gd::Expression("MyVariable"));
|
||||
action.SetParameter(2, gd::Expression("="));
|
||||
action.SetParameter(3, gd::Expression("Object.MyVariable"));
|
||||
event.GetActions().Insert(action);
|
||||
}
|
||||
|
||||
// Do the changes and launch the refactoring.
|
||||
object.GetVariables().ResetPersistentUuid();
|
||||
gd::SerializerElement originalSerializedVariables;
|
||||
object.GetVariables().SerializeTo(originalSerializedVariables);
|
||||
|
||||
object.GetVariables().Remove("MyVariable");
|
||||
auto changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
originalSerializedVariables, object.GetVariables());
|
||||
REQUIRE(changeset.removedVariableNames.size() == 1);
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
|
||||
// Events are untouched
|
||||
REQUIRE(scene.GetEvents().size() == 1);
|
||||
REQUIRE(event.GetActions().size() == 1);
|
||||
REQUIRE(event.GetActions()[0].GetParameter(1).GetPlainString() ==
|
||||
"MyVariable");
|
||||
REQUIRE(event.GetActions()[0].GetParameter(3).GetPlainString() ==
|
||||
"Object.MyVariable");
|
||||
// Instance variables are removed
|
||||
REQUIRE(!instance.GetVariables().Has("MyVariable"));
|
||||
}
|
||||
|
||||
SECTION("Can add an object variable") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
|
||||
auto &scene = project.InsertNewLayout("Scene", 0);
|
||||
auto &object = scene.GetObjects().InsertNewObject(
|
||||
project, "MyExtension::Sprite", "Object", 0);
|
||||
auto &instance = scene.GetInitialInstances().InsertNewInitialInstance();
|
||||
instance.SetObjectName("Object");
|
||||
|
||||
// Do the changes and launch the refactoring.
|
||||
object.GetVariables().ResetPersistentUuid();
|
||||
gd::SerializerElement originalSerializedVariables;
|
||||
object.GetVariables().SerializeTo(originalSerializedVariables);
|
||||
|
||||
object.GetVariables().InsertNew("MyVariable").SetValue(123);
|
||||
auto changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
originalSerializedVariables, object.GetVariables());
|
||||
|
||||
REQUIRE(changeset.addedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object.GetVariables(), changeset, originalSerializedVariables);
|
||||
|
||||
// Instance variables are NOT added
|
||||
REQUIRE(!instance.GetVariables().Has("MyVariable"));
|
||||
}
|
||||
|
||||
SECTION("Can rename an object child variable") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
@@ -1196,9 +1062,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
|
||||
REQUIRE(changeset.modifiedVariables.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object.GetVariables(), changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(event.GetActions()[0].GetParameter(1).GetPlainString() ==
|
||||
"MyVariable.MyRenamedChild");
|
||||
@@ -1247,9 +1112,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
|
||||
REQUIRE(changeset.modifiedVariables.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object.GetVariables(), changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(event.GetActions()[0].GetParameter(3).GetPlainString() ==
|
||||
"MyVariable.MyRenamedChild");
|
||||
@@ -1297,9 +1161,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
|
||||
REQUIRE(changeset.modifiedVariables.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object.GetVariables(), changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(event.GetActions()[0].GetParameter(3).GetPlainString() ==
|
||||
"MyVariable.MyChild.MyRenamedGrandChild");
|
||||
@@ -1677,7 +1540,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers =
|
||||
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
REQUIRE(&projectScopedContainers.GetVariablesContainersList()
|
||||
.GetVariablesContainerFromVariableOrPropertyOrParameterName("MyVariable") == &scene.GetVariables());
|
||||
.GetVariablesContainerFromVariableName("MyVariable") == &scene.GetVariables());
|
||||
|
||||
// Do the changes and launch the refactoring.
|
||||
scene.GetVariables().ResetPersistentUuid();
|
||||
@@ -1859,8 +1722,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto &extension = project.InsertNewEventsFunctionsExtension("Extension", 0);
|
||||
extension.GetSceneVariables().InsertNew("MySceneVariable").SetValue(123);
|
||||
|
||||
auto &function =
|
||||
extension.GetEventsFunctions().InsertNewEventsFunction("MyFunction", 0);
|
||||
auto &function = extension.InsertNewEventsFunction("MyFunction", 0);
|
||||
gd::StandardEvent &event =
|
||||
dynamic_cast<gd::StandardEvent &>(function.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Standard"));
|
||||
@@ -2033,9 +1895,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.typeChangedVariableNames.find("MyObjectVariable") !=
|
||||
changeset.typeChangedVariableNames.end());
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object.GetVariables(), changeset, originalSerializedVariables);
|
||||
|
||||
// Check the the action has changed to follow the variable type.
|
||||
REQUIRE(event.GetActions()[0].GetType() == "SetStringObjectVariable");
|
||||
@@ -2085,9 +1946,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.typeChangedVariableNames.find("MyObjectVariable") !=
|
||||
changeset.typeChangedVariableNames.end());
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForObjectVariablesContainer(
|
||||
project, object.GetVariables(), scene.GetInitialInstances(),
|
||||
object.GetName(), changeset, originalSerializedVariables);
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object.GetVariables(), changeset, originalSerializedVariables);
|
||||
|
||||
// Check the the action has changed to follow the variable type.
|
||||
REQUIRE(event.GetActions()[0].GetType() == "SetStringObjectVariable");
|
||||
@@ -2116,7 +1976,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 1);
|
||||
@@ -2148,7 +2008,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 1);
|
||||
@@ -2168,7 +2028,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 0);
|
||||
@@ -2189,7 +2049,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 0);
|
||||
@@ -2214,7 +2074,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2233,9 +2093,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Get("MyGroupVariable").GetValue() == 456);
|
||||
REQUIRE(otherObject.GetVariables().Get("MyGroupVariable").GetValue() ==
|
||||
@@ -2261,7 +2120,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2280,9 +2139,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Get("MyGroupVariable").GetValue() == 456);
|
||||
REQUIRE(otherObject.GetVariables().Get("MyGroupVariable").GetValue() ==
|
||||
@@ -2308,7 +2166,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2329,9 +2187,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Get("MyGroupVariable").GetValue() == 111);
|
||||
REQUIRE(otherObject.GetVariables().Get("MyGroupVariable").GetValue() ==
|
||||
@@ -2357,7 +2214,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2378,9 +2235,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Get("MyGroupVariable").GetValue() == 0);
|
||||
REQUIRE(otherObject.GetVariables().Get("MyGroupVariable").GetValue() ==
|
||||
@@ -2406,7 +2262,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2425,9 +2281,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 0);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Get("MyGroupVariable").GetValue() == 111);
|
||||
REQUIRE(otherObject.GetVariables().Get("MyGroupVariable").GetValue() ==
|
||||
@@ -2462,7 +2317,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 1);
|
||||
@@ -2480,9 +2335,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
originalSerializedVariables, groupVariables);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(newObject.GetVariables().Count() == 2);
|
||||
REQUIRE(newObject.GetVariables().Get("MyGroupVariable").GetValue() == 123);
|
||||
@@ -2514,7 +2368,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2535,9 +2389,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables()
|
||||
.Get("MyGroupVariable")
|
||||
@@ -2574,7 +2427,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2594,9 +2447,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables()
|
||||
.Get("MyGroupVariable")
|
||||
@@ -2633,7 +2485,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2653,9 +2505,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables()
|
||||
.Get("MyGroupVariable")
|
||||
@@ -2706,7 +2557,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2727,9 +2578,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.valueChangedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables()
|
||||
.Get("MyGroupVariable")
|
||||
@@ -2762,14 +2612,11 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto &group = scene.GetObjects().GetObjectGroups().InsertNew("Group");
|
||||
group.AddObject("Object");
|
||||
group.AddObject("OtherObject");
|
||||
auto &instance = scene.GetInitialInstances().InsertNewInitialInstance();
|
||||
instance.SetObjectName("Object");
|
||||
instance.GetVariables().InsertNew("MyGroupVariable").SetValue(456);
|
||||
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2787,13 +2634,11 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.removedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(!object.GetVariables().Has("MyGroupVariable"));
|
||||
REQUIRE(!otherObject.GetVariables().Has("MyGroupVariable"));
|
||||
REQUIRE(!instance.GetVariables().Has("MyGroupVariable"));
|
||||
}
|
||||
|
||||
SECTION("Can add a group variable") {
|
||||
@@ -2813,7 +2658,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 0);
|
||||
@@ -2831,9 +2676,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.addedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Get("MyGroupVariable").GetValue() == 456);
|
||||
REQUIRE(otherObject.GetVariables().Get("MyGroupVariable").GetValue() ==
|
||||
@@ -2859,7 +2703,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Count() == 0);
|
||||
@@ -2877,9 +2721,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.addedVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
// The variable kept its original value.
|
||||
REQUIRE(object.GetVariables().Count() == 1);
|
||||
@@ -2905,9 +2748,6 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto &group = scene.GetObjects().GetObjectGroups().InsertNew("Group");
|
||||
group.AddObject("Object");
|
||||
group.AddObject("OtherObject");
|
||||
auto &instance = scene.GetInitialInstances().InsertNewInitialInstance();
|
||||
instance.SetObjectName("Object");
|
||||
instance.GetVariables().InsertNew("MyGroupVariable").SetValue(456);
|
||||
|
||||
gd::StandardEvent &event =
|
||||
dynamic_cast<gd::StandardEvent &>(scene.GetEvents().InsertNewEvent(
|
||||
@@ -2946,7 +2786,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -2965,9 +2805,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.oldToNewVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(object.GetVariables().Count() == 1);
|
||||
REQUIRE(object.GetVariables().Get("MyRenamedGroupVariable").GetValue() == 123);
|
||||
@@ -2990,7 +2829,6 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
"MyRenamedGroupVariable");
|
||||
REQUIRE(event.GetActions()[2].GetParameter(3).GetPlainString() ==
|
||||
"OtherObject.MyRenamedGroupVariable");
|
||||
REQUIRE(instance.GetVariables().Get("MyRenamedGroupVariable").GetValue() == 456);
|
||||
}
|
||||
|
||||
SECTION("Can rename a group variable when one of the object already has it") {
|
||||
@@ -3048,7 +2886,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -3067,9 +2905,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.oldToNewVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
// The variable kept its original value.
|
||||
REQUIRE(object.GetVariables().Count() == 1);
|
||||
@@ -3154,7 +2991,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -3178,9 +3015,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.modifiedVariables.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(event.GetActions()[0].GetParameter(1).GetPlainString() ==
|
||||
"MyGroupVariable.MyRenamedChild");
|
||||
@@ -3230,7 +3066,7 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForProjectAndLayout(project, scene);
|
||||
gd::VariablesContainer groupVariables =
|
||||
gd::ObjectVariableHelper::MergeVariableContainers(
|
||||
gd::GroupVariableHelper::MergeVariableContainers(
|
||||
projectScopedContainers.GetObjectsContainersList(), group);
|
||||
|
||||
REQUIRE(groupVariables.Has("MyGroupVariable"));
|
||||
@@ -3249,9 +3085,8 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
REQUIRE(changeset.oldToNewVariableNames.size() == 1);
|
||||
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForGroupVariablesContainer(
|
||||
project, project.GetObjects(), scene.GetObjects(),
|
||||
scene.GetInitialInstances(), groupVariables, group, changeset,
|
||||
originalSerializedVariables);
|
||||
project, project.GetObjects(), scene.GetObjects(), groupVariables,
|
||||
group, changeset, originalSerializedVariables);
|
||||
|
||||
REQUIRE(event.GetActions()[0].GetParameter(1).GetPlainString() ==
|
||||
"MyGroupVariable");
|
||||
|
@@ -136,74 +136,6 @@ CreateInstructionWithVariableParameter(gd::Project &project,
|
||||
return event.GetActions().Insert(instruction);
|
||||
}
|
||||
|
||||
const gd::Instruction &
|
||||
CreateNumberVariableSetterAction(gd::Project &project,
|
||||
gd::EventsList &events,
|
||||
const gd::String &variableName,
|
||||
const gd::String &expression) {
|
||||
gd::StandardEvent &event = dynamic_cast<gd::StandardEvent &>(
|
||||
events.InsertNewEvent(project, "BuiltinCommonInstructions::Standard"));
|
||||
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("SetNumberVariable");
|
||||
instruction.SetParametersCount(3);
|
||||
instruction.SetParameter(0, variableName);
|
||||
instruction.SetParameter(1, "=");
|
||||
instruction.SetParameter(2, expression);
|
||||
return event.GetActions().Insert(instruction);
|
||||
}
|
||||
|
||||
const gd::Instruction &
|
||||
CreateNumberVariableGetterCondition(gd::Project &project,
|
||||
gd::EventsList &events,
|
||||
const gd::String &variableName,
|
||||
const gd::String &expression) {
|
||||
gd::StandardEvent &event = dynamic_cast<gd::StandardEvent &>(
|
||||
events.InsertNewEvent(project, "BuiltinCommonInstructions::Standard"));
|
||||
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("NumberVariable");
|
||||
instruction.SetParametersCount(3);
|
||||
instruction.SetParameter(0, variableName);
|
||||
instruction.SetParameter(1, "=");
|
||||
instruction.SetParameter(2, expression);
|
||||
return event.GetConditions().Insert(instruction);
|
||||
}
|
||||
|
||||
const gd::Instruction &
|
||||
CreateStringVariableSetterAction(gd::Project &project,
|
||||
gd::EventsList &events,
|
||||
const gd::String &variableName,
|
||||
const gd::String &expression) {
|
||||
gd::StandardEvent &event = dynamic_cast<gd::StandardEvent &>(
|
||||
events.InsertNewEvent(project, "BuiltinCommonInstructions::Standard"));
|
||||
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("SetStringVariable");
|
||||
instruction.SetParametersCount(3);
|
||||
instruction.SetParameter(0, variableName);
|
||||
instruction.SetParameter(1, "=");
|
||||
instruction.SetParameter(2, expression);
|
||||
return event.GetActions().Insert(instruction);
|
||||
}
|
||||
|
||||
const gd::Instruction &
|
||||
CreateStringVariableGetterCondition(gd::Project &project,
|
||||
gd::EventsList &events,
|
||||
const gd::String &variableName,
|
||||
const gd::String &expression) {
|
||||
gd::StandardEvent &event = dynamic_cast<gd::StandardEvent &>(
|
||||
events.InsertNewEvent(project, "BuiltinCommonInstructions::Standard"));
|
||||
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("StringVariable");
|
||||
instruction.SetParametersCount(3);
|
||||
instruction.SetParameter(0, variableName);
|
||||
instruction.SetParameter(1, "=");
|
||||
instruction.SetParameter(2, expression);
|
||||
return event.GetConditions().Insert(instruction);
|
||||
}
|
||||
|
||||
enum TestEvent {
|
||||
FreeFunctionAction,
|
||||
FreeFunctionWithExpression,
|
||||
@@ -269,9 +201,8 @@ const std::vector<const gd::EventsList *> GetEventsListsNotAssociatedToScene(gd:
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyBehaviorEventsFunction")
|
||||
.GetEvents();
|
||||
auto &freeFunctionEvents = eventsExtension.GetEventsFunctions()
|
||||
.GetEventsFunction("MyOtherEventsFunction")
|
||||
.GetEvents();
|
||||
auto &freeFunctionEvents =
|
||||
eventsExtension.GetEventsFunction("MyOtherEventsFunction").GetEvents();
|
||||
eventLists.push_back(&objectFunctionEvents);
|
||||
eventLists.push_back(&behaviorFunctionEvents);
|
||||
eventLists.push_back(&freeFunctionEvents);
|
||||
@@ -1198,9 +1129,8 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
|
||||
// Add (free) functions and a (free) expression
|
||||
{
|
||||
auto &freeEventsFunctions = eventsExtension.GetEventsFunctions();
|
||||
auto &action =
|
||||
freeEventsFunctions.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
action.GetParameters()
|
||||
.InsertNewParameter("currentScene", 0)
|
||||
.SetType("")
|
||||
@@ -1215,21 +1145,21 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedBehavior");
|
||||
|
||||
auto &expression =
|
||||
freeEventsFunctions.InsertNewEventsFunction("MyEventsFunctionExpression", 1)
|
||||
eventsExtension.InsertNewEventsFunction("MyEventsFunctionExpression", 1)
|
||||
.SetFunctionType(gd::EventsFunction::Expression);
|
||||
expression.GetParameters()
|
||||
.InsertNewParameter("currentScene", 0)
|
||||
.SetType("")
|
||||
.SetCodeOnly(true);
|
||||
|
||||
auto &freeExpressionAndCondition = freeEventsFunctions.InsertNewEventsFunction("MyEventsFunctionExpressionAndCondition", 2)
|
||||
auto &freeExpressionAndCondition = eventsExtension.InsertNewEventsFunction("MyEventsFunctionExpressionAndCondition", 2)
|
||||
.SetFunctionType(gd::EventsFunction::ExpressionAndCondition);
|
||||
freeExpressionAndCondition.GetParameters().InsertNewParameter("Value1", 0)
|
||||
.SetType("expression");
|
||||
freeExpressionAndCondition.GetParameters().InsertNewParameter("Value2", 1)
|
||||
.SetType("expression");
|
||||
|
||||
freeEventsFunctions.InsertNewEventsFunction("MyEventsFunctionActionWithOperator", 2)
|
||||
eventsExtension.InsertNewEventsFunction("MyEventsFunctionActionWithOperator", 2)
|
||||
.SetFunctionType(gd::EventsFunction::ActionWithOperator)
|
||||
.SetGetterName("MyEventsFunctionExpressionAndCondition");
|
||||
}
|
||||
@@ -1238,8 +1168,8 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
// object and behavior.
|
||||
{
|
||||
// Add functions, and parameters that should be there by convention.
|
||||
auto &action = eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyOtherEventsFunction", 0);
|
||||
auto &action =
|
||||
eventsExtension.InsertNewEventsFunction("MyOtherEventsFunction", 0);
|
||||
// Define the same objects as in the layout to be consistent with events.
|
||||
action.GetParameters()
|
||||
.InsertNewParameter("ObjectWithMyBehavior", 0)
|
||||
@@ -1301,8 +1231,7 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyBehaviorEventsFunction")
|
||||
.GetEvents());
|
||||
SetupEvents(eventsExtension.GetEventsFunctions()
|
||||
.GetEventsFunction("MyOtherEventsFunction")
|
||||
SetupEvents(eventsExtension.GetEventsFunction("MyOtherEventsFunction")
|
||||
.GetEvents());
|
||||
}
|
||||
|
||||
@@ -1654,8 +1583,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
// Add a (free) function with an object group
|
||||
gd::EventsFunction &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
gd::ObjectGroup &objectGroup =
|
||||
eventsFunction.GetObjectGroups().InsertNew("MyGroup", 0);
|
||||
objectGroup.AddObject("Object1");
|
||||
@@ -1666,12 +1594,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
// Create the objects container for the events function
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
|
||||
// Trigger the refactoring before the renaming of an object
|
||||
gd::WholeProjectRefactorer::ObjectOrGroupRenamedInEventsFunction(
|
||||
@@ -1692,18 +1618,15 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().GetEventsFunction(
|
||||
"MyOtherEventsFunction");
|
||||
eventsExtension.GetEventsFunction("MyOtherEventsFunction");
|
||||
|
||||
// Create the objects container for the events function
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
|
||||
// Simulate a variable in ObjectWithMyBehavior, even if this is not
|
||||
// supported by the editor.
|
||||
@@ -1945,8 +1868,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
// Add a (free) function with an object group
|
||||
gd::EventsFunction &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
gd::ObjectGroup &objectGroup =
|
||||
eventsFunction.GetObjectGroups().InsertNew("MyGroup", 0);
|
||||
objectGroup.AddObject("Object1");
|
||||
@@ -2144,8 +2066,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
// Add the function used by the instruction that is checked in this test.
|
||||
// When the function doesn't exist the destination extension, the
|
||||
// instruction keeps pointing to the old extension.
|
||||
destinationExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyEventsFunction", 0);
|
||||
destinationExtension.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
|
||||
auto &duplicatedBehavior =
|
||||
destinationExtension.GetEventsBasedBehaviors().InsertNew(
|
||||
@@ -2187,8 +2108,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
// Add the function used by the instruction that is checked in this test.
|
||||
// When the function doesn't exist the destination extension, the
|
||||
// instruction keeps pointing to the old extension.
|
||||
destinationExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyEventsFunction", 0);
|
||||
destinationExtension.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
|
||||
auto &duplicatedObject =
|
||||
destinationExtension.GetEventsBasedObjects().InsertNew(
|
||||
@@ -2297,7 +2217,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
// Free function
|
||||
auto &myEventsFunction =
|
||||
project.GetEventsFunctionsExtension("MyEventsExtension")
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyEventsFunction");
|
||||
REQUIRE(myEventsFunction.GetParameters().GetParameter(1).GetExtraInfo() ==
|
||||
"MyRenamedExtension::MyEventsBasedObject");
|
||||
@@ -2414,10 +2333,8 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
"MyEventsExtension::MyRenamedFunctionExpressionAndCondition");
|
||||
|
||||
// Check that the action still refer to the right ExpressionAndCondition.
|
||||
REQUIRE(eventsExtension.GetEventsFunctions()
|
||||
.GetEventsFunction("MyEventsFunctionActionWithOperator")
|
||||
.GetGetterName() ==
|
||||
"MyRenamedFunctionExpressionAndCondition");
|
||||
REQUIRE(eventsExtension.GetEventsFunction("MyEventsFunctionActionWithOperator")
|
||||
.GetGetterName() == "MyRenamedFunctionExpressionAndCondition");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2428,8 +2345,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyParameter")
|
||||
.GetValueTypeMetadata()
|
||||
@@ -2442,12 +2358,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyParameter", "MyRenamedParameter");
|
||||
@@ -2458,134 +2372,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
"MyExtension::GetVariableAsNumber(MyVariable.MyChild[MyRenamedParameter])");
|
||||
}
|
||||
|
||||
SECTION("(Free function) number parameter renamed (in variable setter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyParameter")
|
||||
.GetValueTypeMetadata()
|
||||
.SetName("number");
|
||||
auto &instruction = CreateNumberVariableSetterAction(
|
||||
project, eventsFunction.GetEvents(), "MyParameter", "123");
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyParameter", "MyRenamedParameter");
|
||||
|
||||
REQUIRE(instruction.GetParameter(0).GetPlainString() ==
|
||||
"MyRenamedParameter");
|
||||
}
|
||||
|
||||
SECTION("(Free function) number parameter renamed (in variable getter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyParameter")
|
||||
.GetValueTypeMetadata()
|
||||
.SetName("number");
|
||||
auto &instruction = CreateNumberVariableGetterCondition(
|
||||
project, eventsFunction.GetEvents(), "MyParameter", "123");
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyParameter", "MyRenamedParameter");
|
||||
|
||||
REQUIRE(instruction.GetParameter(0).GetPlainString() ==
|
||||
"MyRenamedParameter");
|
||||
}
|
||||
|
||||
SECTION("(Free function) parameter type changed (in variable setter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyParameter")
|
||||
.GetValueTypeMetadata()
|
||||
.SetName("number");
|
||||
// The property was of type "string".
|
||||
auto &instruction = CreateStringVariableSetterAction(
|
||||
project, eventsFunction.GetEvents(), "MyParameter", "123");
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
gd::WholeProjectRefactorer::ChangeParameterType(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyParameter");
|
||||
|
||||
REQUIRE(instruction.GetType() == "SetNumberVariable");
|
||||
}
|
||||
|
||||
SECTION("(Free function) parameter type changed (in variable getter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyParameter")
|
||||
.GetValueTypeMetadata()
|
||||
.SetName("number");
|
||||
// The property was of type "string".
|
||||
auto &instruction = CreateStringVariableGetterCondition(
|
||||
project, eventsFunction.GetEvents(), "MyParameter", "123");
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
gd::WholeProjectRefactorer::ChangeParameterType(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyParameter");
|
||||
|
||||
REQUIRE(instruction.GetType() == "NumberVariable");
|
||||
}
|
||||
|
||||
SECTION("(Free function) number parameter not renamed (in variable parameter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
@@ -2593,8 +2379,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyParameter")
|
||||
.GetValueTypeMetadata()
|
||||
@@ -2608,12 +2393,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyParameter", "MyRenamedParameter");
|
||||
@@ -2632,8 +2415,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyObject")
|
||||
.GetValueTypeMetadata()
|
||||
@@ -2649,12 +2431,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyObject", "MyRenamedObject");
|
||||
@@ -2674,8 +2454,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyObject")
|
||||
.GetValueTypeMetadata()
|
||||
@@ -2690,12 +2469,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyObject", "MyRenamedObject");
|
||||
@@ -2714,8 +2491,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyObject")
|
||||
.GetValueTypeMetadata()
|
||||
@@ -2736,12 +2512,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyBehavior", "MyRenamedBehavior");
|
||||
@@ -2761,8 +2535,7 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
auto &eventsFunction =
|
||||
eventsExtension.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyFreeEventsFunction", 0);
|
||||
eventsExtension.InsertNewEventsFunction("MyFreeEventsFunction", 0);
|
||||
eventsFunction.GetParameters()
|
||||
.AddNewParameter("MyObject")
|
||||
.GetValueTypeMetadata()
|
||||
@@ -2782,12 +2555,10 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
|
||||
gd::ObjectsContainer parametersObjectsContainer(
|
||||
gd::ObjectsContainer::SourceType::Function);
|
||||
gd::VariablesContainer parameterVariablesContainer(
|
||||
gd::VariablesContainer::SourceType::Parameters);
|
||||
auto projectScopedContainers = gd::ProjectScopedContainers::
|
||||
MakeNewProjectScopedContainersForFreeEventsFunction(
|
||||
project, eventsExtension, eventsFunction,
|
||||
parametersObjectsContainer, parameterVariablesContainer);
|
||||
parametersObjectsContainer);
|
||||
gd::WholeProjectRefactorer::RenameParameter(
|
||||
project, projectScopedContainers, eventsFunction,
|
||||
parametersObjectsContainer, "MyBehavior", "MyRenamedBehavior");
|
||||
@@ -2956,7 +2727,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
// Free function
|
||||
auto &myEventsFunction =
|
||||
project.GetEventsFunctionsExtension("MyEventsExtension")
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyEventsFunction");
|
||||
REQUIRE(myEventsFunction.GetParameters().GetParameter(2).GetExtraInfo() ==
|
||||
"MyEventsExtension::MyRenamedEventsBasedBehavior");
|
||||
@@ -3067,7 +2837,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
// Free function
|
||||
auto &myEventsFunction =
|
||||
project.GetEventsFunctionsExtension("MyEventsExtension")
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyEventsFunction");
|
||||
REQUIRE(myEventsFunction.GetParameters().GetParameter(1).GetExtraInfo() ==
|
||||
"MyEventsExtension::MyRenamedEventsBasedObject");
|
||||
@@ -3597,54 +3366,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
"MyExtension::GetVariableAsNumber(MyVariable.MyChild[MyRenamedProperty])");
|
||||
}
|
||||
|
||||
SECTION("(Events based behavior) property renamed (in variable setter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedBehavior =
|
||||
eventsExtension.GetEventsBasedBehaviors().Get("MyEventsBasedBehavior");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedBehavior.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyBehaviorEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureBehaviorEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedBehavior);
|
||||
auto &instruction = CreateNumberVariableSetterAction(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
|
||||
project, eventsExtension, eventsBasedBehavior, "MyProperty",
|
||||
"MyRenamedProperty");
|
||||
|
||||
REQUIRE(instruction.GetParameter(0).GetPlainString() ==
|
||||
"MyRenamedProperty");
|
||||
}
|
||||
|
||||
SECTION("(Events based behavior) property renamed (in variable getter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedBehavior =
|
||||
eventsExtension.GetEventsBasedBehaviors().Get("MyEventsBasedBehavior");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedBehavior.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyBehaviorEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureBehaviorEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedBehavior);
|
||||
auto &instruction = CreateNumberVariableGetterCondition(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
|
||||
project, eventsExtension, eventsBasedBehavior, "MyProperty",
|
||||
"MyRenamedProperty");
|
||||
|
||||
REQUIRE(instruction.GetParameter(0).GetPlainString() ==
|
||||
"MyRenamedProperty");
|
||||
}
|
||||
|
||||
SECTION("(Events based behavior) property not renamed (in variable parameter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
@@ -3676,52 +3397,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
"MyExtension::GetVariableAsNumber(MyProperty)");
|
||||
}
|
||||
|
||||
SECTION("(Events based behavior) property type changed (in variable setter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedBehavior =
|
||||
eventsExtension.GetEventsBasedBehaviors().Get("MyEventsBasedBehavior");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedBehavior.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyBehaviorEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureBehaviorEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedBehavior);
|
||||
// The property was of type "string".
|
||||
auto &instruction = CreateStringVariableSetterAction(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::ChangeEventsBasedBehaviorPropertyType(
|
||||
project, eventsExtension, eventsBasedBehavior, "MyProperty");
|
||||
|
||||
REQUIRE(instruction.GetType() == "SetNumberVariable");
|
||||
}
|
||||
|
||||
SECTION("(Events based behavior) property type changed (in variable getter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedBehavior =
|
||||
eventsExtension.GetEventsBasedBehaviors().Get("MyEventsBasedBehavior");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedBehavior.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyBehaviorEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureBehaviorEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedBehavior);
|
||||
// The property was of type "string".
|
||||
auto &instruction = CreateStringVariableGetterCondition(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::ChangeEventsBasedBehaviorPropertyType(
|
||||
project, eventsExtension, eventsBasedBehavior, "MyProperty");
|
||||
|
||||
REQUIRE(instruction.GetType() == "NumberVariable");
|
||||
}
|
||||
|
||||
SECTION("(Events based behavior) shared property renamed") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
@@ -3861,54 +3536,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
"MyExtension::GetVariableAsNumber(MyVariable.MyChild[MyRenamedProperty])");
|
||||
}
|
||||
|
||||
SECTION("(Events based object) property renamed (in variable setter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedObject =
|
||||
eventsExtension.GetEventsBasedObjects().Get("MyEventsBasedObject");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedObject.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyObjectEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureObjectEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedObject);
|
||||
auto &instruction = CreateNumberVariableSetterAction(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::RenameEventsBasedObjectProperty(
|
||||
project, eventsExtension, eventsBasedObject, "MyProperty",
|
||||
"MyRenamedProperty");
|
||||
|
||||
REQUIRE(instruction.GetParameter(0).GetPlainString() ==
|
||||
"MyRenamedProperty");
|
||||
}
|
||||
|
||||
SECTION("(Events based object) property renamed (in variable getter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedObject =
|
||||
eventsExtension.GetEventsBasedObjects().Get("MyEventsBasedObject");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedObject.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyObjectEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureObjectEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedObject);
|
||||
auto &instruction = CreateNumberVariableGetterCondition(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::RenameEventsBasedObjectProperty(
|
||||
project, eventsExtension, eventsBasedObject, "MyProperty",
|
||||
"MyRenamedProperty");
|
||||
|
||||
REQUIRE(instruction.GetParameter(0).GetPlainString() ==
|
||||
"MyRenamedProperty");
|
||||
}
|
||||
|
||||
SECTION("(Events based object) property not renamed (in variable parameter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
@@ -3939,52 +3566,6 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
REQUIRE(instruction2.GetParameter(0).GetPlainString() ==
|
||||
"MyExtension::GetVariableAsNumber(MyProperty)");
|
||||
}
|
||||
|
||||
SECTION("(Events based object) property type changed (in variable setter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedObject =
|
||||
eventsExtension.GetEventsBasedObjects().Get("MyEventsBasedObject");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedObject.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyObjectEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureObjectEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedObject);
|
||||
// The property was of type "string".
|
||||
auto &instruction = CreateStringVariableSetterAction(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::ChangeEventsBasedObjectPropertyType(
|
||||
project, eventsExtension, eventsBasedObject, "MyProperty");
|
||||
|
||||
REQUIRE(instruction.GetType() == "SetNumberVariable");
|
||||
}
|
||||
|
||||
SECTION("(Events based object) property type changed (in variable getter)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
auto &eventsBasedObject =
|
||||
eventsExtension.GetEventsBasedObjects().Get("MyEventsBasedObject");
|
||||
|
||||
auto &behaviorAction =
|
||||
eventsBasedObject.GetEventsFunctions().InsertNewEventsFunction(
|
||||
"MyObjectEventsFunction", 0);
|
||||
gd::WholeProjectRefactorer::EnsureObjectEventsFunctionsProperParameters(
|
||||
eventsExtension, eventsBasedObject);
|
||||
// The property was of type "string".
|
||||
auto &instruction = CreateStringVariableGetterCondition(
|
||||
project, behaviorAction.GetEvents(), "MyProperty", "123");
|
||||
|
||||
gd::WholeProjectRefactorer::ChangeEventsBasedObjectPropertyType(
|
||||
project, eventsExtension, eventsBasedObject, "MyProperty");
|
||||
|
||||
REQUIRE(instruction.GetType() == "NumberVariable");
|
||||
}
|
||||
}
|
||||
// TODO: Check that this works when behaviors are attached to a child-object.
|
||||
TEST_CASE("WholeProjectRefactorer (FindInvalidRequiredBehaviorProperties)",
|
||||
|
@@ -1,4 +1,15 @@
|
||||
namespace gdjs {
|
||||
export interface Object3DDataContent {
|
||||
width: float;
|
||||
height: float;
|
||||
depth: float;
|
||||
}
|
||||
/** Base parameters for {@link gdjs.RuntimeObject3D} */
|
||||
export interface Object3DData extends ObjectData {
|
||||
/** The base parameters of the RuntimeObject3D */
|
||||
content: Object3DDataContent;
|
||||
}
|
||||
|
||||
const getValidDimensionValue = (value: float | undefined) =>
|
||||
value === undefined ? 100 : value <= 0 ? 1 : value;
|
||||
|
||||
@@ -24,8 +35,11 @@ namespace gdjs {
|
||||
*/
|
||||
export abstract class RuntimeObject3D
|
||||
extends gdjs.RuntimeObject
|
||||
implements gdjs.Resizable, gdjs.Scalable, gdjs.Flippable, gdjs.Base3DHandler
|
||||
{
|
||||
implements
|
||||
gdjs.Resizable,
|
||||
gdjs.Scalable,
|
||||
gdjs.Flippable,
|
||||
gdjs.Base3DHandler {
|
||||
/**
|
||||
* Position on the Z axis.
|
||||
*/
|
||||
@@ -70,7 +84,7 @@ namespace gdjs {
|
||||
|
||||
constructor(
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer,
|
||||
objectData: gdjs.Object3DData
|
||||
objectData: Object3DData
|
||||
) {
|
||||
super(instanceContainer, objectData);
|
||||
// TODO Should 0 be replaced by 0.01 instead of using the default value?
|
||||
|
@@ -117,17 +117,6 @@ namespace gdjs {
|
||||
getUnrotatedAABBMaxZ(): number;
|
||||
}
|
||||
|
||||
export interface Object3DDataContent {
|
||||
width: float;
|
||||
height: float;
|
||||
depth: float;
|
||||
}
|
||||
/** Base parameters for {@link gdjs.RuntimeObject3D} */
|
||||
export interface Object3DData extends ObjectData {
|
||||
/** The base parameters of the RuntimeObject3D */
|
||||
content: Object3DDataContent;
|
||||
}
|
||||
|
||||
export namespace Base3DHandler {
|
||||
export const is3D = (
|
||||
object: gdjs.RuntimeObject
|
||||
@@ -142,8 +131,7 @@ namespace gdjs {
|
||||
*/
|
||||
export class Base3DBehavior
|
||||
extends gdjs.RuntimeBehavior
|
||||
implements Base3DHandler
|
||||
{
|
||||
implements Base3DHandler {
|
||||
private object: gdjs.RuntimeObject & Base3DHandler;
|
||||
|
||||
constructor(
|
||||
|
@@ -3,31 +3,31 @@ namespace gdjs {
|
||||
export interface Cube3DObjectData extends Object3DData {
|
||||
/** The base parameters of the Cube3D object */
|
||||
content: Object3DDataContent & {
|
||||
enableTextureTransparency: boolean | undefined;
|
||||
facesOrientation: 'Y' | 'Z' | undefined;
|
||||
enableTextureTransparency: boolean;
|
||||
facesOrientation: 'Y' | 'Z';
|
||||
frontFaceResourceName: string;
|
||||
backFaceResourceName: string;
|
||||
backFaceUpThroughWhichAxisRotation: 'X' | 'Y' | undefined;
|
||||
backFaceUpThroughWhichAxisRotation: 'X' | 'Y';
|
||||
leftFaceResourceName: string;
|
||||
rightFaceResourceName: string;
|
||||
topFaceResourceName: string;
|
||||
bottomFaceResourceName: string;
|
||||
frontFaceResourceRepeat: boolean | undefined;
|
||||
backFaceResourceRepeat: boolean | undefined;
|
||||
leftFaceResourceRepeat: boolean | undefined;
|
||||
rightFaceResourceRepeat: boolean | undefined;
|
||||
topFaceResourceRepeat: boolean | undefined;
|
||||
bottomFaceResourceRepeat: boolean | undefined;
|
||||
frontFaceResourceRepeat: boolean;
|
||||
backFaceResourceRepeat: boolean;
|
||||
leftFaceResourceRepeat: boolean;
|
||||
rightFaceResourceRepeat: boolean;
|
||||
topFaceResourceRepeat: boolean;
|
||||
bottomFaceResourceRepeat: boolean;
|
||||
frontFaceVisible: boolean;
|
||||
backFaceVisible: boolean;
|
||||
leftFaceVisible: boolean;
|
||||
rightFaceVisible: boolean;
|
||||
topFaceVisible: boolean;
|
||||
bottomFaceVisible: boolean;
|
||||
tint: string | undefined;
|
||||
materialType: 'Basic' | 'StandardWithoutMetalness';
|
||||
};
|
||||
}
|
||||
|
||||
type FaceName = 'front' | 'back' | 'left' | 'right' | 'top' | 'bottom';
|
||||
const faceNameToBitmaskIndex = {
|
||||
front: 0,
|
||||
@@ -45,7 +45,6 @@ namespace gdjs {
|
||||
trfb: integer;
|
||||
frn: [string, string, string, string, string, string];
|
||||
mt: number;
|
||||
tint: string;
|
||||
};
|
||||
|
||||
type Cube3DObjectNetworkSyncData = Object3DNetworkSyncData &
|
||||
@@ -68,11 +67,10 @@ namespace gdjs {
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string
|
||||
];
|
||||
_materialType: gdjs.Cube3DRuntimeObject.MaterialType =
|
||||
gdjs.Cube3DRuntimeObject.MaterialType.Basic;
|
||||
_tint: string;
|
||||
|
||||
constructor(
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer,
|
||||
@@ -119,9 +117,6 @@ namespace gdjs {
|
||||
objectData.content.topFaceResourceName,
|
||||
objectData.content.bottomFaceResourceName,
|
||||
];
|
||||
|
||||
this._tint = objectData.content.tint || '255;255;255';
|
||||
|
||||
this._materialType = this._convertMaterialType(
|
||||
objectData.content.materialType
|
||||
);
|
||||
@@ -139,7 +134,7 @@ namespace gdjs {
|
||||
* Sets the visibility of a face of the 3D box.
|
||||
*
|
||||
* @param faceName - The name of the face to set visibility for.
|
||||
* @param enable - The visibility value to set.
|
||||
* @param value - The visibility value to set.
|
||||
*/
|
||||
setFaceVisibility(faceName: FaceName, enable: boolean) {
|
||||
const faceIndex = faceNameToBitmaskIndex[faceName];
|
||||
@@ -162,7 +157,7 @@ namespace gdjs {
|
||||
* Sets the texture repeat of a face of the 3D box.
|
||||
*
|
||||
* @param faceName - The name of the face to set visibility for.
|
||||
* @param enable - The visibility value to set.
|
||||
* @param value - The visibility value to set.
|
||||
*/
|
||||
setRepeatTextureOnFace(faceName: FaceName, enable: boolean) {
|
||||
const faceIndex = faceNameToBitmaskIndex[faceName];
|
||||
@@ -208,22 +203,11 @@ namespace gdjs {
|
||||
if (this._faceResourceNames[faceIndex] === resourceName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._faceResourceNames[faceIndex] = resourceName;
|
||||
this._renderer.updateFace(faceIndex);
|
||||
}
|
||||
|
||||
setColor(tint: string): void {
|
||||
if (this._tint === tint) {
|
||||
return;
|
||||
}
|
||||
this._tint = tint;
|
||||
this._renderer.updateTint();
|
||||
}
|
||||
|
||||
getColor(): string {
|
||||
return this._tint;
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
getFaceAtIndexResourceName(faceIndex: integer): string {
|
||||
return this._faceResourceNames[faceIndex];
|
||||
@@ -307,10 +291,6 @@ namespace gdjs {
|
||||
newObjectData.content.frontFaceResourceName
|
||||
);
|
||||
}
|
||||
if (oldObjectData.content.tint !== newObjectData.content.tint) {
|
||||
this.setColor(newObjectData.content.tint || '255;255;255');
|
||||
}
|
||||
|
||||
if (
|
||||
oldObjectData.content.backFaceResourceName !==
|
||||
newObjectData.content.backFaceResourceName
|
||||
@@ -362,7 +342,7 @@ namespace gdjs {
|
||||
) {
|
||||
this.setRepeatTextureOnFace(
|
||||
'front',
|
||||
newObjectData.content.frontFaceResourceRepeat || false
|
||||
newObjectData.content.frontFaceResourceRepeat
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -371,7 +351,7 @@ namespace gdjs {
|
||||
) {
|
||||
this.setRepeatTextureOnFace(
|
||||
'back',
|
||||
newObjectData.content.backFaceResourceRepeat || false
|
||||
newObjectData.content.backFaceResourceRepeat
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -380,7 +360,7 @@ namespace gdjs {
|
||||
) {
|
||||
this.setRepeatTextureOnFace(
|
||||
'left',
|
||||
newObjectData.content.leftFaceResourceRepeat || false
|
||||
newObjectData.content.leftFaceResourceRepeat
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -389,7 +369,7 @@ namespace gdjs {
|
||||
) {
|
||||
this.setRepeatTextureOnFace(
|
||||
'right',
|
||||
newObjectData.content.rightFaceResourceRepeat || false
|
||||
newObjectData.content.rightFaceResourceRepeat
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -398,7 +378,7 @@ namespace gdjs {
|
||||
) {
|
||||
this.setRepeatTextureOnFace(
|
||||
'top',
|
||||
newObjectData.content.topFaceResourceRepeat || false
|
||||
newObjectData.content.topFaceResourceRepeat
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -407,7 +387,7 @@ namespace gdjs {
|
||||
) {
|
||||
this.setRepeatTextureOnFace(
|
||||
'bottom',
|
||||
newObjectData.content.bottomFaceResourceRepeat || false
|
||||
newObjectData.content.bottomFaceResourceRepeat
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -415,14 +395,14 @@ namespace gdjs {
|
||||
newObjectData.content.backFaceUpThroughWhichAxisRotation
|
||||
) {
|
||||
this.setBackFaceUpThroughWhichAxisRotation(
|
||||
newObjectData.content.backFaceUpThroughWhichAxisRotation || 'X'
|
||||
newObjectData.content.backFaceUpThroughWhichAxisRotation
|
||||
);
|
||||
}
|
||||
if (
|
||||
oldObjectData.content.facesOrientation !==
|
||||
newObjectData.content.facesOrientation
|
||||
) {
|
||||
this.setFacesOrientation(newObjectData.content.facesOrientation || 'Y');
|
||||
this.setFacesOrientation(newObjectData.content.facesOrientation);
|
||||
}
|
||||
if (
|
||||
oldObjectData.content.materialType !==
|
||||
@@ -443,7 +423,6 @@ namespace gdjs {
|
||||
vfb: this._visibleFacesBitmask,
|
||||
trfb: this._textureRepeatFacesBitmask,
|
||||
frn: this._faceResourceNames,
|
||||
tint: this._tint,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -497,12 +476,6 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (networkSyncData.tint !== undefined) {
|
||||
if (this._tint !== networkSyncData.tint) {
|
||||
this._tint = networkSyncData.tint;
|
||||
this._renderer.updateTint();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -62,7 +62,6 @@ namespace gdjs {
|
||||
forceBasicMaterial:
|
||||
runtimeObject._materialType ===
|
||||
gdjs.Cube3DRuntimeObject.MaterialType.Basic,
|
||||
vertexColors: true,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -75,13 +74,15 @@ namespace gdjs {
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer
|
||||
) {
|
||||
const geometry = new THREE.BoxGeometry(1, 1, 1);
|
||||
|
||||
const materials: THREE.Material[] = new Array(6)
|
||||
.fill(0)
|
||||
.map((_, index) =>
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[index])
|
||||
);
|
||||
|
||||
// TODO (3D) - feature: support color instead of texture?
|
||||
const materials = [
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[0]),
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[1]),
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[2]),
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[3]),
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[4]),
|
||||
getFaceMaterial(runtimeObject, materialIndexToFaceIndex[5]),
|
||||
];
|
||||
const boxMesh = new THREE.Mesh(geometry, materials);
|
||||
|
||||
super(runtimeObject, instanceContainer, boxMesh);
|
||||
@@ -91,28 +92,6 @@ namespace gdjs {
|
||||
this.updateSize();
|
||||
this.updatePosition();
|
||||
this.updateRotation();
|
||||
this.updateTint();
|
||||
}
|
||||
|
||||
updateTint() {
|
||||
const tints: number[] = [];
|
||||
|
||||
const normalizedTint = gdjs
|
||||
.rgbOrHexToRGBColor(this._cube3DRuntimeObject.getColor())
|
||||
.map((component) => component / 255);
|
||||
|
||||
for (
|
||||
let i = 0;
|
||||
i < this._boxMesh.geometry.attributes.position.count;
|
||||
i++
|
||||
) {
|
||||
tints.push(...normalizedTint);
|
||||
}
|
||||
|
||||
this._boxMesh.geometry.setAttribute(
|
||||
'color',
|
||||
new THREE.BufferAttribute(new Float32Array(tints), 3)
|
||||
);
|
||||
}
|
||||
|
||||
updateFace(faceIndex: integer) {
|
||||
@@ -142,11 +121,13 @@ namespace gdjs {
|
||||
*/
|
||||
updateTextureUvMapping(faceIndex?: number) {
|
||||
// @ts-ignore - position is stored as a Float32BufferAttribute
|
||||
const pos: THREE.BufferAttribute =
|
||||
this._boxMesh.geometry.getAttribute('position');
|
||||
const pos: THREE.BufferAttribute = this._boxMesh.geometry.getAttribute(
|
||||
'position'
|
||||
);
|
||||
// @ts-ignore - uv is stored as a Float32BufferAttribute
|
||||
const uvMapping: THREE.BufferAttribute =
|
||||
this._boxMesh.geometry.getAttribute('uv');
|
||||
const uvMapping: THREE.BufferAttribute = this._boxMesh.geometry.getAttribute(
|
||||
'uv'
|
||||
);
|
||||
const startIndex =
|
||||
faceIndex === undefined ? 0 : faceIndexToMaterialIndex[faceIndex] * 4;
|
||||
const endIndex =
|
||||
@@ -168,10 +149,9 @@ namespace gdjs {
|
||||
continue;
|
||||
}
|
||||
|
||||
const shouldRepeatTexture =
|
||||
this._cube3DRuntimeObject.shouldRepeatTextureOnFaceAtIndex(
|
||||
materialIndexToFaceIndex[materialIndex]
|
||||
);
|
||||
const shouldRepeatTexture = this._cube3DRuntimeObject.shouldRepeatTextureOnFaceAtIndex(
|
||||
materialIndexToFaceIndex[materialIndex]
|
||||
);
|
||||
|
||||
const shouldOrientateFacesTowardsY =
|
||||
this._cube3DRuntimeObject.getFacesOrientation() === 'Y';
|
||||
@@ -200,10 +180,12 @@ namespace gdjs {
|
||||
if (shouldOrientateFacesTowardsY) {
|
||||
[x, y] = noRepeatTextureVertexIndexToUvMapping[vertexIndex % 4];
|
||||
} else {
|
||||
[x, y] =
|
||||
noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
[
|
||||
x,
|
||||
y,
|
||||
] = noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -229,10 +211,12 @@ namespace gdjs {
|
||||
if (shouldOrientateFacesTowardsY) {
|
||||
[x, y] = noRepeatTextureVertexIndexToUvMapping[vertexIndex % 4];
|
||||
} else {
|
||||
[x, y] =
|
||||
noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
[
|
||||
x,
|
||||
y,
|
||||
] = noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
x = -x;
|
||||
y = -y;
|
||||
}
|
||||
|
@@ -1,11 +1,21 @@
|
||||
namespace gdjs {
|
||||
export interface Object3DDataContent {
|
||||
width: float;
|
||||
height: float;
|
||||
depth: float;
|
||||
}
|
||||
/** Base parameters for {@link gdjs.RuntimeObject3D} */
|
||||
export interface Object3DData extends ObjectData {
|
||||
/** The base parameters of the RuntimeObject3D */
|
||||
content: Object3DDataContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class for 3D custom objects.
|
||||
*/
|
||||
export class CustomRuntimeObject3D
|
||||
extends gdjs.CustomRuntimeObject
|
||||
implements gdjs.Base3DHandler
|
||||
{
|
||||
implements gdjs.Base3DHandler {
|
||||
/**
|
||||
* Position on the Z axis.
|
||||
*/
|
||||
@@ -31,13 +41,13 @@ namespace gdjs {
|
||||
|
||||
constructor(
|
||||
parent: gdjs.RuntimeInstanceContainer,
|
||||
objectData: gdjs.Object3DData & gdjs.CustomObjectConfiguration
|
||||
objectData: Object3DData & CustomObjectConfiguration
|
||||
) {
|
||||
super(parent, objectData);
|
||||
this._renderer.reinitialize(this, parent);
|
||||
}
|
||||
|
||||
protected override _createRender() {
|
||||
protected _createRender() {
|
||||
const parent = this._runtimeScene;
|
||||
return new gdjs.CustomRuntimeObject3DRenderer(
|
||||
this,
|
||||
@@ -46,23 +56,21 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
|
||||
protected override _reinitializeRenderer(): void {
|
||||
protected _reinitializeRenderer(): void {
|
||||
this.getRenderer().reinitialize(this, this.getParent());
|
||||
}
|
||||
|
||||
override getRenderer(): gdjs.CustomRuntimeObject3DRenderer {
|
||||
getRenderer(): gdjs.CustomRuntimeObject3DRenderer {
|
||||
return super.getRenderer() as gdjs.CustomRuntimeObject3DRenderer;
|
||||
}
|
||||
|
||||
override get3DRendererObject() {
|
||||
get3DRendererObject() {
|
||||
// It can't be null because Three.js is always loaded
|
||||
// when a custom 3D object is used.
|
||||
return this.getRenderer().get3DRendererObject()!;
|
||||
}
|
||||
|
||||
override extraInitializationFromInitialInstance(
|
||||
initialInstanceData: InstanceData
|
||||
) {
|
||||
extraInitializationFromInitialInstance(initialInstanceData: InstanceData) {
|
||||
super.extraInitializationFromInitialInstance(initialInstanceData);
|
||||
if (initialInstanceData.depth !== undefined) {
|
||||
this.setDepth(initialInstanceData.depth);
|
||||
@@ -284,7 +292,7 @@ namespace gdjs {
|
||||
return this._maxZ - this._minZ;
|
||||
}
|
||||
|
||||
override _updateUntransformedHitBoxes(): void {
|
||||
_updateUntransformedHitBoxes(): void {
|
||||
super._updateUntransformedHitBoxes();
|
||||
|
||||
let minZ = Number.MAX_VALUE;
|
||||
|
@@ -6,8 +6,7 @@ namespace gdjs {
|
||||
* The renderer for a {@link gdjs.CustomRuntimeObject3D} using Three.js.
|
||||
*/
|
||||
export class CustomRuntimeObject3DRenderer
|
||||
implements gdjs.RuntimeInstanceContainerRenderer
|
||||
{
|
||||
implements gdjs.RuntimeInstanceContainerRenderer {
|
||||
_object: gdjs.CustomRuntimeObject3D;
|
||||
_instanceContainer: gdjs.CustomRuntimeObjectInstanceContainer;
|
||||
_isContainerDirty: boolean = true;
|
||||
@@ -140,16 +139,16 @@ namespace gdjs {
|
||||
imageManager: gdjs.PixiImageManager
|
||||
): ThreeAnimationFrameTextureManager {
|
||||
if (!imageManager._threeAnimationFrameTextureManager) {
|
||||
imageManager._threeAnimationFrameTextureManager =
|
||||
new ThreeAnimationFrameTextureManager(imageManager);
|
||||
imageManager._threeAnimationFrameTextureManager = new ThreeAnimationFrameTextureManager(
|
||||
imageManager
|
||||
);
|
||||
}
|
||||
return imageManager._threeAnimationFrameTextureManager;
|
||||
}
|
||||
}
|
||||
|
||||
class ThreeAnimationFrameTextureManager
|
||||
implements gdjs.AnimationFrameTextureManager<THREE.Material>
|
||||
{
|
||||
implements gdjs.AnimationFrameTextureManager<THREE.Material> {
|
||||
private _imageManager: gdjs.PixiImageManager;
|
||||
|
||||
constructor(imageManager: gdjs.PixiImageManager) {
|
||||
@@ -160,21 +159,20 @@ namespace gdjs {
|
||||
return this._imageManager.getThreeMaterial(imageName, {
|
||||
useTransparentTexture: true,
|
||||
forceBasicMaterial: true,
|
||||
vertexColors: false,
|
||||
});
|
||||
}
|
||||
|
||||
getAnimationFrameWidth(material: THREE.Material) {
|
||||
const map = (
|
||||
material as THREE.MeshBasicMaterial | THREE.MeshStandardMaterial
|
||||
).map;
|
||||
const map = (material as
|
||||
| THREE.MeshBasicMaterial
|
||||
| THREE.MeshStandardMaterial).map;
|
||||
return map ? map.image.width : 0;
|
||||
}
|
||||
|
||||
getAnimationFrameHeight(material: THREE.Material) {
|
||||
const map = (
|
||||
material as THREE.MeshBasicMaterial | THREE.MeshStandardMaterial
|
||||
).map;
|
||||
const map = (material as
|
||||
| THREE.MeshBasicMaterial
|
||||
| THREE.MeshStandardMaterial).map;
|
||||
return map ? map.image.height : 0;
|
||||
}
|
||||
}
|
||||
|
@@ -69,7 +69,7 @@ module.exports = {
|
||||
_('Center Z position'),
|
||||
_('the Z position of the center of rotation'),
|
||||
_('the Z position of the center'),
|
||||
_('Position ❯ Center'),
|
||||
_('Position/Center'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
@@ -800,20 +800,6 @@ module.exports = {
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
.setFunctionName('hasAnimationEnded');
|
||||
|
||||
object
|
||||
.addScopedAction(
|
||||
'SetCrossfadeDuration',
|
||||
_('Set crossfade duration'),
|
||||
_('Set the crossfade duration when switching to a new animation.'),
|
||||
_('Set crossfade duration of _PARAM0_ to _PARAM1_ seconds'),
|
||||
_('Animations and images'),
|
||||
'res/conditions/animation24.png',
|
||||
'res/conditions/animation.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('number', _('Crossfade duration (in seconds)'), '', false)
|
||||
.setFunctionName('setCrossfadeDuration');
|
||||
}
|
||||
|
||||
const Cube3DObject = new gd.ObjectJsImplementation();
|
||||
@@ -836,8 +822,7 @@ module.exports = {
|
||||
propertyName === 'bottomFaceResourceName' ||
|
||||
propertyName === 'backFaceUpThroughWhichAxisRotation' ||
|
||||
propertyName === 'facesOrientation' ||
|
||||
propertyName === 'materialType' ||
|
||||
propertyName === 'tint'
|
||||
propertyName === 'materialType'
|
||||
) {
|
||||
objectContent[propertyName] = newValue;
|
||||
return true;
|
||||
@@ -917,12 +902,6 @@ module.exports = {
|
||||
.setLabel(_('Depth'))
|
||||
.setMeasurementUnit(gd.MeasurementUnit.getPixel())
|
||||
.setGroup(_('Default size'));
|
||||
objectProperties
|
||||
.getOrCreate('tint')
|
||||
.setValue(objectContent.tint || '255;255;255')
|
||||
.setType('Color')
|
||||
.setLabel(_('Tint'))
|
||||
.setGroup(_('Texture'));
|
||||
|
||||
objectProperties
|
||||
.getOrCreate('frontFaceResourceName')
|
||||
@@ -1113,7 +1092,6 @@ module.exports = {
|
||||
topFaceResourceRepeat: false,
|
||||
bottomFaceResourceRepeat: false,
|
||||
materialType: 'Basic',
|
||||
tint: '255;255;255',
|
||||
};
|
||||
|
||||
Cube3DObject.updateInitialInstanceProperty = function (
|
||||
@@ -1590,21 +1568,6 @@ module.exports = {
|
||||
.addParameter('imageResource', _('Image'), '', false)
|
||||
.setFunctionName('setFaceResourceName');
|
||||
|
||||
object
|
||||
.addScopedAction(
|
||||
'SetTint',
|
||||
_('Tint color'),
|
||||
_('Change the tint of the cube.'),
|
||||
_('Change the tint of _PARAM0_ to _PARAM1_'),
|
||||
_('Effects'),
|
||||
'res/actions/color24.png',
|
||||
'res/actions/color.png'
|
||||
)
|
||||
.addParameter('object', _('3D Cube'), 'Cube3DObject', false)
|
||||
.addParameter('color', _('Tint'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setColor');
|
||||
|
||||
extension
|
||||
.addExpressionAndConditionAndAction(
|
||||
'number',
|
||||
@@ -2099,10 +2062,6 @@ module.exports = {
|
||||
3: [1, 0],
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {*} objectConfiguration
|
||||
* @returns {string | null}
|
||||
*/
|
||||
const getFirstVisibleFaceResourceName = (objectConfiguration) => {
|
||||
const object = gd.castObject(
|
||||
objectConfiguration,
|
||||
@@ -2131,44 +2090,25 @@ module.exports = {
|
||||
return null;
|
||||
};
|
||||
|
||||
/** @type {THREE.MeshBasicMaterial | null} */
|
||||
let transparentMaterial = null;
|
||||
/**
|
||||
* @returns {THREE.MeshBasicMaterial}
|
||||
*/
|
||||
const getTransparentMaterial = () => {
|
||||
if (transparentMaterial) {
|
||||
return transparentMaterial;
|
||||
}
|
||||
const newTransparentMaterial = new THREE.MeshBasicMaterial({
|
||||
transparent: true,
|
||||
opacity: 0,
|
||||
// Set the alpha test to to ensure the faces behind are rendered
|
||||
// (no "back face culling" that would still be done if alphaTest is not set).
|
||||
alphaTest: 1,
|
||||
});
|
||||
transparentMaterial = newTransparentMaterial;
|
||||
return newTransparentMaterial;
|
||||
if (!transparentMaterial)
|
||||
transparentMaterial = new THREE.MeshBasicMaterial({
|
||||
transparent: true,
|
||||
opacity: 0,
|
||||
// Set the alpha test to to ensure the faces behind are rendered
|
||||
// (no "back face culling" that would still be done if alphaTest is not set).
|
||||
alphaTest: 1,
|
||||
});
|
||||
|
||||
return transparentMaterial;
|
||||
};
|
||||
|
||||
class RenderedCube3DObject2DInstance extends RenderedInstance {
|
||||
/** @type {number} */
|
||||
_defaultWidth;
|
||||
/** @type {number} */
|
||||
_defaultHeight;
|
||||
/** @type {number} */
|
||||
_defaultDepth;
|
||||
/** @type {number} */
|
||||
_centerX = 0;
|
||||
/** @type {number} */
|
||||
_centerY = 0;
|
||||
/**
|
||||
* The name of the resource that is rendered.
|
||||
* If no face is visible, this will be null.
|
||||
* @type {string | null | undefined}
|
||||
*/
|
||||
_renderedResourceName = undefined;
|
||||
_renderFallbackObject = false;
|
||||
|
||||
constructor(
|
||||
project,
|
||||
@@ -2184,6 +2124,11 @@ module.exports = {
|
||||
pixiContainer,
|
||||
pixiResourcesLoader
|
||||
);
|
||||
|
||||
// Name of the resource that is rendered.
|
||||
// If no face is visible, this will be null.
|
||||
this._renderedResourceName = undefined;
|
||||
|
||||
const object = gd.castObject(
|
||||
this._associatedObjectConfiguration,
|
||||
gd.ObjectJsImplementation
|
||||
@@ -2200,6 +2145,7 @@ module.exports = {
|
||||
this._pixiObject.addChild(this._pixiTexturedObject);
|
||||
this._pixiObject.addChild(this._pixiFallbackObject);
|
||||
this._pixiContainer.addChild(this._pixiObject);
|
||||
this._renderFallbackObject = false;
|
||||
this.updateTexture();
|
||||
}
|
||||
|
||||
@@ -2214,10 +2160,9 @@ module.exports = {
|
||||
}
|
||||
|
||||
static getThumbnail(project, resourcesLoader, objectConfiguration) {
|
||||
const textureResourceName =
|
||||
RenderedCube3DObject2DInstance._getResourceNameToDisplay(
|
||||
objectConfiguration
|
||||
);
|
||||
const textureResourceName = RenderedCube3DObject2DInstance._getResourceNameToDisplay(
|
||||
objectConfiguration
|
||||
);
|
||||
if (textureResourceName) {
|
||||
return resourcesLoader.getResourceFullUrl(
|
||||
project,
|
||||
@@ -2229,20 +2174,18 @@ module.exports = {
|
||||
}
|
||||
|
||||
updateTextureIfNeeded() {
|
||||
const textureName =
|
||||
RenderedCube3DObject2DInstance._getResourceNameToDisplay(
|
||||
this._associatedObjectConfiguration
|
||||
);
|
||||
const textureName = RenderedCube3DObject2DInstance._getResourceNameToDisplay(
|
||||
this._associatedObjectConfiguration
|
||||
);
|
||||
if (textureName === this._renderedResourceName) return;
|
||||
|
||||
this.updateTexture();
|
||||
}
|
||||
|
||||
updateTexture() {
|
||||
const textureName =
|
||||
RenderedCube3DObject2DInstance._getResourceNameToDisplay(
|
||||
this._associatedObjectConfiguration
|
||||
);
|
||||
const textureName = RenderedCube3DObject2DInstance._getResourceNameToDisplay(
|
||||
this._associatedObjectConfiguration
|
||||
);
|
||||
|
||||
if (!textureName) {
|
||||
this._renderFallbackObject = true;
|
||||
@@ -2365,17 +2308,6 @@ module.exports = {
|
||||
}
|
||||
|
||||
class RenderedCube3DObject3DInstance extends Rendered3DInstance {
|
||||
_defaultWidth = 1;
|
||||
_defaultHeight = 1;
|
||||
_defaultDepth = 1;
|
||||
_faceResourceNames = new Array(6).fill(null);
|
||||
_faceVisibilities = new Array(6).fill(null);
|
||||
_shouldRepeatTextureOnFace = new Array(6).fill(null);
|
||||
_facesOrientation = 'Y';
|
||||
_backFaceUpThroughWhichAxisRotation = 'X';
|
||||
_shouldUseTransparentTexture = false;
|
||||
_tint = '';
|
||||
|
||||
constructor(
|
||||
project,
|
||||
instance,
|
||||
@@ -2392,9 +2324,21 @@ module.exports = {
|
||||
threeGroup,
|
||||
pixiResourcesLoader
|
||||
);
|
||||
|
||||
this._defaultWidth = 1;
|
||||
this._defaultHeight = 1;
|
||||
this._defaultDepth = 1;
|
||||
|
||||
this._pixiObject = new PIXI.Graphics();
|
||||
this._pixiContainer.addChild(this._pixiObject);
|
||||
|
||||
this._faceResourceNames = ['', '', '', '', '', ''];
|
||||
this._faceVisibilities = [true, true, true, true, true, true];
|
||||
this._shouldRepeatTextureOnFace = [true, true, true, true, true, true];
|
||||
this._facesOrientation = 'Y';
|
||||
this._backFaceUpThroughWhichAxisRotation = 'X';
|
||||
this._shouldUseTransparentTexture = false;
|
||||
|
||||
const geometry = new THREE.BoxGeometry(1, 1, 1);
|
||||
const materials = [
|
||||
getTransparentMaterial(),
|
||||
@@ -2413,9 +2357,8 @@ module.exports = {
|
||||
|
||||
async _updateThreeObjectMaterials() {
|
||||
const getFaceMaterial = async (project, faceIndex) => {
|
||||
if (!this._faceVisibilities[faceIndex]) {
|
||||
if (!this._faceVisibilities[faceIndex])
|
||||
return getTransparentMaterial();
|
||||
}
|
||||
|
||||
return await this._pixiResourcesLoader.getThreeMaterial(
|
||||
project,
|
||||
@@ -2446,35 +2389,11 @@ module.exports = {
|
||||
this._updateTextureUvMapping();
|
||||
}
|
||||
|
||||
_updateTint() {
|
||||
const tints = [];
|
||||
const normalizedTint = objectsRenderingService
|
||||
.hexNumberToRGBArray(
|
||||
objectsRenderingService.rgbOrHexToHexNumber(this._tint)
|
||||
)
|
||||
.map((component) => component / 255);
|
||||
|
||||
for (
|
||||
let i = 0;
|
||||
i < this._threeObject.geometry.attributes.position.count;
|
||||
i++
|
||||
) {
|
||||
tints.push(...normalizedTint);
|
||||
}
|
||||
|
||||
this._threeObject.geometry.setAttribute(
|
||||
'color',
|
||||
new THREE.BufferAttribute(new Float32Array(tints), 3)
|
||||
);
|
||||
}
|
||||
|
||||
static _getResourceNameToDisplay(objectConfiguration) {
|
||||
return getFirstVisibleFaceResourceName(objectConfiguration);
|
||||
}
|
||||
|
||||
updateThreeObject() {
|
||||
/** @type {gdjs.Cube3DObjectData} */
|
||||
//@ts-ignore This works because the properties are set to `content` in JavaScript.
|
||||
const object = gd.castObject(
|
||||
this._associatedObjectConfiguration,
|
||||
gd.ObjectJsImplementation
|
||||
@@ -2502,19 +2421,13 @@ module.exports = {
|
||||
|
||||
let materialsDirty = false;
|
||||
let uvMappingDirty = false;
|
||||
let tintDirty = false;
|
||||
|
||||
const shouldUseTransparentTexture =
|
||||
object.content.enableTextureTransparency || false;
|
||||
object.content.enableTextureTransparency;
|
||||
if (this._shouldUseTransparentTexture !== shouldUseTransparentTexture) {
|
||||
this._shouldUseTransparentTexture = shouldUseTransparentTexture;
|
||||
materialsDirty = true;
|
||||
}
|
||||
const tint = object.content.tint || '255;255;255';
|
||||
if (this._tint !== tint) {
|
||||
this._tint = tint;
|
||||
tintDirty = true;
|
||||
}
|
||||
|
||||
const faceResourceNames = [
|
||||
object.content.frontFaceResourceName,
|
||||
@@ -2558,12 +2471,12 @@ module.exports = {
|
||||
}
|
||||
|
||||
const shouldRepeatTextureOnFace = [
|
||||
object.content.frontFaceResourceRepeat || false,
|
||||
object.content.backFaceResourceRepeat || false,
|
||||
object.content.leftFaceResourceRepeat || false,
|
||||
object.content.rightFaceResourceRepeat || false,
|
||||
object.content.topFaceResourceRepeat || false,
|
||||
object.content.bottomFaceResourceRepeat || false,
|
||||
object.content.frontFaceResourceRepeat,
|
||||
object.content.backFaceResourceRepeat,
|
||||
object.content.leftFaceResourceRepeat,
|
||||
object.content.rightFaceResourceRepeat,
|
||||
object.content.topFaceResourceRepeat,
|
||||
object.content.bottomFaceResourceRepeat,
|
||||
];
|
||||
if (
|
||||
this._shouldRepeatTextureOnFace[0] !== shouldRepeatTextureOnFace[0] ||
|
||||
@@ -2578,17 +2491,16 @@ module.exports = {
|
||||
}
|
||||
|
||||
const backFaceUpThroughWhichAxisRotation =
|
||||
object.content.backFaceUpThroughWhichAxisRotation || 'X';
|
||||
object.content.backFaceUpThroughWhichAxisRotation;
|
||||
if (
|
||||
backFaceUpThroughWhichAxisRotation !==
|
||||
this._backFaceUpThroughWhichAxisRotation
|
||||
) {
|
||||
this._backFaceUpThroughWhichAxisRotation =
|
||||
backFaceUpThroughWhichAxisRotation;
|
||||
this._backFaceUpThroughWhichAxisRotation = backFaceUpThroughWhichAxisRotation;
|
||||
uvMappingDirty = true;
|
||||
}
|
||||
|
||||
const facesOrientation = object.content.facesOrientation || 'Y';
|
||||
const facesOrientation = object.content.facesOrientation;
|
||||
if (facesOrientation !== this._facesOrientation) {
|
||||
this._facesOrientation = facesOrientation;
|
||||
uvMappingDirty = true;
|
||||
@@ -2608,7 +2520,6 @@ module.exports = {
|
||||
|
||||
if (materialsDirty) this._updateThreeObjectMaterials();
|
||||
if (uvMappingDirty) this._updateTextureUvMapping();
|
||||
if (tintDirty) this._updateTint();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2618,11 +2529,11 @@ module.exports = {
|
||||
* for the method to work.
|
||||
*/
|
||||
_updateTextureUvMapping() {
|
||||
/** @type {THREE.BufferAttribute} */
|
||||
// @ts-ignore - position is stored as a Float32BufferAttribute
|
||||
const pos = this._threeObject.geometry.getAttribute('position');
|
||||
/** @type {THREE.BufferAttribute} */
|
||||
const pos = this._threeObject.geometry.getAttribute('position');
|
||||
// @ts-ignore - uv is stored as a Float32BufferAttribute
|
||||
/** @type {THREE.BufferAttribute} */
|
||||
const uvMapping = this._threeObject.geometry.getAttribute('uv');
|
||||
const startIndex = 0;
|
||||
const endIndex = 23;
|
||||
@@ -2641,10 +2552,9 @@ module.exports = {
|
||||
continue;
|
||||
}
|
||||
|
||||
const shouldRepeatTexture =
|
||||
this._shouldRepeatTextureOnFace[
|
||||
materialIndexToFaceIndex[materialIndex]
|
||||
];
|
||||
const shouldRepeatTexture = this._shouldRepeatTextureOnFace[
|
||||
materialIndexToFaceIndex[materialIndex]
|
||||
];
|
||||
|
||||
const shouldOrientateFacesTowardsY = this._facesOrientation === 'Y';
|
||||
|
||||
@@ -2679,13 +2589,16 @@ module.exports = {
|
||||
}
|
||||
} else {
|
||||
if (shouldOrientateFacesTowardsY) {
|
||||
[x, y] =
|
||||
noRepeatTextureVertexIndexToUvMapping[vertexIndex % 4];
|
||||
[x, y] = noRepeatTextureVertexIndexToUvMapping[
|
||||
vertexIndex % 4
|
||||
];
|
||||
} else {
|
||||
[x, y] =
|
||||
noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
[
|
||||
x,
|
||||
y,
|
||||
] = noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2715,13 +2628,16 @@ module.exports = {
|
||||
}
|
||||
} else {
|
||||
if (shouldOrientateFacesTowardsY) {
|
||||
[x, y] =
|
||||
noRepeatTextureVertexIndexToUvMapping[vertexIndex % 4];
|
||||
[x, y] = noRepeatTextureVertexIndexToUvMapping[
|
||||
vertexIndex % 4
|
||||
];
|
||||
} else {
|
||||
[x, y] =
|
||||
noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
[
|
||||
x,
|
||||
y,
|
||||
] = noRepeatTextureVertexIndexToUvMappingForLeftAndRightFacesTowardsZ[
|
||||
vertexIndex % 4
|
||||
];
|
||||
x = -x;
|
||||
y = -y;
|
||||
}
|
||||
@@ -2870,19 +2786,6 @@ module.exports = {
|
||||
const epsilon = 1 / (1 << 16);
|
||||
|
||||
class Model3DRendered2DInstance extends RenderedInstance {
|
||||
/** @type {number} */
|
||||
_defaultWidth;
|
||||
/** @type {number} */
|
||||
_defaultHeight;
|
||||
/** @type {number} */
|
||||
_defaultDepth;
|
||||
|
||||
/** @type {[number, number, number] | null} */
|
||||
_originPoint;
|
||||
/** @type {[number, number, number] | null} */
|
||||
_centerPoint;
|
||||
|
||||
/** @type {[number, number, number]} */
|
||||
_modelOriginPoint = [0, 0, 0];
|
||||
|
||||
constructor(
|
||||
@@ -3125,15 +3028,10 @@ module.exports = {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {[number, number, number] | null} point1
|
||||
* @param {[number, number, number] | null} point2
|
||||
* @returns {boolean}
|
||||
*/
|
||||
const isSamePoint = (point1, point2) => {
|
||||
if (!!point1 !== !!point2) return false;
|
||||
// At this point || or && doesn't matter and the type checking prefer ||.
|
||||
if (!point1 || !point2) return true;
|
||||
if (!point1 && !point2) return true;
|
||||
if (point1 && !point2) return false;
|
||||
if (!point1 && point2) return false;
|
||||
return (
|
||||
point1[0] === point2[0] &&
|
||||
point1[1] === point2[1] &&
|
||||
@@ -3141,10 +3039,6 @@ module.exports = {
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} location
|
||||
* @returns {[number, number, number] | null}
|
||||
*/
|
||||
const getPointForLocation = (location) => {
|
||||
switch (location) {
|
||||
case 'ModelOrigin':
|
||||
@@ -3163,27 +3057,8 @@ module.exports = {
|
||||
};
|
||||
|
||||
class Model3DRendered3DInstance extends Rendered3DInstance {
|
||||
_defaultWidth = 1;
|
||||
_defaultHeight = 1;
|
||||
_defaultDepth = 1;
|
||||
_originalWidth = 1;
|
||||
_originalHeight = 1;
|
||||
_originalDepth = 1;
|
||||
_rotationX = 0;
|
||||
_rotationY = 0;
|
||||
_rotationZ = 0;
|
||||
_keepAspectRatio = false;
|
||||
/** @type {[number, number, number] | null} */
|
||||
_originPoint = null;
|
||||
/** @type {[number, number, number] | null} */
|
||||
_centerPoint = null;
|
||||
|
||||
/** @type {[number, number, number]} */
|
||||
_modelOriginPoint = [0, 0, 0];
|
||||
|
||||
/** @type {THREE.Object3D | null} */
|
||||
_clonedModel3D = null;
|
||||
|
||||
constructor(
|
||||
project,
|
||||
instance,
|
||||
@@ -3201,12 +3076,29 @@ module.exports = {
|
||||
pixiResourcesLoader
|
||||
);
|
||||
|
||||
this._defaultWidth = 1;
|
||||
this._defaultHeight = 1;
|
||||
this._defaultDepth = 1;
|
||||
this._originalWidth = 1;
|
||||
this._originalHeight = 1;
|
||||
this._originalDepth = 1;
|
||||
this._rotationX = 0;
|
||||
this._rotationY = 0;
|
||||
this._rotationZ = 0;
|
||||
this._keepAspectRatio = false;
|
||||
|
||||
this._originPoint = null;
|
||||
this._centerPoint = null;
|
||||
|
||||
this._pixiObject = new PIXI.Graphics();
|
||||
this._pixiContainer.addChild(this._pixiObject);
|
||||
|
||||
this._threeObject = new THREE.Group();
|
||||
this._threeObject.rotation.order = 'ZYX';
|
||||
this._threeGroup.add(this._threeObject);
|
||||
|
||||
this._threeModelGroup = null;
|
||||
this._clonedModel3D = null;
|
||||
}
|
||||
|
||||
getOriginX() {
|
||||
@@ -3248,30 +3140,27 @@ module.exports = {
|
||||
}
|
||||
|
||||
_updateDefaultTransformation() {
|
||||
if (!this._clonedModel3D) {
|
||||
// Model is not ready - nothing to do.
|
||||
return;
|
||||
}
|
||||
if (!this._clonedModel3D) return; // Model is not ready - nothing to do.
|
||||
|
||||
if (this._threeModelGroup) {
|
||||
// Remove any previous container as we will recreate it just below
|
||||
this._threeObject.clear();
|
||||
}
|
||||
|
||||
// This group hold the rotation defined by properties.
|
||||
// Always restart from a new group to avoid miscomputing bounding boxes/sizes.
|
||||
const threeModelGroup = new THREE.Group();
|
||||
this._threeModelGroup = threeModelGroup;
|
||||
threeModelGroup.rotation.order = 'ZYX';
|
||||
threeModelGroup.add(this._clonedModel3D);
|
||||
this._threeModelGroup = new THREE.Group();
|
||||
this._threeModelGroup.rotation.order = 'ZYX';
|
||||
this._threeModelGroup.add(this._clonedModel3D);
|
||||
|
||||
threeModelGroup.rotation.set(
|
||||
this._threeModelGroup.rotation.set(
|
||||
(this._rotationX * Math.PI) / 180,
|
||||
(this._rotationY * Math.PI) / 180,
|
||||
(this._rotationZ * Math.PI) / 180
|
||||
);
|
||||
threeModelGroup.updateMatrixWorld(true);
|
||||
const boundingBox = new THREE.Box3().setFromObject(threeModelGroup);
|
||||
this._threeModelGroup.updateMatrixWorld(true);
|
||||
const boundingBox = new THREE.Box3().setFromObject(
|
||||
this._threeModelGroup
|
||||
);
|
||||
|
||||
const shouldKeepModelOrigin = !this._originPoint;
|
||||
if (shouldKeepModelOrigin) {
|
||||
@@ -3298,7 +3187,7 @@ module.exports = {
|
||||
// Center the model.
|
||||
const centerPoint = this._centerPoint;
|
||||
if (centerPoint) {
|
||||
threeModelGroup.position.set(
|
||||
this._threeModelGroup.position.set(
|
||||
-(boundingBox.min.x + modelWidth * centerPoint[0]),
|
||||
// The model is flipped on Y axis.
|
||||
-(boundingBox.min.y + modelHeight * (1 - centerPoint[1])),
|
||||
@@ -3307,8 +3196,8 @@ module.exports = {
|
||||
}
|
||||
|
||||
// Rotate the model.
|
||||
threeModelGroup.scale.set(1, 1, 1);
|
||||
threeModelGroup.rotation.set(
|
||||
this._threeModelGroup.scale.set(1, 1, 1);
|
||||
this._threeModelGroup.rotation.set(
|
||||
(this._rotationX * Math.PI) / 180,
|
||||
(this._rotationY * Math.PI) / 180,
|
||||
(this._rotationZ * Math.PI) / 180
|
||||
@@ -3323,8 +3212,8 @@ module.exports = {
|
||||
// Flip on Y because the Y axis is on the opposite side of direct basis.
|
||||
// It avoids models to be like a mirror refection.
|
||||
scaleMatrix.makeScale(scaleX, -scaleY, scaleZ);
|
||||
threeModelGroup.updateMatrix();
|
||||
threeModelGroup.applyMatrix4(scaleMatrix);
|
||||
this._threeModelGroup.updateMatrix();
|
||||
this._threeModelGroup.applyMatrix4(scaleMatrix);
|
||||
|
||||
if (this._keepAspectRatio) {
|
||||
// Reduce the object dimensions to keep aspect ratio.
|
||||
@@ -3391,7 +3280,7 @@ module.exports = {
|
||||
this._defaultDepth = this._originalDepth;
|
||||
}
|
||||
|
||||
this._threeObject.add(threeModelGroup);
|
||||
this._threeObject.add(this._threeModelGroup);
|
||||
}
|
||||
|
||||
updateThreeObject() {
|
||||
|
@@ -23,7 +23,7 @@ Model3DObjectConfiguration::Model3DObjectConfiguration()
|
||||
: width(100), height(100), depth(100), rotationX(0), rotationY(0),
|
||||
rotationZ(0), modelResourceName(""), materialType("StandardWithoutMetalness"),
|
||||
originLocation("ModelOrigin"), centerLocation("ModelOrigin"),
|
||||
keepAspectRatio(true), crossfadeDuration(0.1f) {}
|
||||
keepAspectRatio(true) {}
|
||||
|
||||
bool Model3DObjectConfiguration::UpdateProperty(const gd::String &propertyName,
|
||||
const gd::String &newValue) {
|
||||
@@ -71,10 +71,6 @@ bool Model3DObjectConfiguration::UpdateProperty(const gd::String &propertyName,
|
||||
keepAspectRatio = newValue == "1";
|
||||
return true;
|
||||
}
|
||||
if(propertyName == "crossfadeDuration") {
|
||||
crossfadeDuration = newValue.To<double>();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -171,13 +167,6 @@ Model3DObjectConfiguration::GetProperties() const {
|
||||
.SetGroup(_("Points"))
|
||||
.SetAdvanced(true);
|
||||
|
||||
objectProperties["crossfadeDuration"]
|
||||
.SetValue(gd::String::From(crossfadeDuration))
|
||||
.SetType("number")
|
||||
.SetLabel(_("Crossfade duration"))
|
||||
.SetGroup(_("Animations"))
|
||||
.SetMeasurementUnit(gd::MeasurementUnit::GetSecond());
|
||||
|
||||
return objectProperties;
|
||||
}
|
||||
|
||||
@@ -209,7 +198,6 @@ void Model3DObjectConfiguration::DoUnserializeFrom(
|
||||
originLocation = content.GetStringAttribute("originLocation");
|
||||
centerLocation = content.GetStringAttribute("centerLocation");
|
||||
keepAspectRatio = content.GetBoolAttribute("keepAspectRatio");
|
||||
crossfadeDuration = content.GetDoubleAttribute("crossfadeDuration");
|
||||
|
||||
RemoveAllAnimations();
|
||||
auto &animationsElement = content.GetChild("animations");
|
||||
@@ -238,7 +226,6 @@ void Model3DObjectConfiguration::DoSerializeTo(
|
||||
content.SetAttribute("originLocation", originLocation);
|
||||
content.SetAttribute("centerLocation", centerLocation);
|
||||
content.SetAttribute("keepAspectRatio", keepAspectRatio);
|
||||
content.SetAttribute("crossfadeDuration", crossfadeDuration);
|
||||
|
||||
auto &animationsElement = content.AddChild("animations");
|
||||
animationsElement.ConsiderAsArrayOf("animation");
|
||||
|
@@ -152,7 +152,6 @@ public:
|
||||
double GetRotationX() const { return rotationX; };
|
||||
double GetRotationY() const { return rotationY; };
|
||||
double GetRotationZ() const { return rotationZ; };
|
||||
double GetCrossfadeDuration() const { return crossfadeDuration; };
|
||||
|
||||
const gd::String& GetModelResourceName() const { return modelResourceName; };
|
||||
const gd::String& GetMaterialType() const { return materialType; };
|
||||
@@ -174,7 +173,6 @@ private:
|
||||
double rotationX;
|
||||
double rotationY;
|
||||
double rotationZ;
|
||||
double crossfadeDuration;
|
||||
|
||||
gd::String modelResourceName;
|
||||
gd::String materialType;
|
||||
|
@@ -9,7 +9,6 @@ namespace gdjs {
|
||||
ai: integer;
|
||||
ass: float;
|
||||
ap: boolean;
|
||||
cfd: float;
|
||||
};
|
||||
|
||||
type Model3DObjectNetworkSyncData = Object3DNetworkSyncData &
|
||||
@@ -37,7 +36,6 @@ namespace gdjs {
|
||||
| 'BottomCenterZ'
|
||||
| 'BottomCenterY';
|
||||
animations: Model3DAnimation[];
|
||||
crossfadeDuration: float;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -65,8 +63,7 @@ namespace gdjs {
|
||||
*/
|
||||
export class Model3DRuntimeObject
|
||||
extends gdjs.RuntimeObject3D
|
||||
implements gdjs.Animatable
|
||||
{
|
||||
implements gdjs.Animatable {
|
||||
_renderer: gdjs.Model3DRuntimeObjectRenderer;
|
||||
|
||||
_modelResourceName: string;
|
||||
@@ -100,7 +97,6 @@ namespace gdjs {
|
||||
_currentAnimationIndex: integer = 0;
|
||||
_animationSpeedScale: float = 1;
|
||||
_animationPaused: boolean = false;
|
||||
_crossfadeDuration: float = 0;
|
||||
|
||||
constructor(
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer,
|
||||
@@ -125,8 +121,6 @@ namespace gdjs {
|
||||
|
||||
this.onModelChanged(objectData);
|
||||
|
||||
this._crossfadeDuration = objectData.content.crossfadeDuration || 0;
|
||||
|
||||
// *ALWAYS* call `this.onCreated()` at the very end of your object constructor.
|
||||
this.onCreated();
|
||||
}
|
||||
@@ -208,7 +202,6 @@ namespace gdjs {
|
||||
ai: this._currentAnimationIndex,
|
||||
ass: this._animationSpeedScale,
|
||||
ap: this._animationPaused,
|
||||
cfd: this._crossfadeDuration,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -240,9 +233,6 @@ namespace gdjs {
|
||||
networkSyncData.ap ? this.pauseAnimation() : this.resumeAnimation();
|
||||
}
|
||||
}
|
||||
if (networkSyncData.cfd !== undefined) {
|
||||
this._crossfadeDuration = networkSyncData.cfd;
|
||||
}
|
||||
}
|
||||
|
||||
_reloadModel(objectData: Model3DObjectData) {
|
||||
@@ -358,11 +348,6 @@ namespace gdjs {
|
||||
return this._renderer.hasAnimationEnded();
|
||||
}
|
||||
|
||||
setCrossfadeDuration(duration: number): void {
|
||||
if (this._crossfadeDuration === duration) return;
|
||||
this._crossfadeDuration = duration;
|
||||
}
|
||||
|
||||
isAnimationPaused() {
|
||||
return this._animationPaused;
|
||||
}
|
||||
|
@@ -359,6 +359,7 @@ namespace gdjs {
|
||||
}
|
||||
|
||||
playAnimation(animationName: string, shouldLoop: boolean) {
|
||||
this._animationMixer.stopAllAction();
|
||||
const clip = THREE.AnimationClip.findByName(
|
||||
this._originalModel.animations,
|
||||
animationName
|
||||
@@ -369,25 +370,12 @@ namespace gdjs {
|
||||
);
|
||||
return;
|
||||
}
|
||||
const previousAction = this._action;
|
||||
this._action = this._animationMixer.clipAction(clip);
|
||||
|
||||
// The action must be reset before being reconfigured with setLoop to prevent previous action parameters causing problems
|
||||
// such as animations not playing (not sure to which extends it can cause problems nor the origin of these problems)
|
||||
this._action.reset();
|
||||
this._action.setLoop(
|
||||
shouldLoop ? THREE.LoopRepeat : THREE.LoopOnce,
|
||||
Number.POSITIVE_INFINITY
|
||||
);
|
||||
this._action.clampWhenFinished = true;
|
||||
|
||||
if (previousAction && previousAction !== this._action) {
|
||||
this._action.crossFadeFrom(
|
||||
previousAction,
|
||||
this._model3DRuntimeObject._crossfadeDuration,
|
||||
false
|
||||
);
|
||||
}
|
||||
this._action.play();
|
||||
// Make sure the first frame is displayed.
|
||||
this._animationMixer.update(0);
|
||||
|
@@ -38,7 +38,7 @@ module.exports = {
|
||||
.setName('Consent Cordova plugin')
|
||||
.setDependencyType('cordova')
|
||||
.setExportName('cordova-plugin-consent')
|
||||
.setVersion('3.0.0-alpha.9')
|
||||
.setVersion('3.0.0-alpha.8')
|
||||
.onlyIfOtherDependencyIsExported('AdMob Cordova plugin');
|
||||
|
||||
extension
|
||||
@@ -93,68 +93,6 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.setTestMode');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'PreventAdmobAutoInitialization',
|
||||
_('Prevent AdMob auto initialization'),
|
||||
_(
|
||||
'Prevent AdMob from initializing automatically. You will need to call "Initialize AdMob" action manually.\n' +
|
||||
'This is useful if you want to control when the consent dialog will be shown (for example, after the user has accepted your game terms).'
|
||||
),
|
||||
_('Prevent AdMob auto initialization'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.preventAdmobAutoInitialization');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'InitializeAdmob',
|
||||
_('Initialize AdMob manually'),
|
||||
_(
|
||||
'Initialize AdMob manually. This will trigger the consent dialog if needed, and then load the ads.\n' +
|
||||
'Use this action if you have disabled the auto init and want to control when the consent dialog will be shown.'
|
||||
),
|
||||
_('Initialize AdMob'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.initializeAdmob');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'AdmobInitializing',
|
||||
_('AdMob initializing'),
|
||||
_('Check if AdMob is initializing.'),
|
||||
_('AdMob is initializing'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isAdmobInitializing');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'AdmobInitialized',
|
||||
_('AdMob initialized'),
|
||||
_('Check if AdMob has been initialized.'),
|
||||
_('AdMob has been initialized'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isAdmobInitialized');
|
||||
|
||||
// App Open
|
||||
extension
|
||||
.addCondition(
|
||||
|
@@ -1,7 +1,6 @@
|
||||
namespace gdjs {
|
||||
declare var admob: any;
|
||||
declare var cordova: any;
|
||||
declare var consent: any;
|
||||
|
||||
export namespace adMob {
|
||||
const logger = new gdjs.Logger('AdMob');
|
||||
@@ -109,119 +108,26 @@ namespace gdjs {
|
||||
let rewardedVideoRewardReceived = false; // Becomes true when the video is closed and the reward is received.
|
||||
let rewardedVideoErrored = false; // Becomes true when the video fails to load.
|
||||
|
||||
let npaValue = '0'; // 0 means that the user has consented to personalized ads, 1 means that the user has not consented to personalized ads.
|
||||
|
||||
let setupTimeoutId: NodeJS.Timeout | null = null;
|
||||
|
||||
const askForConsentAndInitializeAdmob = async () => {
|
||||
if (admobStarted) {
|
||||
logger.warn('AdMob is already started.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (isStarting) {
|
||||
logger.warn('AdMob is already starting.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
logger.info('Starting AdMob.');
|
||||
isStarting = true;
|
||||
|
||||
if (cordova.platformId === 'ios') {
|
||||
try {
|
||||
/*
|
||||
trackingStatus:
|
||||
0 = notDetermined
|
||||
1 = restricted
|
||||
2 = denied
|
||||
3 = authorized
|
||||
*/
|
||||
let trackingStatus = await consent.trackingAuthorizationStatus();
|
||||
|
||||
// If tracking is not determined, we ask the user for tracking authorization.
|
||||
if (trackingStatus === 0) {
|
||||
trackingStatus = await consent.requestTrackingAuthorization();
|
||||
}
|
||||
|
||||
// If tracking is restricted or denied, we set npaValue to 1.
|
||||
if (trackingStatus === 1 || trackingStatus === 2) {
|
||||
npaValue = '1';
|
||||
}
|
||||
|
||||
// otherwise, we set npaValue to 0.
|
||||
npaValue = '0';
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
'Error while asking for tracking authorization, continuing:',
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// ConsentStatus:
|
||||
// Unknown = 0,
|
||||
// Required = 1,
|
||||
// NotRequired = 2,
|
||||
// Obtained = 3,
|
||||
const consentStatus = await consent.getConsentStatus();
|
||||
if (consentStatus === consent.ConsentStatus.Required) {
|
||||
await consent.requestInfoUpdate();
|
||||
}
|
||||
await consent.loadAndShowIfRequired();
|
||||
} catch (error) {
|
||||
logger.error('Error while asking for consent, continuing:', error);
|
||||
}
|
||||
|
||||
// We should be looking at canRequestAds to know if we can request ads or not.
|
||||
// But as we want to be able to test ads in debug or if the consent didn't work,
|
||||
// we ignore this value for now.
|
||||
// const canRequestAds = await consent.canRequestAds();
|
||||
if (true) {
|
||||
await admob.start();
|
||||
|
||||
logger.info('AdMob successfully started.');
|
||||
isStarting = false;
|
||||
admobStarted = true;
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('Error while starting AdMob:', error);
|
||||
isStarting = false;
|
||||
admobStarted = false;
|
||||
}
|
||||
};
|
||||
let npaValue = '0'; // TODO: expose an API to change this and also an automatic way using the consent SDK.
|
||||
|
||||
// Admob initialization listener
|
||||
document.addEventListener(
|
||||
'deviceready',
|
||||
async () => {
|
||||
// Obtain user consent ?
|
||||
|
||||
logger.info('Starting AdMob.');
|
||||
isStarting = true;
|
||||
setupTimeoutId = setTimeout(async () => {
|
||||
isStarting = false; // Reset to false, as it will be set to true in askForConsentAndInitializeAdmob.
|
||||
await askForConsentAndInitializeAdmob();
|
||||
// Wait a bit before starting admob, to avoid the consent appearing too soon.
|
||||
}, 2000);
|
||||
|
||||
await admob.start();
|
||||
|
||||
logger.info('AdMob successfully started.');
|
||||
isStarting = false;
|
||||
admobStarted = true;
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
export const preventAdmobAutoInitialization = () => {
|
||||
if (setupTimeoutId) {
|
||||
isStarting = false;
|
||||
clearTimeout(setupTimeoutId);
|
||||
setupTimeoutId = null;
|
||||
}
|
||||
};
|
||||
|
||||
export const initializeAdmob = async () => {
|
||||
preventAdmobAutoInitialization();
|
||||
await askForConsentAndInitializeAdmob();
|
||||
};
|
||||
|
||||
export const isAdmobInitialized = () => admobStarted;
|
||||
export const isAdmobInitializing = () => isStarting;
|
||||
|
||||
/**
|
||||
* Helper to know if we are on mobile and admob is correctly initialized.
|
||||
*/
|
||||
@@ -428,7 +334,6 @@ namespace gdjs {
|
||||
position: atTop ? 'top' : 'bottom',
|
||||
size: bannerRequestedAdSizeType,
|
||||
offset: 0,
|
||||
npa: npaValue,
|
||||
});
|
||||
|
||||
banner.on('load', () => {
|
||||
|
@@ -1,10 +1,10 @@
|
||||
namespace gdjs {
|
||||
/**
|
||||
* Tools to manipulate the game window positioning and
|
||||
* interactions with the operating system.
|
||||
* @author arthuro555
|
||||
*/
|
||||
export namespace evtTools {
|
||||
/**
|
||||
* Tools to manipulate the game window positioning and
|
||||
* interactions with the operating system.
|
||||
* @author arthuro555
|
||||
*/
|
||||
export namespace advancedWindow {
|
||||
const getElectronBrowserWindow = (runtimeScene: gdjs.RuntimeScene) => {
|
||||
try {
|
||||
|
@@ -20,41 +20,25 @@ namespace gdjs {
|
||||
}
|
||||
|
||||
export class AnchorRuntimeBehavior extends gdjs.RuntimeBehavior {
|
||||
// Configuration
|
||||
|
||||
_relativeToOriginalWindowSize: boolean;
|
||||
_relativeToOriginalWindowSize: any;
|
||||
_leftEdgeAnchor: HorizontalAnchor;
|
||||
_rightEdgeAnchor: HorizontalAnchor;
|
||||
_topEdgeAnchor: VerticalAnchor;
|
||||
_bottomEdgeAnchor: VerticalAnchor;
|
||||
_topEdgeAnchor: any;
|
||||
_bottomEdgeAnchor: any;
|
||||
_invalidDistances: boolean = true;
|
||||
_leftEdgeDistance: number = 0;
|
||||
_rightEdgeDistance: number = 0;
|
||||
_topEdgeDistance: number = 0;
|
||||
_bottomEdgeDistance: number = 0;
|
||||
_useLegacyBottomAndRightAnchors: boolean = false;
|
||||
|
||||
// State
|
||||
|
||||
_hasJustBeenCreated: boolean = true;
|
||||
_leftEdgeDistance: float = 0;
|
||||
_rightEdgeDistance: float = 0;
|
||||
_topEdgeDistance: float = 0;
|
||||
_bottomEdgeDistance: float = 0;
|
||||
|
||||
_oldDrawableX: float = 0;
|
||||
_oldDrawableY: float = 0;
|
||||
_oldWidth: float = 0;
|
||||
_oldHeight: float = 0;
|
||||
|
||||
_parentOldMinX: float = 0;
|
||||
_parentOldMinY: float = 0;
|
||||
_parentOldMaxX: float = 0;
|
||||
_parentOldMaxY: float = 0;
|
||||
|
||||
constructor(
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer,
|
||||
behaviorData,
|
||||
owner: gdjs.RuntimeObject
|
||||
) {
|
||||
super(instanceContainer, behaviorData, owner);
|
||||
this._relativeToOriginalWindowSize =
|
||||
!!behaviorData.relativeToOriginalWindowSize;
|
||||
this._relativeToOriginalWindowSize = !!behaviorData.relativeToOriginalWindowSize;
|
||||
this._leftEdgeAnchor = behaviorData.leftEdgeAnchor;
|
||||
this._rightEdgeAnchor = behaviorData.rightEdgeAnchor;
|
||||
this._topEdgeAnchor = behaviorData.topEdgeAnchor;
|
||||
@@ -96,306 +80,265 @@ namespace gdjs {
|
||||
return true;
|
||||
}
|
||||
|
||||
doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
const objectHasMoved =
|
||||
this._oldDrawableX !== this.owner.getDrawableX() ||
|
||||
this._oldDrawableY !== this.owner.getDrawableY() ||
|
||||
this._oldWidth !== this.owner.getWidth() ||
|
||||
this._oldHeight !== this.owner.getHeight();
|
||||
if (objectHasMoved) {
|
||||
this._updateAnchorDistances(instanceContainer);
|
||||
}
|
||||
const parentHasResized =
|
||||
this._parentOldMinX !== instanceContainer.getUnrotatedViewportMinX() ||
|
||||
this._parentOldMinY !== instanceContainer.getUnrotatedViewportMinY() ||
|
||||
this._parentOldMaxX !== instanceContainer.getUnrotatedViewportMaxX() ||
|
||||
this._parentOldMaxY !== instanceContainer.getUnrotatedViewportMaxY();
|
||||
if (parentHasResized) {
|
||||
this._followAnchor(instanceContainer);
|
||||
}
|
||||
onActivate() {
|
||||
this._invalidDistances = true;
|
||||
}
|
||||
|
||||
private _updateAnchorDistances(
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer
|
||||
) {
|
||||
doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
const workingPoint: FloatPoint = gdjs.staticArray(
|
||||
gdjs.AnchorRuntimeBehavior.prototype.doStepPreEvents
|
||||
) as FloatPoint;
|
||||
let parentMinX = instanceContainer.getUnrotatedViewportMinX();
|
||||
let parentMinY = instanceContainer.getUnrotatedViewportMinY();
|
||||
let parentMaxX = instanceContainer.getUnrotatedViewportMaxX();
|
||||
let parentMaxY = instanceContainer.getUnrotatedViewportMaxY();
|
||||
let parentCenterX = (parentMaxX + parentMinX) / 2;
|
||||
let parentCenterY = (parentMaxY + parentMinY) / 2;
|
||||
let parentWidth = parentMaxX - parentMinX;
|
||||
let parentHeight = parentMaxY - parentMinY;
|
||||
const layer = instanceContainer.getLayer(this.owner.getLayer());
|
||||
|
||||
let parentMinX = this._parentOldMinX;
|
||||
let parentMinY = this._parentOldMinY;
|
||||
let parentMaxX = this._parentOldMaxX;
|
||||
let parentMaxY = this._parentOldMaxY;
|
||||
if (this._hasJustBeenCreated) {
|
||||
if (this._invalidDistances) {
|
||||
if (this._relativeToOriginalWindowSize) {
|
||||
parentMinX = instanceContainer.getInitialUnrotatedViewportMinX();
|
||||
parentMinY = instanceContainer.getInitialUnrotatedViewportMinY();
|
||||
parentMaxX = instanceContainer.getInitialUnrotatedViewportMaxX();
|
||||
parentMaxY = instanceContainer.getInitialUnrotatedViewportMaxY();
|
||||
} else {
|
||||
parentMinX = instanceContainer.getUnrotatedViewportMinX();
|
||||
parentMinY = instanceContainer.getUnrotatedViewportMinY();
|
||||
parentMaxX = instanceContainer.getUnrotatedViewportMaxX();
|
||||
parentMaxY = instanceContainer.getUnrotatedViewportMaxY();
|
||||
parentCenterX = (parentMaxX + parentMinX) / 2;
|
||||
parentCenterY = (parentMaxY + parentMinY) / 2;
|
||||
parentWidth = parentMaxX - parentMinX;
|
||||
parentHeight = parentMaxY - parentMinY;
|
||||
}
|
||||
}
|
||||
const parentCenterX = (parentMaxX + parentMinX) / 2;
|
||||
const parentCenterY = (parentMaxY + parentMinY) / 2;
|
||||
const parentWidth = parentMaxX - parentMinX;
|
||||
const parentHeight = parentMaxY - parentMinY;
|
||||
|
||||
//Calculate the distances from the window's bounds.
|
||||
const topLeftPixel = this._relativeToOriginalWindowSize
|
||||
? [this.owner.getDrawableX(), this.owner.getDrawableY()]
|
||||
: this._convertInverseCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
this.owner.getDrawableX(),
|
||||
this.owner.getDrawableY(),
|
||||
workingPoint
|
||||
);
|
||||
//Calculate the distances from the window's bounds.
|
||||
const topLeftPixel = this._relativeToOriginalWindowSize
|
||||
? [this.owner.getDrawableX(), this.owner.getDrawableY()]
|
||||
: this._convertInverseCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
this.owner.getDrawableX(),
|
||||
this.owner.getDrawableY(),
|
||||
workingPoint
|
||||
);
|
||||
|
||||
// Left edge
|
||||
if (this._leftEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
this._leftEdgeDistance = topLeftPixel[0] - parentMinX;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
this._leftEdgeDistance = topLeftPixel[0] - parentMaxX;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
this._leftEdgeDistance = (topLeftPixel[0] - parentMinX) / parentWidth;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
this._leftEdgeDistance = topLeftPixel[0] - parentCenterX;
|
||||
}
|
||||
|
||||
// Top edge
|
||||
if (this._topEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
this._topEdgeDistance = topLeftPixel[1] - parentMinY;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
this._topEdgeDistance = topLeftPixel[1] - parentMaxY;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
this._topEdgeDistance = (topLeftPixel[1] - parentMinY) / parentHeight;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
this._topEdgeDistance = topLeftPixel[1] - parentCenterY;
|
||||
}
|
||||
|
||||
// It's fine to reuse workingPoint as topLeftPixel is no longer used.
|
||||
const bottomRightPixel = this._relativeToOriginalWindowSize
|
||||
? [
|
||||
this.owner.getDrawableX() + this.owner.getWidth(),
|
||||
this.owner.getDrawableY() + this.owner.getHeight(),
|
||||
]
|
||||
: this._convertInverseCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
this.owner.getDrawableX() + this.owner.getWidth(),
|
||||
this.owner.getDrawableY() + this.owner.getHeight(),
|
||||
workingPoint
|
||||
);
|
||||
|
||||
// Right edge
|
||||
if (this._rightEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
this._rightEdgeDistance = bottomRightPixel[0] - parentMinX;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
this._rightEdgeDistance = bottomRightPixel[0] - parentMaxX;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
this._rightEdgeDistance =
|
||||
(bottomRightPixel[0] - parentMinX) / parentWidth;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
this._rightEdgeDistance = bottomRightPixel[0] - parentCenterX;
|
||||
}
|
||||
|
||||
// Bottom edge
|
||||
if (this._bottomEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
this._bottomEdgeDistance = bottomRightPixel[1] - parentMinY;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
this._bottomEdgeDistance = bottomRightPixel[1] - parentMaxY;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
this._bottomEdgeDistance =
|
||||
(bottomRightPixel[1] - parentMinY) / parentHeight;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
this._bottomEdgeDistance = bottomRightPixel[1] - parentCenterY;
|
||||
}
|
||||
|
||||
this._hasJustBeenCreated = false;
|
||||
}
|
||||
|
||||
private _followAnchor(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
const workingPoint: FloatPoint = gdjs.staticArray(
|
||||
gdjs.AnchorRuntimeBehavior.prototype.doStepPreEvents
|
||||
) as FloatPoint;
|
||||
const layer = instanceContainer.getLayer(this.owner.getLayer());
|
||||
|
||||
let parentMinX = instanceContainer.getUnrotatedViewportMinX();
|
||||
let parentMinY = instanceContainer.getUnrotatedViewportMinY();
|
||||
let parentMaxX = instanceContainer.getUnrotatedViewportMaxX();
|
||||
let parentMaxY = instanceContainer.getUnrotatedViewportMaxY();
|
||||
const parentCenterX = (parentMaxX + parentMinX) / 2;
|
||||
const parentCenterY = (parentMaxY + parentMinY) / 2;
|
||||
const parentWidth = parentMaxX - parentMinX;
|
||||
const parentHeight = parentMaxY - parentMinY;
|
||||
|
||||
//Move and resize the object if needed
|
||||
let leftPixel = 0;
|
||||
let topPixel = 0;
|
||||
let rightPixel = 0;
|
||||
let bottomPixel = 0;
|
||||
|
||||
// Left edge
|
||||
if (this._leftEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
leftPixel = parentMinX + this._leftEdgeDistance;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
leftPixel = parentMaxX + this._leftEdgeDistance;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
leftPixel = parentMinX + this._leftEdgeDistance * parentWidth;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
leftPixel = parentCenterX + this._leftEdgeDistance;
|
||||
}
|
||||
|
||||
// Top edge
|
||||
if (this._topEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
topPixel = parentMinY + this._topEdgeDistance;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
topPixel = parentMaxY + this._topEdgeDistance;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
topPixel = parentMinY + this._topEdgeDistance * parentHeight;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
topPixel = parentCenterY + this._topEdgeDistance;
|
||||
}
|
||||
|
||||
// Right edge
|
||||
if (this._rightEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
rightPixel = parentMinX + this._rightEdgeDistance;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
rightPixel = parentMaxX + this._rightEdgeDistance;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
rightPixel = parentMinX + this._rightEdgeDistance * parentWidth;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
rightPixel = parentCenterX + this._rightEdgeDistance;
|
||||
}
|
||||
|
||||
// Bottom edge
|
||||
if (this._bottomEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
bottomPixel = parentMinY + this._bottomEdgeDistance;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
bottomPixel = parentMaxY + this._bottomEdgeDistance;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
bottomPixel = parentMinY + this._bottomEdgeDistance * parentHeight;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
bottomPixel = parentCenterY + this._bottomEdgeDistance;
|
||||
}
|
||||
|
||||
// It's fine to reuse workingPoint as topLeftPixel is no longer used.
|
||||
const topLeftCoord = this._convertCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
leftPixel,
|
||||
topPixel,
|
||||
workingPoint
|
||||
);
|
||||
let left = topLeftCoord[0];
|
||||
let top = topLeftCoord[1];
|
||||
|
||||
const bottomRightCoord = this._convertCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
rightPixel,
|
||||
bottomPixel,
|
||||
workingPoint
|
||||
);
|
||||
const right = bottomRightCoord[0];
|
||||
const bottom = bottomRightCoord[1];
|
||||
|
||||
// Compatibility with GD <= 5.0.133
|
||||
if (this._useLegacyBottomAndRightAnchors) {
|
||||
//Move and resize the object according to the anchors
|
||||
if (this._rightEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setWidth(right - left);
|
||||
// Left edge
|
||||
if (this._leftEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
this._leftEdgeDistance = topLeftPixel[0] - parentMinX;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
this._leftEdgeDistance = topLeftPixel[0] - parentMaxX;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
this._leftEdgeDistance = (topLeftPixel[0] - parentMinX) / parentWidth;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
this._leftEdgeDistance = topLeftPixel[0] - parentCenterX;
|
||||
}
|
||||
if (this._bottomEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setHeight(bottom - top);
|
||||
|
||||
// Top edge
|
||||
if (this._topEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
this._topEdgeDistance = topLeftPixel[1] - parentMinY;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
this._topEdgeDistance = topLeftPixel[1] - parentMaxY;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
this._topEdgeDistance = (topLeftPixel[1] - parentMinY) / parentHeight;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
this._topEdgeDistance = topLeftPixel[1] - parentCenterY;
|
||||
}
|
||||
if (this._leftEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setX(left + this.owner.getX() - this.owner.getDrawableX());
|
||||
|
||||
// It's fine to reuse workingPoint as topLeftPixel is no longer used.
|
||||
const bottomRightPixel = this._relativeToOriginalWindowSize
|
||||
? [
|
||||
this.owner.getDrawableX() + this.owner.getWidth(),
|
||||
this.owner.getDrawableY() + this.owner.getHeight(),
|
||||
]
|
||||
: this._convertInverseCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
this.owner.getDrawableX() + this.owner.getWidth(),
|
||||
this.owner.getDrawableY() + this.owner.getHeight(),
|
||||
workingPoint
|
||||
);
|
||||
|
||||
// Right edge
|
||||
if (this._rightEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
this._rightEdgeDistance = bottomRightPixel[0] - parentMinX;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
this._rightEdgeDistance = bottomRightPixel[0] - parentMaxX;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
this._rightEdgeDistance =
|
||||
(bottomRightPixel[0] - parentMinX) / parentWidth;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
this._rightEdgeDistance = bottomRightPixel[0] - parentCenterX;
|
||||
}
|
||||
if (this._topEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setY(top + this.owner.getY() - this.owner.getDrawableY());
|
||||
|
||||
// Bottom edge
|
||||
if (this._bottomEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
this._bottomEdgeDistance = bottomRightPixel[1] - parentMinY;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
this._bottomEdgeDistance = bottomRightPixel[1] - parentMaxY;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
this._bottomEdgeDistance =
|
||||
(bottomRightPixel[1] - parentMinY) / parentHeight;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
this._bottomEdgeDistance = bottomRightPixel[1] - parentCenterY;
|
||||
}
|
||||
}
|
||||
// End of compatibility code
|
||||
else {
|
||||
// Resize if right and left anchors are set
|
||||
if (
|
||||
this._rightEdgeAnchor !== HorizontalAnchor.None &&
|
||||
this._leftEdgeAnchor !== HorizontalAnchor.None
|
||||
) {
|
||||
const width = right - left;
|
||||
this.owner.setX(
|
||||
this.owner.getX() === this.owner.getDrawableX()
|
||||
? left
|
||||
: // It uses the position of the origin relatively to the object
|
||||
// size to apply it with the new size.
|
||||
// This is the same as doing:
|
||||
// lerp(left, right, (this.owner.getX() - this.owner.getDrawableX() / this.owner.getWidth())
|
||||
// But, the division is done at the end to avoid rounding errors.
|
||||
left +
|
||||
((this.owner.getX() - this.owner.getDrawableX()) * width) /
|
||||
this.owner.getWidth()
|
||||
);
|
||||
this.owner.setWidth(width);
|
||||
} else {
|
||||
|
||||
this._invalidDistances = false;
|
||||
} else {
|
||||
//Move and resize the object if needed
|
||||
let leftPixel = 0;
|
||||
let topPixel = 0;
|
||||
let rightPixel = 0;
|
||||
let bottomPixel = 0;
|
||||
|
||||
// Left edge
|
||||
if (this._leftEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
leftPixel = parentMinX + this._leftEdgeDistance;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
leftPixel = parentMaxX + this._leftEdgeDistance;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
leftPixel = parentMinX + this._leftEdgeDistance * parentWidth;
|
||||
} else if (this._leftEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
leftPixel = parentCenterX + this._leftEdgeDistance;
|
||||
}
|
||||
|
||||
// Top edge
|
||||
if (this._topEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
topPixel = parentMinY + this._topEdgeDistance;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
topPixel = parentMaxY + this._topEdgeDistance;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
topPixel = parentMinY + this._topEdgeDistance * parentHeight;
|
||||
} else if (this._topEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
topPixel = parentCenterY + this._topEdgeDistance;
|
||||
}
|
||||
|
||||
// Right edge
|
||||
if (this._rightEdgeAnchor === HorizontalAnchor.WindowLeft) {
|
||||
rightPixel = parentMinX + this._rightEdgeDistance;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowRight) {
|
||||
rightPixel = parentMaxX + this._rightEdgeDistance;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.Proportional) {
|
||||
rightPixel = parentMinX + this._rightEdgeDistance * parentWidth;
|
||||
} else if (this._rightEdgeAnchor === HorizontalAnchor.WindowCenter) {
|
||||
rightPixel = parentCenterX + this._rightEdgeDistance;
|
||||
}
|
||||
|
||||
// Bottom edge
|
||||
if (this._bottomEdgeAnchor === VerticalAnchor.WindowTop) {
|
||||
bottomPixel = parentMinY + this._bottomEdgeDistance;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowBottom) {
|
||||
bottomPixel = parentMaxY + this._bottomEdgeDistance;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.Proportional) {
|
||||
bottomPixel = parentMinY + this._bottomEdgeDistance * parentHeight;
|
||||
} else if (this._bottomEdgeAnchor === VerticalAnchor.WindowCenter) {
|
||||
bottomPixel = parentCenterY + this._bottomEdgeDistance;
|
||||
}
|
||||
|
||||
// It's fine to reuse workingPoint as topLeftPixel is no longer used.
|
||||
const topLeftCoord = this._convertCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
leftPixel,
|
||||
topPixel,
|
||||
workingPoint
|
||||
);
|
||||
let left = topLeftCoord[0];
|
||||
let top = topLeftCoord[1];
|
||||
|
||||
const bottomRightCoord = this._convertCoords(
|
||||
instanceContainer,
|
||||
layer,
|
||||
rightPixel,
|
||||
bottomPixel,
|
||||
workingPoint
|
||||
);
|
||||
const right = bottomRightCoord[0];
|
||||
const bottom = bottomRightCoord[1];
|
||||
|
||||
// Compatibility with GD <= 5.0.133
|
||||
if (this._useLegacyBottomAndRightAnchors) {
|
||||
//Move and resize the object according to the anchors
|
||||
if (this._rightEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setWidth(right - left);
|
||||
}
|
||||
if (this._bottomEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setHeight(bottom - top);
|
||||
}
|
||||
if (this._leftEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setX(
|
||||
left + this.owner.getX() - this.owner.getDrawableX()
|
||||
);
|
||||
}
|
||||
if (this._rightEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setX(
|
||||
right +
|
||||
this.owner.getX() -
|
||||
this.owner.getDrawableX() -
|
||||
this.owner.getWidth()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Resize if top and bottom anchors are set
|
||||
if (
|
||||
this._bottomEdgeAnchor !== VerticalAnchor.None &&
|
||||
this._topEdgeAnchor !== VerticalAnchor.None
|
||||
) {
|
||||
const height = bottom - top;
|
||||
this.owner.setY(
|
||||
this.owner.getY() === this.owner.getDrawableY()
|
||||
? top
|
||||
: top +
|
||||
((this.owner.getY() - this.owner.getDrawableY()) * height) /
|
||||
this.owner.getHeight()
|
||||
);
|
||||
this.owner.setHeight(height);
|
||||
} else {
|
||||
if (this._topEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setY(
|
||||
top + this.owner.getY() - this.owner.getDrawableY()
|
||||
);
|
||||
}
|
||||
if (this._bottomEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setY(
|
||||
bottom +
|
||||
this.owner.getY() -
|
||||
this.owner.getDrawableY() -
|
||||
this.owner.getHeight()
|
||||
}
|
||||
// End of compatibility code
|
||||
else {
|
||||
// Resize if right and left anchors are set
|
||||
if (
|
||||
this._rightEdgeAnchor !== HorizontalAnchor.None &&
|
||||
this._leftEdgeAnchor !== HorizontalAnchor.None
|
||||
) {
|
||||
const width = right - left;
|
||||
this.owner.setX(
|
||||
this.owner.getX() === this.owner.getDrawableX()
|
||||
? left
|
||||
: // It uses the position of the origin relatively to the object
|
||||
// size to apply it with the new size.
|
||||
// This is the same as doing:
|
||||
// lerp(left, right, (this.owner.getX() - this.owner.getDrawableX() / this.owner.getWidth())
|
||||
// But, the division is done at the end to avoid rounding errors.
|
||||
left +
|
||||
((this.owner.getX() - this.owner.getDrawableX()) * width) /
|
||||
this.owner.getWidth()
|
||||
);
|
||||
this.owner.setWidth(width);
|
||||
} else {
|
||||
if (this._leftEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setX(
|
||||
left + this.owner.getX() - this.owner.getDrawableX()
|
||||
);
|
||||
}
|
||||
if (this._rightEdgeAnchor !== HorizontalAnchor.None) {
|
||||
this.owner.setX(
|
||||
right +
|
||||
this.owner.getX() -
|
||||
this.owner.getDrawableX() -
|
||||
this.owner.getWidth()
|
||||
);
|
||||
}
|
||||
}
|
||||
// Resize if top and bottom anchors are set
|
||||
if (
|
||||
this._bottomEdgeAnchor !== VerticalAnchor.None &&
|
||||
this._topEdgeAnchor !== VerticalAnchor.None
|
||||
) {
|
||||
const height = bottom - top;
|
||||
this.owner.setY(
|
||||
this.owner.getY() === this.owner.getDrawableY()
|
||||
? top
|
||||
: top +
|
||||
((this.owner.getY() - this.owner.getDrawableY()) * height) /
|
||||
this.owner.getHeight()
|
||||
);
|
||||
this.owner.setHeight(height);
|
||||
} else {
|
||||
if (this._topEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setY(
|
||||
top + this.owner.getY() - this.owner.getDrawableY()
|
||||
);
|
||||
}
|
||||
if (this._bottomEdgeAnchor !== VerticalAnchor.None) {
|
||||
this.owner.setY(
|
||||
bottom +
|
||||
this.owner.getY() -
|
||||
this.owner.getDrawableY() -
|
||||
this.owner.getHeight()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
this._oldDrawableX = this.owner.getDrawableX();
|
||||
this._oldDrawableY = this.owner.getDrawableY();
|
||||
this._oldWidth = this.owner.getWidth();
|
||||
this._oldHeight = this.owner.getHeight();
|
||||
|
||||
this._parentOldMinX = instanceContainer.getUnrotatedViewportMinX();
|
||||
this._parentOldMinY = instanceContainer.getUnrotatedViewportMinY();
|
||||
this._parentOldMaxX = instanceContainer.getUnrotatedViewportMaxX();
|
||||
this._parentOldMaxY = instanceContainer.getUnrotatedViewportMaxY();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -54,7 +54,7 @@ module.exports = {
|
||||
objectProperties
|
||||
.getOrCreate('text')
|
||||
.setValue(objectContent.text)
|
||||
.setType('multilinestring')
|
||||
.setType('textarea')
|
||||
.setLabel(_('BBCode text'));
|
||||
|
||||
objectProperties
|
||||
@@ -106,7 +106,8 @@ module.exports = {
|
||||
return objectProperties;
|
||||
};
|
||||
objectBBText.content = {
|
||||
text: '[b]bold[/b] [i]italic[/i] [size=15]smaller[/size] [font=times]times[/font] font\n[spacing=12]spaced out[/spacing]\n[outline=yellow]outlined[/outline] [shadow=red]DropShadow[/shadow] ',
|
||||
text:
|
||||
'[b]bold[/b] [i]italic[/i] [size=15]smaller[/size] [font=times]times[/font] font\n[spacing=12]spaced out[/spacing]\n[outline=yellow]outlined[/outline] [shadow=red]DropShadow[/shadow] ',
|
||||
opacity: 255,
|
||||
fontSize: 20,
|
||||
visible: true,
|
||||
@@ -192,10 +193,9 @@ module.exports = {
|
||||
parameterType === 'string' ||
|
||||
parameterType === 'stringWithSelector'
|
||||
) {
|
||||
const parameterOptions =
|
||||
gd.ParameterOptions.makeNewOptions().setDescription(
|
||||
property.paramLabel
|
||||
);
|
||||
const parameterOptions = gd.ParameterOptions.makeNewOptions().setDescription(
|
||||
property.paramLabel
|
||||
);
|
||||
if (property.options) {
|
||||
parameterOptions.setTypeExtraInfo(
|
||||
stringifyOptions(property.options)
|
||||
@@ -245,10 +245,9 @@ module.exports = {
|
||||
parameterType === 'number' ||
|
||||
parameterType === 'stringWithSelector'
|
||||
) {
|
||||
const parameterOptions =
|
||||
gd.ParameterOptions.makeNewOptions().setDescription(
|
||||
property.paramLabel
|
||||
);
|
||||
const parameterOptions = gd.ParameterOptions.makeNewOptions().setDescription(
|
||||
property.paramLabel
|
||||
);
|
||||
if (property.options) {
|
||||
parameterOptions.setTypeExtraInfo(
|
||||
stringifyOptions(property.options)
|
||||
|
@@ -43,8 +43,7 @@ namespace gdjs {
|
||||
*/
|
||||
export class BBTextRuntimeObject
|
||||
extends gdjs.RuntimeObject
|
||||
implements gdjs.OpacityHandler
|
||||
{
|
||||
implements gdjs.OpacityHandler {
|
||||
_opacity: float;
|
||||
|
||||
_text: string;
|
||||
|
@@ -54,7 +54,7 @@ module.exports = {
|
||||
objectProperties
|
||||
.getOrCreate('text')
|
||||
.setValue(objectContent.text)
|
||||
.setType('multilinestring')
|
||||
.setType('textarea')
|
||||
.setLabel(_('Text'));
|
||||
|
||||
objectProperties
|
||||
@@ -107,7 +107,8 @@ module.exports = {
|
||||
return objectProperties;
|
||||
};
|
||||
bitmapTextObject.content = {
|
||||
text: 'This text use the default bitmap font.\nUse a custom Bitmap Font to create your own texts.',
|
||||
text:
|
||||
'This text use the default bitmap font.\nUse a custom Bitmap Font to create your own texts.',
|
||||
opacity: 255,
|
||||
scale: 1,
|
||||
fontSize: 20,
|
||||
@@ -664,8 +665,9 @@ module.exports = {
|
||||
this._pixiObject.align = align;
|
||||
|
||||
const color = object.content.tint;
|
||||
this._pixiObject.tint =
|
||||
objectsRenderingService.rgbOrHexToHexNumber(color);
|
||||
this._pixiObject.tint = objectsRenderingService.rgbOrHexToHexNumber(
|
||||
color
|
||||
);
|
||||
|
||||
const scale = object.content.scale;
|
||||
this._pixiObject.scale.set(scale);
|
||||
|
@@ -173,6 +173,5 @@ namespace gdjs {
|
||||
return this._pixiObject.textHeight * this.getScale();
|
||||
}
|
||||
}
|
||||
export const BitmapTextRuntimeObjectRenderer =
|
||||
BitmapTextRuntimeObjectPixiRenderer;
|
||||
export const BitmapTextRuntimeObjectRenderer = BitmapTextRuntimeObjectPixiRenderer;
|
||||
}
|
||||
|
@@ -52,8 +52,7 @@ namespace gdjs {
|
||||
*/
|
||||
export class BitmapTextRuntimeObject
|
||||
extends gdjs.RuntimeObject
|
||||
implements gdjs.TextContainer, gdjs.OpacityHandler, gdjs.Scalable
|
||||
{
|
||||
implements gdjs.TextContainer, gdjs.OpacityHandler, gdjs.Scalable {
|
||||
_opacity: float;
|
||||
_text: string;
|
||||
/** color in format [r, g, b], where each component is in the range [0, 255] */
|
||||
|
@@ -249,16 +249,13 @@ namespace gdjs {
|
||||
(clipTextEnd === 0 || clipTextEnd !== dialogueText.length)
|
||||
) {
|
||||
pauseScrolling = true;
|
||||
setTimeout(
|
||||
function () {
|
||||
pauseScrolling = false;
|
||||
commandCalls.splice(index, 1);
|
||||
if (gdjs.dialogueTree.getVariable('debug')) {
|
||||
logger.info('CMD:', call);
|
||||
}
|
||||
},
|
||||
parseInt(call.params[1], 10)
|
||||
);
|
||||
setTimeout(function () {
|
||||
pauseScrolling = false;
|
||||
commandCalls.splice(index, 1);
|
||||
if (gdjs.dialogueTree.getVariable('debug')) {
|
||||
logger.info('CMD:', call);
|
||||
}
|
||||
}, parseInt(call.params[1], 10));
|
||||
}
|
||||
if (call.cmd === command) {
|
||||
commandParameters = call.params;
|
||||
|
@@ -157,8 +157,9 @@ namespace gdjs {
|
||||
if (!instanceContainer.touchDraggableManagers[touchId]) {
|
||||
//Create the shared manager if necessary.
|
||||
// @ts-ignore
|
||||
instanceContainer.touchDraggableManagers[touchId] =
|
||||
new DraggableManager(instanceContainer, touchId);
|
||||
instanceContainer.touchDraggableManagers[
|
||||
touchId
|
||||
] = new DraggableManager(instanceContainer, touchId);
|
||||
}
|
||||
// @ts-ignore
|
||||
return instanceContainer.touchDraggableManagers[touchId];
|
||||
|
@@ -22,8 +22,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const adjustmentFilter =
|
||||
filter as unknown as PIXI.filters.AdjustmentFilter;
|
||||
const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter;
|
||||
if (parameterName === 'gamma') {
|
||||
adjustmentFilter.gamma = value;
|
||||
} else if (parameterName === 'saturation') {
|
||||
@@ -43,8 +42,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const adjustmentFilter =
|
||||
filter as unknown as PIXI.filters.AdjustmentFilter;
|
||||
const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter;
|
||||
if (parameterName === 'gamma') {
|
||||
return adjustmentFilter.gamma;
|
||||
}
|
||||
@@ -90,8 +88,7 @@ namespace gdjs {
|
||||
value: boolean
|
||||
) {}
|
||||
getNetworkSyncData(filter: PIXI.Filter): AdjustmentFilterNetworkSyncData {
|
||||
const adjustmentFilter =
|
||||
filter as unknown as PIXI.filters.AdjustmentFilter;
|
||||
const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter;
|
||||
return {
|
||||
ga: adjustmentFilter.gamma,
|
||||
sa: adjustmentFilter.saturation,
|
||||
@@ -107,8 +104,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: AdjustmentFilterNetworkSyncData
|
||||
): void {
|
||||
const adjustmentFilter =
|
||||
filter as unknown as PIXI.filters.AdjustmentFilter;
|
||||
const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter;
|
||||
adjustmentFilter.gamma = data.ga;
|
||||
adjustmentFilter.saturation = data.sa;
|
||||
adjustmentFilter.contrast = data.co;
|
||||
|
@@ -20,8 +20,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const advancedBloomFilter =
|
||||
filter as unknown as PIXI.filters.AdvancedBloomFilter;
|
||||
const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter;
|
||||
if (parameterName === 'threshold') {
|
||||
advancedBloomFilter.threshold = value;
|
||||
} else if (parameterName === 'bloomScale') {
|
||||
@@ -37,8 +36,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const advancedBloomFilter =
|
||||
filter as unknown as PIXI.filters.AdvancedBloomFilter;
|
||||
const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter;
|
||||
if (parameterName === 'threshold') {
|
||||
return advancedBloomFilter.threshold;
|
||||
}
|
||||
@@ -80,8 +78,7 @@ namespace gdjs {
|
||||
getNetworkSyncData(
|
||||
filter: PIXI.Filter
|
||||
): AdvancedBloomFilterNetworkSyncData {
|
||||
const advancedBloomFilter =
|
||||
filter as unknown as PIXI.filters.AdvancedBloomFilter;
|
||||
const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter;
|
||||
return {
|
||||
th: advancedBloomFilter.threshold,
|
||||
bs: advancedBloomFilter.bloomScale,
|
||||
@@ -95,8 +92,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
syncData: AdvancedBloomFilterNetworkSyncData
|
||||
) {
|
||||
const advancedBloomFilter =
|
||||
filter as unknown as PIXI.filters.AdvancedBloomFilter;
|
||||
const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter;
|
||||
advancedBloomFilter.threshold = syncData.th;
|
||||
advancedBloomFilter.bloomScale = syncData.bs;
|
||||
advancedBloomFilter.brightness = syncData.bn;
|
||||
|
@@ -15,13 +15,13 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const asciiFilter = filter as unknown as PIXI.filters.AsciiFilter;
|
||||
const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter;
|
||||
if (parameterName === 'size') {
|
||||
asciiFilter.size = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const asciiFilter = filter as unknown as PIXI.filters.AsciiFilter;
|
||||
const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter;
|
||||
if (parameterName === 'size') {
|
||||
return asciiFilter.size;
|
||||
}
|
||||
@@ -46,14 +46,14 @@ namespace gdjs {
|
||||
value: boolean
|
||||
) {}
|
||||
getNetworkSyncData(filter: PIXI.Filter): AsciiFilterNetworkSyncData {
|
||||
const asciiFilter = filter as unknown as PIXI.filters.AsciiFilter;
|
||||
const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter;
|
||||
return { size: asciiFilter.size };
|
||||
}
|
||||
updateFromNetworkSyncData(
|
||||
filter: PIXI.Filter,
|
||||
data: AsciiFilterNetworkSyncData
|
||||
) {
|
||||
const asciiFilter = filter as unknown as PIXI.filters.AsciiFilter;
|
||||
const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter;
|
||||
asciiFilter.size = data.size;
|
||||
}
|
||||
})()
|
||||
|
@@ -25,7 +25,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter &
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
if (parameterName === 'rotation') {
|
||||
bevelFilter.rotation = value;
|
||||
@@ -40,7 +40,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter &
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
if (parameterName === 'rotation') {
|
||||
return bevelFilter.rotation;
|
||||
@@ -64,7 +64,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter &
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
if (parameterName === 'lightColor') {
|
||||
bevelFilter.lightColor = gdjs.rgbOrHexStringToNumber(value);
|
||||
@@ -78,7 +78,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter &
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
if (parameterName === 'lightColor') {
|
||||
bevelFilter.lightColor = value;
|
||||
@@ -88,7 +88,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter;
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter;
|
||||
if (parameterName === 'lightColor') {
|
||||
return bevelFilter.lightColor;
|
||||
}
|
||||
@@ -103,7 +103,7 @@ namespace gdjs {
|
||||
value: boolean
|
||||
) {}
|
||||
getNetworkSyncData(filter: PIXI.Filter): BevelFilterNetworkSyncData {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter &
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
return {
|
||||
r: bevelFilter.rotation,
|
||||
@@ -119,7 +119,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: BevelFilterNetworkSyncData
|
||||
) {
|
||||
const bevelFilter = filter as unknown as PIXI.filters.BevelFilter &
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
bevelFilter.rotation = data.r;
|
||||
bevelFilter.thickness = data.t;
|
||||
|
@@ -16,14 +16,14 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const colorMatrix = filter as unknown as PIXI.ColorMatrixFilter;
|
||||
const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
if (parameterName !== 'opacity') {
|
||||
return;
|
||||
}
|
||||
colorMatrix.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorMatrix = filter as unknown as PIXI.ColorMatrixFilter;
|
||||
const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
if (parameterName === 'opacity') {
|
||||
return colorMatrix.alpha;
|
||||
}
|
||||
@@ -50,14 +50,14 @@ namespace gdjs {
|
||||
getNetworkSyncData(
|
||||
filter: PIXI.Filter
|
||||
): BlackAndWhiteFilterNetworkSyncData {
|
||||
const colorMatrix = filter as unknown as PIXI.ColorMatrixFilter;
|
||||
const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
return { a: colorMatrix.alpha };
|
||||
}
|
||||
updateFromNetworkSyncData(
|
||||
filter: PIXI.Filter,
|
||||
data: BlackAndWhiteFilterNetworkSyncData
|
||||
) {
|
||||
const colorMatrix = filter as unknown as PIXI.ColorMatrixFilter;
|
||||
const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
colorMatrix.alpha = data.a;
|
||||
}
|
||||
})()
|
||||
|
@@ -16,7 +16,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const blendingModeFilter = filter as unknown as PIXI.AlphaFilter;
|
||||
const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter;
|
||||
if (parameterName === 'alpha') {
|
||||
blendingModeFilter.alpha = value;
|
||||
} else if (parameterName === 'blendmode') {
|
||||
@@ -24,7 +24,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const blendingModeFilter = filter as unknown as PIXI.AlphaFilter;
|
||||
const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter;
|
||||
if (parameterName === 'alpha') {
|
||||
return blendingModeFilter.alpha;
|
||||
}
|
||||
@@ -54,7 +54,7 @@ namespace gdjs {
|
||||
getNetworkSyncData(
|
||||
filter: PIXI.Filter
|
||||
): BlendingModeFilterNetworkSyncData {
|
||||
const blendingModeFilter = filter as unknown as PIXI.AlphaFilter;
|
||||
const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter;
|
||||
return {
|
||||
a: blendingModeFilter.alpha,
|
||||
bm: blendingModeFilter.blendMode,
|
||||
@@ -64,7 +64,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: BlendingModeFilterNetworkSyncData
|
||||
) {
|
||||
const blendingModeFilter = filter as unknown as PIXI.AlphaFilter;
|
||||
const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter;
|
||||
blendingModeFilter.alpha = data.a;
|
||||
blendingModeFilter.blendMode = data.bm;
|
||||
}
|
||||
|
@@ -20,7 +20,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const brightnessFilter = filter as unknown as PIXI.ColorMatrixFilter &
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter &
|
||||
BrightnessFilterExtra;
|
||||
if (parameterName !== 'brightness') {
|
||||
return;
|
||||
@@ -30,7 +30,7 @@ namespace gdjs {
|
||||
brightnessFilter.brightness(brightness, false);
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const brightnessFilter = filter as unknown as PIXI.ColorMatrixFilter &
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter &
|
||||
BrightnessFilterExtra;
|
||||
if (parameterName === 'brightness') {
|
||||
return brightnessFilter.__brightness;
|
||||
@@ -56,7 +56,7 @@ namespace gdjs {
|
||||
value: boolean
|
||||
) {}
|
||||
getNetworkSyncData(filter: PIXI.Filter): BrightnessFilterNetworkSyncData {
|
||||
const brightnessFilter = filter as unknown as PIXI.ColorMatrixFilter &
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter &
|
||||
BrightnessFilterExtra;
|
||||
return { b: brightnessFilter.__brightness };
|
||||
}
|
||||
@@ -64,7 +64,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: BrightnessFilterNetworkSyncData
|
||||
) {
|
||||
const brightnessFilter = filter as unknown as PIXI.ColorMatrixFilter &
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter &
|
||||
BrightnessFilterExtra;
|
||||
brightnessFilter.__brightness = data.b;
|
||||
brightnessFilter.brightness(data.b, false);
|
||||
|
@@ -18,8 +18,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const bulgePinchFilter =
|
||||
filter as unknown as PIXI.filters.BulgePinchFilter;
|
||||
const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter;
|
||||
if (parameterName === 'centerX') {
|
||||
bulgePinchFilter.center[0] = value;
|
||||
} else if (parameterName === 'centerY') {
|
||||
@@ -35,8 +34,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const bulgePinchFilter =
|
||||
filter as unknown as PIXI.filters.BulgePinchFilter;
|
||||
const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter;
|
||||
if (parameterName === 'centerX') {
|
||||
return bulgePinchFilter.center[0];
|
||||
}
|
||||
@@ -70,8 +68,7 @@ namespace gdjs {
|
||||
value: boolean
|
||||
) {}
|
||||
getNetworkSyncData(filter: PIXI.Filter): BulgePinchFilterNetworkSyncData {
|
||||
const bulgePinchFilter =
|
||||
filter as unknown as PIXI.filters.BulgePinchFilter;
|
||||
const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter;
|
||||
return {
|
||||
cx: bulgePinchFilter.center[0],
|
||||
cy: bulgePinchFilter.center[1],
|
||||
@@ -83,8 +80,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: BulgePinchFilterNetworkSyncData
|
||||
) {
|
||||
const bulgePinchFilter =
|
||||
filter as unknown as PIXI.filters.BulgePinchFilter;
|
||||
const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter;
|
||||
bulgePinchFilter.center[0] = data.cx;
|
||||
bulgePinchFilter.center[1] = data.cy;
|
||||
bulgePinchFilter.radius = data.r;
|
||||
|
@@ -29,7 +29,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const colorMapFilter = filter as unknown as PIXI.filters.ColorMapFilter;
|
||||
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
|
||||
if (parameterName === 'mix') {
|
||||
colorMapFilter.mix = gdjs.PixiFiltersTools.clampValue(
|
||||
value / 100,
|
||||
@@ -39,7 +39,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorMapFilter = filter as unknown as PIXI.filters.ColorMapFilter;
|
||||
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
|
||||
if (parameterName === 'mix') {
|
||||
return colorMapFilter.mix;
|
||||
}
|
||||
@@ -63,20 +63,20 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const colorMapFilter = filter as unknown as PIXI.filters.ColorMapFilter;
|
||||
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
|
||||
if (parameterName === 'nearest') {
|
||||
colorMapFilter.nearest = value;
|
||||
}
|
||||
}
|
||||
getNetworkSyncData(filter: PIXI.Filter): ColorMapFilterNetworkSyncData {
|
||||
const colorMapFilter = filter as unknown as PIXI.filters.ColorMapFilter;
|
||||
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
|
||||
return { mix: colorMapFilter.mix, near: colorMapFilter.nearest };
|
||||
}
|
||||
updateFromNetworkSyncData(
|
||||
filter: PIXI.Filter,
|
||||
data: ColorMapFilterNetworkSyncData
|
||||
) {
|
||||
const colorMapFilter = filter as unknown as PIXI.filters.ColorMapFilter;
|
||||
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
|
||||
colorMapFilter.mix = data.mix;
|
||||
colorMapFilter.nearest = data.near;
|
||||
}
|
||||
|
@@ -23,17 +23,15 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'epsilon') {
|
||||
colorReplaceFilter.epsilon = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'epsilon') {
|
||||
return colorReplaceFilter.epsilon;
|
||||
}
|
||||
@@ -44,9 +42,8 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'originalColor') {
|
||||
colorReplaceFilter.originalColor = gdjs.rgbOrHexStringToNumber(value);
|
||||
} else if (parameterName === 'newColor') {
|
||||
@@ -58,9 +55,8 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'originalColor') {
|
||||
colorReplaceFilter.originalColor = value;
|
||||
} else if (parameterName === 'newColor') {
|
||||
@@ -68,9 +64,8 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'originalColor') {
|
||||
return colorReplaceFilter.originalColor;
|
||||
} else if (parameterName === 'newColor') {
|
||||
@@ -86,9 +81,8 @@ namespace gdjs {
|
||||
getNetworkSyncData(
|
||||
filter: PIXI.Filter
|
||||
): ColorReplaceFilterNetworkSyncData {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
return {
|
||||
e: colorReplaceFilter.epsilon,
|
||||
oc: colorReplaceFilter.originalColor,
|
||||
@@ -99,9 +93,8 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: ColorReplaceFilterNetworkSyncData
|
||||
) {
|
||||
const colorReplaceFilter =
|
||||
filter as unknown as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
colorReplaceFilter.epsilon = data.e;
|
||||
colorReplaceFilter.originalColor = data.oc;
|
||||
colorReplaceFilter.newColor = data.nc;
|
||||
|
@@ -23,13 +23,13 @@ namespace gdjs {
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
makePIXIFilter(layer, effectData) {
|
||||
const filter = new PIXI.filters.CRTFilter();
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter &
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
crtFilter._animationTimer = 0;
|
||||
return crtFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter &
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
if (crtFilter.animationSpeed !== 0) {
|
||||
// Multiply by 10 so that the default value is a sensible speed
|
||||
@@ -49,7 +49,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter &
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
if (parameterName === 'lineWidth') {
|
||||
crtFilter.lineWidth = value;
|
||||
@@ -76,7 +76,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter &
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
if (parameterName === 'lineWidth') {
|
||||
return crtFilter.lineWidth;
|
||||
@@ -131,13 +131,13 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter;
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter;
|
||||
if (parameterName === 'verticalLine') {
|
||||
crtFilter.verticalLine = value;
|
||||
}
|
||||
}
|
||||
getNetworkSyncData(filter: PIXI.Filter): CRTFilterNetworkSyncData {
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter &
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
return {
|
||||
lw: crtFilter.lineWidth,
|
||||
@@ -158,7 +158,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: CRTFilterNetworkSyncData
|
||||
) {
|
||||
const crtFilter = filter as unknown as PIXI.filters.CRTFilter &
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
crtFilter.lineWidth = data.lw;
|
||||
crtFilter.lineContrast = data.lc;
|
||||
|
@@ -25,7 +25,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const displacementFilter = filter as unknown as PIXI.DisplacementFilter;
|
||||
const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter;
|
||||
if (parameterName === 'scaleX') {
|
||||
displacementFilter.scale.x = value;
|
||||
}
|
||||
@@ -34,7 +34,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const displacementFilter = filter as unknown as PIXI.DisplacementFilter;
|
||||
const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter;
|
||||
if (parameterName === 'scaleX') {
|
||||
return displacementFilter.scale.x;
|
||||
}
|
||||
@@ -64,7 +64,7 @@ namespace gdjs {
|
||||
getNetworkSyncData(
|
||||
filter: PIXI.Filter
|
||||
): DisplacementFilterNetworkSyncData {
|
||||
const displacementFilter = filter as unknown as PIXI.DisplacementFilter;
|
||||
const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter;
|
||||
return {
|
||||
sx: displacementFilter.scale.x,
|
||||
sy: displacementFilter.scale.y,
|
||||
@@ -74,7 +74,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: DisplacementFilterNetworkSyncData
|
||||
) {
|
||||
const displacementFilter = filter as unknown as PIXI.DisplacementFilter;
|
||||
const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter;
|
||||
displacementFilter.scale.x = data.sx;
|
||||
displacementFilter.scale.y = data.sy;
|
||||
}
|
||||
|
@@ -16,7 +16,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const dotFilter = filter as unknown as PIXI.filters.DotFilter;
|
||||
const dotFilter = (filter as unknown) as PIXI.filters.DotFilter;
|
||||
if (parameterName === 'scale') {
|
||||
dotFilter.scale = value;
|
||||
} else if (parameterName === 'angle') {
|
||||
@@ -24,7 +24,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const dotFilter = filter as unknown as PIXI.filters.DotFilter;
|
||||
const dotFilter = (filter as unknown) as PIXI.filters.DotFilter;
|
||||
if (parameterName === 'scale') {
|
||||
return dotFilter.scale;
|
||||
}
|
||||
@@ -52,14 +52,14 @@ namespace gdjs {
|
||||
value: boolean
|
||||
) {}
|
||||
getNetworkSyncData(filter: PIXI.Filter): DotFilterNetworkSyncData {
|
||||
const dotFilter = filter as unknown as PIXI.filters.DotFilter;
|
||||
const dotFilter = (filter as unknown) as PIXI.filters.DotFilter;
|
||||
return { s: dotFilter.scale, a: dotFilter.angle };
|
||||
}
|
||||
updateFromNetworkSyncData(
|
||||
filter: PIXI.Filter,
|
||||
data: DotFilterNetworkSyncData
|
||||
) {
|
||||
const dotFilter = filter as unknown as PIXI.filters.DotFilter;
|
||||
const dotFilter = (filter as unknown) as PIXI.filters.DotFilter;
|
||||
dotFilter.scale = data.s;
|
||||
dotFilter.angle = data.a;
|
||||
}
|
||||
|
@@ -22,8 +22,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'blur') {
|
||||
dropShadowFilter.blur = value;
|
||||
} else if (parameterName === 'quality') {
|
||||
@@ -39,8 +38,7 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'blur') {
|
||||
return dropShadowFilter.blur;
|
||||
}
|
||||
@@ -66,8 +64,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'color') {
|
||||
dropShadowFilter.color = gdjs.rgbOrHexStringToNumber(value);
|
||||
}
|
||||
@@ -77,15 +74,13 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'color') {
|
||||
dropShadowFilter.color = value;
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'color') {
|
||||
return dropShadowFilter.color;
|
||||
}
|
||||
@@ -96,15 +91,13 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'shadowOnly') {
|
||||
dropShadowFilter.shadowOnly = value;
|
||||
}
|
||||
}
|
||||
getNetworkSyncData(filter: PIXI.Filter): DropShadowFilterNetworkSyncData {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
return {
|
||||
b: dropShadowFilter.blur,
|
||||
q: dropShadowFilter.quality,
|
||||
@@ -120,8 +113,7 @@ namespace gdjs {
|
||||
filter: PIXI.Filter,
|
||||
data: DropShadowFilterNetworkSyncData
|
||||
) {
|
||||
const dropShadowFilter =
|
||||
filter as unknown as PIXI.filters.DropShadowFilter;
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
dropShadowFilter.blur = data.b;
|
||||
dropShadowFilter.quality = data.q;
|
||||
dropShadowFilter.alpha = data.a;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user