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/SourceFileMetadata.h"
17 #include "GDCore/Extensions/Metadata/EffectMetadata.h"
18 #include "GDCore/Extensions/Metadata/EventMetadata.h"
19 #include "GDCore/Extensions/Metadata/InstructionOrExpressionGroupMetadata.h"
20 #include "GDCore/Extensions/Metadata/ObjectMetadata.h"
21 #include "GDCore/Project/PropertyDescriptor.h"
22 #include "GDCore/String.h"
23 #include "GDCore/Tools/VersionPriv.h"
24 
25 namespace gd {
26 class Instruction;
27 class InstructionMetadata;
28 class MultipleInstructionMetadata;
29 class ExpressionMetadata;
30 class ObjectMetadata;
31 class BehaviorMetadata;
32 class EffectMetadata;
33 class DependencyMetadata;
34 class BaseEvent;
35 class EventMetadata;
36 class EventCodeGenerator;
37 class ArbitraryResourceWorker;
38 class BehaviorsSharedData;
39 class Behavior;
40 class Object;
41 class ObjectConfiguration;
42 } // namespace gd
43 
44 typedef std::function<std::unique_ptr<gd::ObjectConfiguration>()> CreateFunPtr;
45 
46 namespace gd {
47 
52 class GD_CORE_API CompilationInfo {
53  public:
54  CompilationInfo() {};
55  virtual ~CompilationInfo() {};
56 
57  bool informationCompleted = false;
58 
59  bool runtimeOnly = false;
61 
62 #if defined(__GNUC__)
63  int gccMajorVersion = 0;
64  int gccMinorVersion = 0;
65  int gccPatchLevel = 0;
66 #endif
67 
68  int sfmlMajorVersion = 0;
69  int sfmlMinorVersion = 0;
70 
71  gd::String gdCoreVersion;
72  int sizeOfpInt = 0;
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  gd::SourceFileMetadata& AddSourceFile();
219 
228  template <class T>
229  gd::ObjectMetadata& AddObject(const gd::String& name_,
230  const gd::String& fullname_,
231  const gd::String& description_,
232  const gd::String& icon_);
233 
243  gd::ObjectMetadata& AddObject(
244  const gd::String& name_,
245  const gd::String& fullname_,
246  const gd::String& description_,
247  const gd::String& icon_,
248  std::shared_ptr<gd::ObjectConfiguration> instance);
249 
258  gd::ObjectMetadata& AddEventsBasedObject(const gd::String& name_,
259  const gd::String& fullname_,
260  const gd::String& description_,
261  const gd::String& icon_);
262 
278  gd::BehaviorMetadata& AddBehavior(
279  const gd::String& name_,
280  const gd::String& fullname_,
281  const gd::String& defaultName_,
282  const gd::String& description_,
283  const gd::String& group_,
284  const gd::String& icon_,
285  const gd::String& className_,
286  std::shared_ptr<gd::Behavior> instance,
287  std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
288 
293  gd::EffectMetadata& AddEffect(const gd::String& name_);
294 
298  gd::EventMetadata& AddEvent(const gd::String& name_,
299  const gd::String& fullname_,
300  const gd::String& description_,
301  const gd::String& group_,
302  const gd::String& smallicon_,
303  std::shared_ptr<gd::BaseEvent> instance);
304 
311  gd::InstructionMetadata& AddDuplicatedAction(
312  const gd::String& newActionName, const gd::String& copiedActionName);
319  gd::InstructionMetadata& AddDuplicatedCondition(
320  const gd::String& newConditionName,
321  const gd::String& copiedConditionName,
322  gd::DuplicatedInstructionOptions options = {.unscoped = false});
329  gd::ExpressionMetadata& AddDuplicatedExpression(
330  const gd::String& newExpressionName,
331  const gd::String& copiedExpressionName);
339  gd::ExpressionMetadata& AddDuplicatedStrExpression(
340  const gd::String& newExpressionName,
341  const gd::String& copiedExpressionName);
342 
347  return extensionPropertiesMetadata[name];
348  };
349 
355  const gd::String& name) {
356  return instructionOrExpressionGroupMetadata[name];
357  }
358 
363  void StripUnimplementedInstructionsAndExpressions();
365 
370 
374  const gd::String& GetFullName() const { return fullname; }
375 
379  const gd::String& GetName() const { return name; }
380 
384  const gd::String& GetCategory() const { return category; }
385 
389  const gd::String& GetDescription() const { return informations; }
390 
394  const gd::String& GetAuthor() const { return author; }
395 
399  const gd::String& GetLicense() const { return license; }
400 
405  const gd::String& GetHelpPath() const { return helpPath; }
406 
411  const gd::String& GetIconUrl() const { return iconUrl; }
412 
416  const std::vector<gd::String>& GetTags() const { return tags; }
417 
422  tags.clear();
423  tags = csvTags.Split(',');
424  for (size_t i = 0; i < tags.size(); i++) {
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  const std::vector<gd::DependencyMetadata>& GetAllDependencies() const;
562 
567  std::vector<gd::SourceFileMetadata>& GetAllSourceFiles();
568 
573  const std::vector<gd::SourceFileMetadata>& GetAllSourceFiles() const;
574 
579  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForObject(
580  gd::String objectType);
581 
585  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForObject(
586  gd::String objectType);
587 
591  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForObject(
592  gd::String objectType);
593 
597  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForObject(
598  gd::String objectType);
599 
603  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForBehavior(
604  gd::String autoType);
605 
609  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForBehavior(
610  gd::String autoType);
611 
615  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForBehavior(
616  gd::String autoType);
617 
621  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForBehavior(
622  gd::String autoType);
623 
629  std::map<gd::String, gd::PropertyDescriptor>& GetAllProperties() {
630  return extensionPropertiesMetadata;
631  }
632 
637  const std::map<gd::String, InstructionOrExpressionGroupMetadata>&
639  return instructionOrExpressionGroupMetadata;
640  }
642 
647  static std::vector<gd::String> GetBuiltinExtensionsNames();
648 
653  static gd::String GetNamespaceSeparator() { return "::"; }
654 
655  static gd::String GetEventsFunctionFullType(const gd::String& extensionName,
656  const gd::String& functionName);
657 
658  static gd::String GetBehaviorEventsFunctionFullType(
659  const gd::String& extensionName,
660  const gd::String& behaviorName,
661  const gd::String& functionName);
662 
663  static gd::String GetBehaviorFullType(const gd::String& extensionName,
664  const gd::String& behaviorName);
665 
666  static gd::String GetObjectEventsFunctionFullType(
667  const gd::String& extensionName,
668  const gd::String& objectName,
669  const gd::String& functionName);
670 
671  static gd::String GetObjectFullType(const gd::String& extensionName,
672  const gd::String& objectName);
673 
674  static gd::String GetExtensionFromFullObjectType(const gd::String& type);
675 
676  static gd::String GetObjectNameFromFullObjectType(const gd::String& type);
677 
678  private:
683  void SetNameSpace(gd::String nameSpace_);
684 
685  gd::String name;
686  gd::String
687  nameSpace;
690  gd::String fullname;
691  gd::String informations;
692  gd::String category;
693  gd::String author;
694  gd::String license;
695  bool deprecated;
697  gd::String helpPath;
699  gd::String iconUrl;
700  std::vector<gd::String> tags;
701 
702  std::map<gd::String, gd::ObjectMetadata> objectsInfos;
703  std::map<gd::String, gd::BehaviorMetadata> behaviorsInfo;
704  std::map<gd::String, gd::EffectMetadata> effectsMetadata;
705  std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
706  std::map<gd::String, gd::InstructionMetadata> actionsInfos;
707  std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
708  std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
709  std::vector<gd::DependencyMetadata> extensionDependenciesMetadata;
710  std::vector<gd::SourceFileMetadata> extensionSourceFilesMetadata;
711  std::map<gd::String, gd::EventMetadata> eventsInfos;
712  std::map<gd::String, gd::PropertyDescriptor> extensionPropertiesMetadata;
713  std::map<gd::String, InstructionOrExpressionGroupMetadata>
714  instructionOrExpressionGroupMetadata;
715 
716  ObjectMetadata badObjectMetadata;
717  BehaviorMetadata badBehaviorMetadata;
718  EffectMetadata badEffectMetadata;
719  static std::map<gd::String, gd::InstructionMetadata>
720  badConditionsMetadata;
722  static std::map<gd::String, gd::InstructionMetadata>
723  badActionsMetadata;
725  static std::map<gd::String, gd::ExpressionMetadata>
726  badExpressionsMetadata;
728 };
729 
730 } // namespace gd
731 
735 #define GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION() \
736  compilationInfo.runtimeOnly = false; \
737  compilationInfo.sfmlMajorVersion = 2; \
738  compilationInfo.sfmlMinorVersion = 0; \
739  compilationInfo.gdCoreVersion = GD_VERSION_STRING; \
740  compilationInfo.sizeOfpInt = sizeof(int*); \
741  compilationInfo.gccMajorVersion = __GNUC__; \
742  compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
743  compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
744  compilationInfo.informationCompleted = true;
745 
746 #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:32
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
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:39
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:346
const std::map< gd::String, InstructionOrExpressionGroupMetadata > & GetAllInstructionOrExpressionGroupMetadata() const
Get the metadata (icon, etc...) for groups used for instructions or expressions.
Definition: PlatformExtension.h:638
const std::vector< gd::String > & GetTags() const
Return keywords that help search engines find this extension.
Definition: PlatformExtension.h:416
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:379
const gd::String & GetCategory() const
Return the category of the extension.
Definition: PlatformExtension.h:384
PlatformExtension & SetTags(const gd::String &csvTags)
Set keywords that help search engines find this extension.
Definition: PlatformExtension.h:421
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:399
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:354
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:394
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:629
const gd::String & GetHelpPath() const
Return the help path of extension, relative to the GDevelop documentation root.
Definition: PlatformExtension.h:405
const gd::String & GetIconUrl() const
Return the URL to the icon to be displayed for this extension.
Definition: PlatformExtension.h:411
const gd::String & GetFullName() const
Return the name extension user friendly name.
Definition: PlatformExtension.h:374
static gd::String GetNamespaceSeparator()
Get the string used to separate the name of the instruction/expression and the extension.
Definition: PlatformExtension.h:653
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:389
Used to describe a property shown in a property grid.
Definition: PropertyDescriptor.h:25
Contains information about a source file that must be included when an extension is used.
Definition: SourceFileMetadata.h:15
String represents an UTF8 encoded string.
Definition: String.h:33
std::vector< String > Split(value_type delimiter) const
Split the string with a delimiter.
Definition: String.cpp:358
Definition: CommonTools.h:24
Definition: PlatformExtension.h:75