GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
PlatformExtension.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-2016 Florian Rival ([email protected]). All rights
4  * reserved. Copyright 2016 Victor Levasseur ([email protected]) This
5  * project is released under the MIT License.
6  */
7 
8 #pragma once
9 #include <map>
10 #include <memory>
11 #include <vector>
12 
13 #include "GDCore/CommonTools.h"
14 #include "GDCore/Extensions/Metadata/BehaviorMetadata.h"
15 #include "GDCore/Extensions/Metadata/DependencyMetadata.h"
16 #include "GDCore/Extensions/Metadata/EffectMetadata.h"
17 #include "GDCore/Extensions/Metadata/EventMetadata.h"
18 #include "GDCore/Extensions/Metadata/InstructionOrExpressionGroupMetadata.h"
19 #include "GDCore/Extensions/Metadata/ObjectMetadata.h"
20 #include "GDCore/Project/PropertyDescriptor.h"
21 #include "GDCore/String.h"
22 #include "GDCore/Tools/VersionPriv.h"
23 
24 namespace gd {
25 class Instruction;
26 class InstructionMetadata;
27 class MultipleInstructionMetadata;
28 class ExpressionMetadata;
29 class ObjectMetadata;
30 class BehaviorMetadata;
31 class EffectMetadata;
32 class DependencyMetadata;
33 class BaseEvent;
34 class EventMetadata;
35 class EventCodeGenerator;
36 class ArbitraryResourceWorker;
37 class BehaviorsSharedData;
38 class Behavior;
39 class Object;
40 class ObjectConfiguration;
41 } // namespace gd
42 
43 typedef std::function<std::unique_ptr<gd::ObjectConfiguration>()>
44  CreateFunPtr;
45 
46 namespace gd {
47 
52 class GD_CORE_API CompilationInfo {
53  public:
54  CompilationInfo() : informationCompleted(false){};
55  virtual ~CompilationInfo(){};
56 
57  bool informationCompleted;
58 
59  bool runtimeOnly;
61 
62 #if defined(__GNUC__)
63  int gccMajorVersion;
64  int gccMinorVersion;
65  int gccPatchLevel;
66 #endif
67 
68  int sfmlMajorVersion;
69  int sfmlMinorVersion;
70 
71  gd::String gdCoreVersion;
72  int sizeOfpInt;
73 };
74 
75 struct GD_CORE_API DuplicatedInstructionOptions {
76  bool unscoped;
77 };
78 
84 class GD_CORE_API PlatformExtension {
85  public:
86  CompilationInfo compilationInfo;
87 
89  virtual ~PlatformExtension();
90 
95 
99  PlatformExtension& SetExtensionInformation(const gd::String& name_,
100  const gd::String& fullname_,
101  const gd::String& description_,
102  const gd::String& author_,
103  const gd::String& license_);
104 
109  iconUrl = iconUrl_;
110  return *this;
111  }
112 
117  category = category_;
118  return *this;
119  }
120 
130  helpPath = helpPath_;
131  return *this;
132  }
133 
138  void MarkAsDeprecated() { deprecated = true; }
139 
141 
146 
150  gd::InstructionMetadata& AddCondition(const gd::String& name_,
151  const gd::String& fullname_,
152  const gd::String& description_,
153  const gd::String& sentence_,
154  const gd::String& group_,
155  const gd::String& icon_,
156  const gd::String& smallicon_);
157 
161  gd::InstructionMetadata& AddAction(const gd::String& name_,
162  const gd::String& fullname_,
163  const gd::String& description_,
164  const gd::String& sentence_,
165  const gd::String& group_,
166  const gd::String& icon_,
167  const gd::String& smallicon_);
171  gd::ExpressionMetadata& AddExpression(const gd::String& name_,
172  const gd::String& fullname_,
173  const gd::String& description_,
174  const gd::String& group_,
175  const gd::String& smallicon_);
179  gd::ExpressionMetadata& AddStrExpression(const gd::String& name_,
180  const gd::String& fullname_,
181  const gd::String& description_,
182  const gd::String& group_,
183  const gd::String& smallicon_);
184 
191  gd::MultipleInstructionMetadata AddExpressionAndCondition(
192  const gd::String& type,
193  const gd::String& name,
194  const gd::String& fullname,
195  const gd::String& description,
196  const gd::String& sentenceName,
197  const gd::String& group,
198  const gd::String& icon);
199 
208  gd::MultipleInstructionMetadata AddExpressionAndConditionAndAction(
209  const gd::String& type,
210  const gd::String& name,
211  const gd::String& fullname,
212  const gd::String& description,
213  const gd::String& sentenceName,
214  const gd::String& group,
215  const gd::String& icon);
216 
217  gd::DependencyMetadata& AddDependency();
218 
227  template <class T>
228  gd::ObjectMetadata& AddObject(const gd::String& name_,
229  const gd::String& fullname_,
230  const gd::String& description_,
231  const gd::String& icon_);
232 
242  gd::ObjectMetadata& AddObject(const gd::String& name_,
243  const gd::String& fullname_,
244  const gd::String& description_,
245  const gd::String& icon_,
246  std::shared_ptr<gd::ObjectConfiguration> instance);
247 
256  gd::ObjectMetadata& AddEventsBasedObject(
257  const gd::String& name_,
258  const gd::String& fullname_,
259  const gd::String& description_,
260  const gd::String& icon_);
261 
277  gd::BehaviorMetadata& AddBehavior(
278  const gd::String& name_,
279  const gd::String& fullname_,
280  const gd::String& defaultName_,
281  const gd::String& description_,
282  const gd::String& group_,
283  const gd::String& icon_,
284  const gd::String& className_,
285  std::shared_ptr<gd::Behavior> instance,
286  std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
287 
292  gd::EffectMetadata& AddEffect(const gd::String& name_);
293 
297  gd::EventMetadata& AddEvent(const gd::String& name_,
298  const gd::String& fullname_,
299  const gd::String& description_,
300  const gd::String& group_,
301  const gd::String& smallicon_,
302  std::shared_ptr<gd::BaseEvent> instance);
303 
310  gd::InstructionMetadata& AddDuplicatedAction(
311  const gd::String& newActionName, const gd::String& copiedActionName);
318  gd::InstructionMetadata& AddDuplicatedCondition(
319  const gd::String& newConditionName,
320  const gd::String& copiedConditionName,
321  gd::DuplicatedInstructionOptions options = {.unscoped = false});
328  gd::ExpressionMetadata& AddDuplicatedExpression(
329  const gd::String& newExpressionName,
330  const gd::String& copiedExpressionName);
338  gd::ExpressionMetadata& AddDuplicatedStrExpression(
339  const gd::String& newExpressionName,
340  const gd::String& copiedExpressionName);
341 
346  return extensionPropertiesMetadata[name];
347  };
348 
354  const gd::String& name) {
355  return instructionOrExpressionGroupMetadata[name];
356  }
357 
362  void StripUnimplementedInstructionsAndExpressions();
364 
369 
373  const gd::String& GetFullName() const { return fullname; }
374 
378  const gd::String& GetName() const { return name; }
379 
383  const gd::String& GetCategory() const { return category; }
384 
388  const gd::String& GetDescription() const { return informations; }
389 
393  const gd::String& GetAuthor() const { return author; }
394 
398  const gd::String& GetLicense() const { return license; }
399 
404  const gd::String& GetHelpPath() const { return helpPath; }
405 
410  const gd::String& GetIconUrl() const { return iconUrl; }
411 
415  const std::vector<gd::String>& GetTags() const { return tags; }
416 
421  tags.clear();
422  tags = csvTags.Split(',');
423  for (size_t i = 0; i < tags.size(); i++)
424  {
425  tags[i] = tags[i].Trim().LowerCase();
426  }
427  return *this;
428  }
429 
434  tags.push_back(tag);
435  return *this;
436  }
437 
441  bool IsDeprecated() const { return deprecated; }
442 
447  bool IsBuiltin() const;
448 
454  const gd::String& GetNameSpace() { return nameSpace; };
455 
460  std::vector<gd::String> GetExtensionObjectsTypes() const;
461 
466  std::vector<gd::String> GetBehaviorsTypes() const;
467 
472  CreateFunPtr GetObjectCreationFunctionPtr(const gd::String& objectType) const;
473 
478  std::vector<gd::String> GetExtensionEffectTypes() const;
479 
485  std::shared_ptr<gd::BaseEvent> CreateEvent(const gd::String& eventType) const;
491  gd::Behavior* GetBehavior(const gd::String& behaviorType) const;
492 
499  gd::BehaviorsSharedData* GetBehaviorSharedDatas(
500  const gd::String& behaviorType) const;
501 
506  ObjectMetadata& GetObjectMetadata(const gd::String& objectType);
507 
512  BehaviorMetadata& GetBehaviorMetadata(const gd::String& behaviorType);
513 
518  bool HasBehavior(const gd::String& behaviorType) const;
519 
523  EffectMetadata& GetEffectMetadata(const gd::String& effectName);
524 
528  std::map<gd::String, gd::EventMetadata>& GetAllEvents();
529 
534  std::map<gd::String, gd::InstructionMetadata>& GetAllActions();
535 
539  std::map<gd::String, gd::InstructionMetadata>& GetAllConditions();
540 
544  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions();
545 
549  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions();
550 
555  std::vector<gd::DependencyMetadata>& GetAllDependencies();
556 
561  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForObject(
562  gd::String objectType);
563 
567  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForObject(
568  gd::String objectType);
569 
573  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForObject(
574  gd::String objectType);
575 
579  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForObject(
580  gd::String objectType);
581 
585  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForBehavior(
586  gd::String autoType);
587 
591  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForBehavior(
592  gd::String autoType);
593 
597  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForBehavior(
598  gd::String autoType);
599 
603  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForBehavior(
604  gd::String autoType);
605 
611  std::map<gd::String, gd::PropertyDescriptor>& GetAllProperties() {
612  return extensionPropertiesMetadata;
613  }
614 
619  const std::map<gd::String, InstructionOrExpressionGroupMetadata>&
621  return instructionOrExpressionGroupMetadata;
622  }
624 
629  static std::vector<gd::String> GetBuiltinExtensionsNames();
630 
635  static gd::String GetNamespaceSeparator() { return "::"; }
636 
637  static gd::String GetEventsFunctionFullType(const gd::String &extensionName,
638  const gd::String &functionName);
639 
640  static gd::String
641  GetBehaviorEventsFunctionFullType(const gd::String &extensionName,
642  const gd::String &behaviorName,
643  const gd::String &functionName);
644 
645  static gd::String GetBehaviorFullType(const gd::String &extensionName,
646  const gd::String &behaviorName);
647 
648  static gd::String
649  GetObjectEventsFunctionFullType(const gd::String &extensionName,
650  const gd::String &objectName,
651  const gd::String &functionName);
652 
653  static gd::String GetObjectFullType(const gd::String &extensionName,
654  const gd::String &objectName);
655 
656 private:
661  void SetNameSpace(gd::String nameSpace_);
662 
663  gd::String name;
664  gd::String
665  nameSpace;
668  gd::String fullname;
669  gd::String informations;
670  gd::String category;
671  gd::String author;
672  gd::String license;
673  bool deprecated;
675  gd::String helpPath;
677  gd::String iconUrl;
678  std::vector<gd::String> tags;
679 
680  std::map<gd::String, gd::ObjectMetadata> objectsInfos;
681  std::map<gd::String, gd::BehaviorMetadata> behaviorsInfo;
682  std::map<gd::String, gd::EffectMetadata> effectsMetadata;
683  std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
684  std::map<gd::String, gd::InstructionMetadata> actionsInfos;
685  std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
686  std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
687  std::vector<gd::DependencyMetadata> extensionDependenciesMetadata;
688  std::map<gd::String, gd::EventMetadata> eventsInfos;
689  std::map<gd::String, gd::PropertyDescriptor> extensionPropertiesMetadata;
690  std::map<gd::String, InstructionOrExpressionGroupMetadata>
691  instructionOrExpressionGroupMetadata;
692 
693  ObjectMetadata badObjectMetadata;
694  BehaviorMetadata badBehaviorMetadata;
695  EffectMetadata badEffectMetadata;
696  static std::map<gd::String, gd::InstructionMetadata>
697  badConditionsMetadata;
699  static std::map<gd::String, gd::InstructionMetadata>
700  badActionsMetadata;
702  static std::map<gd::String, gd::ExpressionMetadata>
703  badExpressionsMetadata;
705 };
706 
707 } // namespace gd
708 
712 #define GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION() \
713  compilationInfo.runtimeOnly = false; \
714  compilationInfo.sfmlMajorVersion = 2; \
715  compilationInfo.sfmlMinorVersion = 0; \
716  compilationInfo.gdCoreVersion = GD_VERSION_STRING; \
717  compilationInfo.sizeOfpInt = sizeof(int*); \
718  compilationInfo.gccMajorVersion = __GNUC__; \
719  compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
720  compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
721  compilationInfo.informationCompleted = true;
722 
723 #include "GDCore/Extensions/PlatformExtension.inl"
Base class used to represents a behavior that can be applied to an object. It stores the content (i....
Definition: Behavior.h:23
Contains user-friendly information about a behavior type.
Definition: BehaviorMetadata.h:31
Base class for defining data shared by behaviors having the same type and name.
Definition: BehaviorsSharedData.h:24
Class used by gd::PlatformExtension to ensure that an extension is compiled against the right version...
Definition: PlatformExtension.h:52
bool runtimeOnly
Definition: PlatformExtension.h:59
Contains information about a dependency (library, npm/cordova package, or other according to the expo...
Definition: DependencyMetadata.h:20
Contains user-friendly information about an effect.
Definition: EffectMetadata.h:23
Describe an event provided by an extension of a platform.
Definition: EventMetadata.h:29
Describe user-friendly information about an expression, its parameters and the function name as well ...
Definition: ExpressionMetadata.h:47
Describe user-friendly information about an instruction (action or condition), its parameters and the...
Definition: InstructionMetadata.h:38
Contains information about how to display a group of instructions to the user.
Definition: InstructionOrExpressionGroupMetadata.h:14
A "composite" metadata that can be used to easily declare both an expression and a related condition ...
Definition: MultipleInstructionMetadata.h:24
Contains user-friendly information about an object type, and a function to create a new gd::Object of...
Definition: ObjectMetadata.h:37
Base class for implementing platform's extensions.
Definition: PlatformExtension.h:84
PlatformExtension & AddTag(const gd::String &tag)
Add a keyword that help search engines find this extension.
Definition: PlatformExtension.h:433
gd::PropertyDescriptor & RegisterProperty(const gd::String &name)
Adds a property to the extension.
Definition: PlatformExtension.h:345
const std::map< gd::String, InstructionOrExpressionGroupMetadata > & GetAllInstructionOrExpressionGroupMetadata() const
Get the metadata (icon, etc...) for groups used for instructions or expressions.
Definition: PlatformExtension.h:620
const std::vector< gd::String > & GetTags() const
Return keywords that help search engines find this extension.
Definition: PlatformExtension.h:415
const gd::String & GetNameSpace()
Get the namespace of the extension.
Definition: PlatformExtension.h:454
const gd::String & GetName() const
Return the name of the extension.
Definition: PlatformExtension.h:378
const gd::String & GetCategory() const
Return the category of the extension.
Definition: PlatformExtension.h:383
PlatformExtension & SetTags(const gd::String &csvTags)
Set keywords that help search engines find this extension.
Definition: PlatformExtension.h:420
PlatformExtension & SetCategory(const gd::String &category_)
Set the category of the extension.
Definition: PlatformExtension.h:116
const gd::String & GetLicense() const
Return the name of extension license.
Definition: PlatformExtension.h:398
void MarkAsDeprecated()
Mark this extension as deprecated: the IDE will hide it from the user.
Definition: PlatformExtension.h:138
InstructionOrExpressionGroupMetadata & AddInstructionOrExpressionGroupMetadata(const gd::String &name)
Add some metadata (icon, etc...) for a group used for instructions or expressions.
Definition: PlatformExtension.h:353
PlatformExtension & SetIconUrl(const gd::String &iconUrl_)
Set the URL of the extension icon.
Definition: PlatformExtension.h:108
const gd::String & GetAuthor() const
Return the name of the extension developer.
Definition: PlatformExtension.h:393
bool IsDeprecated() const
Check if the extension is flagged as being deprecated.
Definition: PlatformExtension.h:441
std::map< gd::String, gd::PropertyDescriptor > & GetAllProperties()
Get all the properties of the extension. Properties are shown in the game properties in the editor,...
Definition: PlatformExtension.h:611
const gd::String & GetHelpPath() const
Return the help path of extension, relative to the GDevelop documentation root.
Definition: PlatformExtension.h:404
const gd::String & GetIconUrl() const
Return the URL to the icon to be displayed for this extension.
Definition: PlatformExtension.h:410
const gd::String & GetFullName() const
Return the name extension user friendly name.
Definition: PlatformExtension.h:373
static gd::String GetNamespaceSeparator()
Get the string used to separate the name of the instruction/expression and the extension.
Definition: PlatformExtension.h:635
PlatformExtension & SetExtensionHelpPath(const gd::String &helpPath_)
Set the path to the help, relative to the GDevelop documentation root. For example,...
Definition: PlatformExtension.h:129
const gd::String & GetDescription() const
Return a description of the extension.
Definition: PlatformExtension.h:388
Used to describe a property shown in a property grid.
Definition: PropertyDescriptor.h:24
String represents an UTF8 encoded string.
Definition: String.h:31
std::vector< String > Split(value_type delimiter) const
Split the string with a delimiter.
Definition: String.cpp:356
Definition: CommonTools.h:24
Definition: PlatformExtension.h:75