GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
ObjectFolderOrObject.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-2023 Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 #ifndef GDCORE_OBJECTFOLDEROROBJECT_H
7 #define GDCORE_OBJECTFOLDEROROBJECT_H
8 #include <memory>
9 #include <vector>
10 
11 #include "GDCore/Serialization/SerializerElement.h"
12 #include "GDCore/String.h"
13 
14 namespace gd {
15 class Project;
16 class Object;
17 class SerializerElement;
18 class ObjectsContainer;
19 } // namespace gd
20 
21 namespace gd {
22 
29 class GD_CORE_API ObjectFolderOrObject {
30  public:
36  virtual ~ObjectFolderOrObject();
40  ObjectFolderOrObject(gd::String folderName_,
41  ObjectFolderOrObject* parent_ = nullptr);
46  ObjectFolderOrObject* parent_ = nullptr);
47 
51  gd::Object& GetObject() const { return *object; }
52 
56  bool IsFolder() const { return !folderName.empty(); }
60  const gd::String& GetFolderName() const { return folderName; }
61 
66  void SetFolderName(const gd::String& name);
67 
72  bool HasObjectNamed(const gd::String& name);
77  ObjectFolderOrObject& GetObjectNamed(const gd::String& name);
78 
83  std::size_t GetChildrenCount() const {
84  if (IsFolder()) return children.size();
85  return 0;
86  }
90  ObjectFolderOrObject& GetChildAt(std::size_t index);
94  const ObjectFolderOrObject& GetChildAt(std::size_t index) const;
103  ObjectFolderOrObject& GetObjectChild(const gd::String& name);
104 
110  if (parent == nullptr) {
111  return badObjectFolderOrObject;
112  }
113  return *parent;
114  };
115 
120  bool IsRootFolder() { return !object && !parent; }
121 
125  void MoveChild(std::size_t oldIndex, std::size_t newIndex);
130  void RemoveFolderChild(const ObjectFolderOrObject& childToRemove);
135  void RemoveRecursivelyObjectNamed(const gd::String& name);
136 
141  void InsertObject(gd::Object* insertedObject,
142  std::size_t position = (size_t)-1);
147  ObjectFolderOrObject& InsertNewFolder(const gd::String& newFolderName,
148  std::size_t position);
153  bool IsADescendantOf(const ObjectFolderOrObject& otherObjectFolderOrObject);
154 
159  std::size_t GetChildPosition(const ObjectFolderOrObject& child) const;
164  void MoveObjectFolderOrObjectToAnotherFolder(
165  gd::ObjectFolderOrObject& objectFolderOrObject,
166  gd::ObjectFolderOrObject& newParentFolder,
167  std::size_t newPosition);
168 
173 
176  void SerializeTo(SerializerElement& element) const;
177 
181  void UnserializeFrom(gd::Project& project,
182  const SerializerElement& element,
183  ObjectsContainer& objectsContainer);
185 
186  private:
187  static gd::ObjectFolderOrObject badObjectFolderOrObject;
188 
190  parent; // nullptr if root folder, points to the parent folder otherwise.
191 
192  // Representing an object:
193  gd::Object* object; // nullptr if folderName is set.
194 
195  // or representing a folder:
196  gd::String folderName; // Empty if object is set.
197  std::vector<std::unique_ptr<ObjectFolderOrObject>>
198  children; // Folder children.
199 };
200 
201 } // namespace gd
202 
203 #endif // GDCORE_OBJECTFOLDEROROBJECT_H
Class representing a folder structure in order to organize objects in folders (to be used with an Obj...
Definition: ObjectFolderOrObject.h:29
bool IsRootFolder()
Returns true if the instance is a root folder (that's to say it has no parent).
Definition: ObjectFolderOrObject.h:120
const gd::String & GetFolderName() const
Returns the name of the folder.
Definition: ObjectFolderOrObject.h:60
gd::Object & GetObject() const
Returns the object behind the instance.
Definition: ObjectFolderOrObject.h:51
ObjectFolderOrObject & GetParent()
Returns the parent of the instance. If the instance has no parent (root folder), the null object is r...
Definition: ObjectFolderOrObject.h:109
bool IsFolder() const
Returns true if the instance represents a folder.
Definition: ObjectFolderOrObject.h:56
std::size_t GetChildrenCount() const
Returns the number of children. Returns 0 if the instance represents an object.
Definition: ObjectFolderOrObject.h:83
Represent an object of a platform.
Definition: Object.h:37
Used as a base class for classes that will own objects (see gd::Object).
Definition: ObjectsContainer.h:36
Base class representing a project (game), including all resources, scenes, objects,...
Definition: Project.h:50
A generic container that can represent a value ( containing a string, double, bool or int),...
Definition: SerializerElement.h:37
String represents an UTF8 encoded string.
Definition: String.h:31
Definition: CommonTools.h:24