diff --git a/sources/ewol/object/Manager.cpp b/sources/ewol/object/Manager.cpp index 5edc76d3..387d2e46 100644 --- a/sources/ewol/object/Manager.cpp +++ b/sources/ewol/object/Manager.cpp @@ -89,6 +89,41 @@ void ewol::object::Manager::add(const ewol::object::Shared& _objec m_eObjectList.push_back(_object); } +void ewol::object::Manager::rm(const ewol::object::Shared& _object) { + if (_object == nullptr) { + EWOL_ERROR("Try to remove (nullptr) Object"); + return; + } + for (size_t iii=0; iii& _object) { + // What I need to do ... +} + +void ewol::object::Manager::rmOwned(const ewol::object::Shared& _object) { + // What I need to do ... +} + + int32_t ewol::object::Manager::getNumberObject() { return m_eObjectList.size() + m_eObjectAutoRemoveList.size(); } @@ -125,29 +160,8 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared< ewol::getContext().onObjectRemove(_object); } -void ewol::object::Manager::rm(const ewol::object::Shared& _object) { - if (_object == nullptr) { - EWOL_ERROR("Try to remove (nullptr) Object"); - return; - } - for (size_t iii=0; iii& _object){ + } void ewol::object::Manager::autoRemove(const ewol::object::Shared& _object) { diff --git a/sources/ewol/object/Manager.h b/sources/ewol/object/Manager.h index 18869c8a..268c107f 100644 --- a/sources/ewol/object/Manager.h +++ b/sources/ewol/object/Manager.h @@ -29,9 +29,12 @@ namespace ewol { void add(const ewol::object::Shared& _object); void rm(const ewol::object::Shared& _object); + void addOwned(const ewol::object::Shared& _object); + void rmOwned(const ewol::object::Shared& _object); int32_t getNumberObject(); void autoRemove(const ewol::object::Shared& _object); + void autoRespown(const ewol::object::Shared& _object); void removeAllAutoRemove(); ewol::object::Shared get(const std::string& _name); diff --git a/sources/ewol/object/Object.cpp b/sources/ewol/object/Object.cpp index ae0aecc0..e76ce0d7 100644 --- a/sources/ewol/object/Object.cpp +++ b/sources/ewol/object/Object.cpp @@ -38,12 +38,14 @@ bool ewol::Object::setRefOwner(bool _haveOwner) { return false;; } m_hasReferenceOwner = true; + getObjectManager().addOwned(this); return true; } if (m_hasReferenceOwner == false) { EWOL_CRITICAL("Object have already NO owner"); return false; } + getObjectManager().rmOwned(this); m_hasReferenceOwner = false; return true; } @@ -68,6 +70,31 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) { ::operator delete(_ptr); } +void ewol::Object::autoDestroy() { + std::unique_lock lock(m_lockRefCount); + if (m_isDestroyed == true) { + EWOL_WARNING("Request remove of a removed object"); + return; + } + m_isDestroyed = true; + getObjectManager().autoRemove(this); +} + +void ewol::Object::removeObject() { + autoDestroy(); +} + +void respownObject() { + std::unique_lock lock(m_lockRefCount); + if (m_isDestroyed == false) { + EWOL_WARNING("Respawn an alive object"); + return; + } + m_isDestroyed = false; + getObjectManager().autoRespown(this); +} + + ewol::Object::Object() : @@ -143,14 +170,6 @@ bool ewol::Object::isTypeCompatible(const std::string& _type) { return false; } -void ewol::Object::autoDestroy() { - getObjectManager().autoRemove(this); -} - -void ewol::Object::removeObject() { - getObjectManager().autoRemove(this); -} - void ewol::Object::addEventId(const char * _generateEventId) { if (nullptr != _generateEventId) { m_availlableEventId.push_back(_generateEventId); diff --git a/sources/ewol/object/Object.h b/sources/ewol/object/Object.h index 65abde0e..38530240 100644 --- a/sources/ewol/object/Object.h +++ b/sources/ewol/object/Object.h @@ -93,6 +93,8 @@ namespace ewol { * @brief Destructor */ virtual ~Object(); + private: + bool m_isDestroyed; protected: /** * @brief Auto-destroy the object @@ -103,6 +105,11 @@ namespace ewol { * @brief Asynchronous removing the object */ void removeObject(); + public: + /** + * @brief Respown a removed object + */ + void respownObject(); private: std::vector m_listType; public: