mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
197 lines
5.1 KiB
C++
197 lines
5.1 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
|
* reserved. This project is released under the MIT License.
|
|
*/
|
|
|
|
#ifndef GDCORE_OBJECTGROUPSCONTAINER_H
|
|
#define GDCORE_OBJECTGROUPSCONTAINER_H
|
|
#include <algorithm>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "GDCore/Project/ObjectGroup.h"
|
|
#include "GDCore/String.h"
|
|
namespace gd {
|
|
class SerializerElement;
|
|
}
|
|
|
|
namespace gd {
|
|
|
|
/**
|
|
* \brief A container for objects groups
|
|
*
|
|
* \see gd::Project
|
|
* \see gd::Layout
|
|
*
|
|
* \ingroup PlatformDefinition
|
|
*/
|
|
class GD_CORE_API ObjectGroupsContainer {
|
|
public:
|
|
ObjectGroupsContainer();
|
|
ObjectGroupsContainer(const ObjectGroupsContainer&);
|
|
virtual ~ObjectGroupsContainer(){};
|
|
ObjectGroupsContainer& operator=(const ObjectGroupsContainer& rhs);
|
|
|
|
/**
|
|
* \brief Return true if the specified group is in the container
|
|
*/
|
|
bool Has(const gd::String& name) const;
|
|
|
|
/**
|
|
* \brief Return a reference to the group called \a name.
|
|
*/
|
|
ObjectGroup& Get(const gd::String& name);
|
|
|
|
/**
|
|
* \brief Return a reference to the group called \a name.
|
|
*/
|
|
const ObjectGroup& Get(const gd::String& name) const;
|
|
|
|
/**
|
|
* \brief Return the group at position \index in the container.
|
|
*
|
|
* \note If index is invalid, an empty group is returned.
|
|
*/
|
|
ObjectGroup& Get(std::size_t index);
|
|
|
|
/**
|
|
* \brief Return the group at position \index in the container.
|
|
*
|
|
* \note If index is invalid, an empty group is returned.
|
|
*/
|
|
const ObjectGroup& Get(std::size_t index) const;
|
|
|
|
/**
|
|
* Add a new group constructed from the group passed as parameter.
|
|
* \param objectGroup The group that must be copied and inserted into the
|
|
* container \param position Insertion position. If the position is invalid,
|
|
* the group is inserted at the end of the group list. \return Reference to
|
|
* the newly added group
|
|
*/
|
|
ObjectGroup& Insert(const ObjectGroup& objectGroup,
|
|
std::size_t position = -1);
|
|
|
|
/**
|
|
* \brief Return the number of groups.
|
|
*/
|
|
std::size_t Count() const { return objectGroups.size(); };
|
|
|
|
/**
|
|
* \brief Return true if the container is empty.
|
|
*/
|
|
bool IsEmpty() const { return objectGroups.empty(); };
|
|
|
|
/**
|
|
* \brief return the position of the group called "name" in the group list
|
|
*/
|
|
std::size_t GetPosition(const gd::String& name) const;
|
|
|
|
/**
|
|
* \brief Add a new empty group at the specified position in the container.
|
|
* \param name The new group name
|
|
* \param position Insertion position. If the position is invalid, the group
|
|
* is inserted at the end of the group list. \return Reference to the newly
|
|
* added group
|
|
*/
|
|
ObjectGroup& InsertNew(const gd::String& name, std::size_t position = -1);
|
|
|
|
/**
|
|
* \brief Remove the specified group from the container.
|
|
*/
|
|
void Remove(const gd::String& name);
|
|
|
|
/**
|
|
* \brief Rename a group.
|
|
* \return true if the group was renamed, false otherwise.
|
|
*/
|
|
bool Rename(const gd::String& oldName, const gd::String& newName);
|
|
|
|
/**
|
|
* \brief Move the specified group at a new position in the list.
|
|
*/
|
|
void Move(std::size_t oldIndex, std::size_t newIndex);
|
|
|
|
/**
|
|
* \brief Clear all groups of the container.
|
|
*/
|
|
inline void Clear() { objectGroups.clear(); }
|
|
|
|
/**
|
|
* \brief Call the callback for each group name matching the specified search.
|
|
*/
|
|
void ForEachNameMatchingSearch(const gd::String& search, std::function<void(const gd::String& name)> fn) const;
|
|
///@}
|
|
|
|
/** \name Saving and loading
|
|
* Members functions related to saving and loading the object.
|
|
*/
|
|
///@{
|
|
/**
|
|
* \brief Serialize objects groups container.
|
|
*/
|
|
void SerializeTo(SerializerElement& element) const;
|
|
|
|
/**
|
|
* \brief Unserialize the objects groups container.
|
|
*/
|
|
void UnserializeFrom(const SerializerElement& element);
|
|
///@}
|
|
|
|
/** \name std::vector API compatibility
|
|
* These functions ensure that the class can be used just like a std::vector.
|
|
*/
|
|
///@{
|
|
|
|
/**
|
|
* \brief Alias for Count()
|
|
* \see ObjectGroupsContainer::Count.
|
|
*/
|
|
size_t size() const { return Count(); }
|
|
|
|
/**
|
|
* \brief Alias for IsEmpty()
|
|
* \see ObjectGroupsContainer::IsEmpty.
|
|
*/
|
|
bool empty() const { return IsEmpty(); }
|
|
|
|
/**
|
|
* \brief Alias for Get()
|
|
* \see ObjectGroupsContainer::Get.
|
|
*/
|
|
ObjectGroup& operator[](size_t index) { return Get(index); };
|
|
|
|
/**
|
|
* \brief Alias for Get()
|
|
* \see ObjectGroupsContainer::Get.
|
|
*/
|
|
const ObjectGroup& operator[](size_t index) const { return Get(index); };
|
|
|
|
/**
|
|
* \brief Alias for Get()
|
|
* \see ObjectGroupsContainer::Get.
|
|
*/
|
|
ObjectGroup& at(size_t index) { return Get(index); };
|
|
|
|
/**
|
|
* \brief Alias for Get()
|
|
* \see ObjectGroupsContainer::Get.
|
|
*/
|
|
const ObjectGroup& at(size_t index) const { return Get(index); };
|
|
///@}
|
|
|
|
/**
|
|
* Initialize from another object groups container. Used by copy-ctor and
|
|
* assign-op. Don't forget to update me if members were changed!
|
|
*/
|
|
void Init(const gd::ObjectGroupsContainer& other);
|
|
|
|
private:
|
|
std::vector<std::unique_ptr<gd::ObjectGroup>> objectGroups;
|
|
static ObjectGroup badGroup;
|
|
};
|
|
|
|
} // namespace gd
|
|
|
|
#endif // GDCORE_OBJECTGROUPSCONTAINER_H
|