GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
ObjectsContainer.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-2016 Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 #pragma once
7 
8 #include <memory>
9 #include <vector>
10 #include <set>
11 #include <unordered_map>
12 #include "GDCore/Project/MemoryTrackedRegistry.h"
13 #include "GDCore/String.h"
14 #include "GDCore/Project/ObjectGroupsContainer.h"
15 #include "GDCore/Project/ObjectFolderOrObject.h"
16 namespace gd {
17 class Object;
18 class Project;
19 class SerializerElement;
20 } // namespace gd
21 #undef GetObject // Disable an annoying macro
22 
23 namespace gd {
24 
39 class GD_CORE_API ObjectsContainer {
40  public:
41  enum SourceType {
42  Unknown,
43  Global,
44  Scene,
45  Object,
46  Function,
47  };
48 
52  ObjectsContainer(const SourceType sourceType);
53  virtual ~ObjectsContainer();
54 
56  ObjectsContainer& operator=(const ObjectsContainer& rhs);
57 
58  SourceType GetSourceType() const { return sourceType; }
59 
64 
68  bool HasObjectNamed(const gd::String& name) const;
69 
73  gd::Object& GetObject(const gd::String& name);
74 
78  const gd::Object& GetObject(const gd::String& name) const;
79 
84  gd::Object& GetObject(std::size_t index);
85 
90  const gd::Object& GetObject(std::size_t index) const;
91 
100  std::size_t GetObjectPosition(const gd::String& name) const;
101 
105  std::size_t GetObjectsCount() const;
106 
114  gd::Object& InsertNewObject(const gd::Project& project,
115  const gd::String& objectType,
116  const gd::String& name,
117  std::size_t position);
125  gd::Object& InsertNewObjectInFolder(
126  const gd::Project& project,
127  const gd::String& objectType,
128  const gd::String& name,
129  gd::ObjectFolderOrObject& objectFolderOrObject,
130  std::size_t position);
131 
141  gd::Object& InsertObject(const gd::Object& object, std::size_t position);
142 
150  void RemoveObject(const gd::String& name);
151 
155  void MoveObject(std::size_t oldIndex, std::size_t newIndex);
156 
165  void MoveObjectFolderOrObjectToAnotherContainerInFolder(
166  gd::ObjectFolderOrObject& objectFolderOrObject,
167  gd::ObjectsContainer& newContainer,
168  gd::ObjectFolderOrObject& newParentFolder,
169  std::size_t newPosition);
170 
174  void Clear();
175 
182  const std::vector<std::unique_ptr<gd::Object> >& GetObjects() const {
183  return initialObjects;
184  }
185 
186  std::set<gd::String> GetAllObjectNames() const;
188 
194  std::vector<const ObjectFolderOrObject*> GetAllObjectFolderOrObjects() const;
195 
196  gd::ObjectFolderOrObject& GetRootFolder() {
197  return *rootFolder;
198  }
199 
200  void AddMissingObjectsInRootFolder();
201 
206 
209  void SerializeObjectsTo(SerializerElement& element) const;
210 
214  void UnserializeObjectsFrom(gd::Project& project,
215  const SerializerElement& element);
219  void SerializeFoldersTo(SerializerElement& element) const;
220 
224  void UnserializeFoldersFrom(gd::Project& project,
225  const SerializerElement& element);
227 
232 
236  ObjectGroupsContainer& GetObjectGroups() { return objectGroups; }
237 
241  const ObjectGroupsContainer& GetObjectGroups() const { return objectGroups; }
242 
244 
245  protected:
246  std::vector<std::unique_ptr<gd::Object> >
248  gd::ObjectGroupsContainer objectGroups;
249 
250  private:
251  SourceType sourceType = Unknown;
252  std::unique_ptr<gd::ObjectFolderOrObject> rootFolder;
253  gd::MemoryTracked _memoryTracked{this, "ObjectsContainer"};
254 
260  mutable std::unordered_map<gd::String, gd::Object*> objectsByName;
261  mutable std::size_t objectsByNameGeneration = 0;
262  mutable bool objectsByNameUpToDate = false;
263 
267  gd::Object* FindObject(const gd::String& name) const;
268 
272  void InvalidateObjectsByName() { objectsByNameUpToDate = false; }
273 
278  void Init(const ObjectsContainer& other);
279 };
280 
281 } // namespace gd
Represent a layout ( also called a scene ) of a project.
Definition: Layout.h:41
A non-copyable, non-movable member object that registers/unregisters its owner with MemoryTrackedRegi...
Definition: MemoryTrackedRegistry.h:238
Class representing a folder structure in order to organize objects in folders (to be used with an Obj...
Definition: ObjectFolderOrObject.h:31
A container for objects groups.
Definition: ObjectGroupsContainer.h:30
Represent an object of a platform.
Definition: Object.h:39
Used as a base class for classes that will own objects (see gd::Object).
Definition: ObjectsContainer.h:39
const ObjectGroupsContainer & GetObjectGroups() const
Return a const reference to the project's objects groups.
Definition: ObjectsContainer.h:241
const std::vector< std::unique_ptr< gd::Object > > & GetObjects() const
Definition: ObjectsContainer.h:182
std::vector< std::unique_ptr< gd::Object > > initialObjects
Objects contained.
Definition: ObjectsContainer.h:247
ObjectGroupsContainer & GetObjectGroups()
Return a reference to the project's objects groups.
Definition: ObjectsContainer.h:236
Base class representing a project (game), including all resources, scenes, objects,...
Definition: Project.h:52
String represents an UTF8 encoded string.
Definition: String.h:33
Definition: CommonTools.h:24