diff --git a/sources/ewol/context/Context.cpp b/sources/ewol/context/Context.cpp index 45eca0c2..9e5db504 100644 --- a/sources/ewol/context/Context.cpp +++ b/sources/ewol/context/Context.cpp @@ -387,12 +387,17 @@ ewol::Context::~Context() { do { m_objectManager.removeAllRemovedObject(); } while (m_resourceManager.checkResourceToRemove() == true); - m_objectManager.displayListObject(); // call application to uninit APP_UnInit(*this); - // unset all windows + // clean all messages m_msgSystem.clean(); + // an other cycle of removing ... + do { + m_objectManager.removeAllRemovedObject(); + } while (m_resourceManager.checkResourceToRemove() == true); + EWOL_INFO("List of all widget of this context must be equal at 0 ==> otherwise some remove is missing"); + m_objectManager.displayListObject(); // Resource is an lower element as objects ... m_resourceManager.unInit(); // now All must be removed !!! diff --git a/sources/ewol/object/Manager.cpp b/sources/ewol/object/Manager.cpp index 670a2aa8..55cd0b1e 100644 --- a/sources/ewol/object/Manager.cpp +++ b/sources/ewol/object/Manager.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #undef __class__ @@ -36,8 +37,9 @@ ewol::object::Manager::~Manager() { } void ewol::object::Manager::displayListObject() { + EWOL_INFO("List loaded object : "); for (auto &it : m_eObjectList) { - EWOL_ERROR("List object : " << it->getName() << " : " << it->getTypeDescription() << " nb ref=" << it->getRefCount()); + EWOL_INFO(" Ref=" << it->getRefCount() << " remove=" << it->isDestroyed() << " name='" << it->getName() << "' type=" << it->getObjectType()); } } @@ -54,9 +56,11 @@ void ewol::object::Manager::unInit() { if (m_eObjectListActive.size() != 0) { EWOL_ERROR("Have " << m_eObjectListActive.size() << " active Object"); } + m_multiCast.clear(); m_eObjectListActive.clear(); m_eObjectList.clear(); removeAllRemovedObject(); + } void ewol::object::Manager::add(const ewol::object::Shared& _object) { @@ -75,12 +79,13 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared< for (auto &it : m_eObjectList) { if ( it != nullptr && it != _object) { - EWOL_VERBOSE("[" << _object->getId() << "] Inform remove Element : " << it->getId() << " type : " << it->getTypeDescription()); + EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << it->getId() << " type=" << it->getObjectType() << " name='" << it->getName() << "'"); it->onObjectRemove(_object); } } // inform context that n object is removed ... m_context.onObjectRemove(_object); + m_multiCast.onObjectRemove(_object); EWOL_VERBOSE("m_removeEventList.size() = " << m_removeEventList.size()); for (auto &it : m_removeEventList) { EWOL_VERBOSE("[" << _object->getId() << "] Inform Event Remove Object List : ..."); @@ -107,15 +112,18 @@ void ewol::object::Manager::remove(const ewol::object::Shared& _ob EWOL_ERROR("Try to Auto-Remove (nullptr) Object"); return; } - for (int64_t iii = (int64_t)m_eObjectListActive.size()-1; iii>=0; --iii) { - if (m_eObjectListActive[iii] == _object) { + auto it(m_eObjectListActive.begin()); + while (it != m_eObjectListActive.end()) { + if (*it == _object) { + m_eObjectListActive.erase(it); // remove Element - EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "'"); + EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "' name=" << _object->getName()); informOneObjectIsRemoved(_object); ewol::getContext().forceRedrawAll(); EWOL_DEBUG("Auto-Remove Object ... done (have " << _object->getRefCount() << " references)"); - m_eObjectListActive.erase(m_eObjectListActive.begin()+iii); - return; + it = m_eObjectListActive.begin(); + } else { + ++it; } } EWOL_ERROR("Try to Auto-Remove Object that is not referenced ..."); @@ -124,20 +132,15 @@ void ewol::object::Manager::remove(const ewol::object::Shared& _ob // clean all Object that request an autoRemove ... void ewol::object::Manager::removeAllRemovedObject() { EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectListActive.size() << "/" << m_eObjectList.size() << " elemeents"); - bool haveRemoveElement = true; - while (haveRemoveElement == true) { - haveRemoveElement = false; - for (int64_t iii = (int64_t)m_eObjectList.size()-1; iii>=0; --iii) { - if (m_eObjectList[iii] == nullptr) { - continue; - } - if (m_eObjectList[iii]->getRefCount() > 1) { - continue; - } - EWOL_DEBUG("remove definitly : [" << m_eObjectList[iii]->getId() << "] type='" << m_eObjectList[iii]->getObjectType() << "'"); - m_eObjectList.erase(m_eObjectList.begin() + iii); - haveRemoveElement = true; - break; + auto it(m_eObjectList.begin()); + while (it != m_eObjectList.end()) { + if ( *it != nullptr + && (*it)->getRefCount() <= 1) { + EWOL_DEBUG("remove definitly : [" << (*it)->getId() << "] type='" << (*it)->getObjectType() << "'"); + m_eObjectList.erase(it); + it = m_eObjectList.begin(); + } else { + ++it; } } } @@ -146,11 +149,10 @@ ewol::object::Shared ewol::object::Manager::get(const std::string& if (_name == "") { return nullptr; } - for (size_t iii=0; iiigetName() == _name) { - return m_eObjectList[iii]; - } + for (auto &it : m_eObjectList) { + if ( it != nullptr + && it->getName() == _name) { + return it; } } return nullptr; diff --git a/sources/ewol/object/MultiCast.cpp b/sources/ewol/object/MultiCast.cpp index 0e45469c..3ab2f104 100644 --- a/sources/ewol/object/MultiCast.cpp +++ b/sources/ewol/object/MultiCast.cpp @@ -23,6 +23,22 @@ ewol::object::MultiCast::~MultiCast() { m_messageList.clear(); } +void ewol::object::MultiCast::clear() { + EWOL_INFO("EObject message Multi-Cast"); + m_messageList.clear(); +} + +void ewol::object::MultiCast::onObjectRemove(const ewol::object::Shared& _object) { + auto it(m_messageList.begin()); + while (it != m_messageList.end()) { + if (it->m_object == _object) { + m_messageList.erase(it); + it = m_messageList.begin(); + } else { + ++it; + } + } +} void ewol::object::MultiCast::add(const ewol::object::Shared& _object, const char* const _message) { if (nullptr == _object) { @@ -44,12 +60,14 @@ void ewol::object::MultiCast::rm(const ewol::object::Shared& _obje return; } // send the message at all registered widget ... - for (int32_t iii=m_messageList.size()-1; iii >= 0; iii--) { - if(m_messageList[iii].m_object == _object) { + auto it(m_messageList.begin()); + while (it != m_messageList.end()) { + if(it->m_object == _object) { EWOL_DEBUG("SendMulticast RM listener :" << _object->getId()); - m_messageList[iii].m_message = nullptr; - m_messageList[iii].m_object = nullptr; - m_messageList.erase(m_messageList.begin()+iii); + m_messageList.erase(it); + it = m_messageList.begin(); + } else { + ++it; } } } @@ -58,15 +76,14 @@ void ewol::object::MultiCast::send(const ewol::object::Shared& _ob EWOL_VERBOSE("SendMulticast message \"" << _message << "\" data=\"" << _data << "\" to :"); // send the message at all registered widget ... - for (size_t iii=0; iii lock(m_lockRefCount); if (m_isDestroyed == true) { diff --git a/sources/ewol/object/Object.h b/sources/ewol/object/Object.h index 45e85112..47da1e90 100644 --- a/sources/ewol/object/Object.h +++ b/sources/ewol/object/Object.h @@ -100,11 +100,17 @@ namespace ewol { * @brief Asynchronous removing the object */ void removeObject(); - public: /** * @brief Respown a removed object */ void respownObject(); + /** + * @brief Get if the element is destroyed or not + * @return true The element in destroyed + */ + bool isDestroyed() { + return m_isDestroyed; + } private: std::vector m_listType; public: diff --git a/sources/ewol/resource/Manager.cpp b/sources/ewol/resource/Manager.cpp index a2539c88..619baef7 100644 --- a/sources/ewol/resource/Manager.cpp +++ b/sources/ewol/resource/Manager.cpp @@ -40,13 +40,15 @@ void ewol::resource::Manager::unInit() { display(); m_resourceListToUpdate.clear(); // remove all resources ... - for (auto &it : m_resourceList) { - if (it != nullptr) { - EWOL_WARNING("Find a resource that is not removed : [" << it->getId() << "]" - << "=\"" << it->getName() << "\" " - << it->getRefCount() << " elements"); - it.reset(); + auto it(m_resourceList.begin()); + while(it != m_resourceList.end()) { + if ((*it) != nullptr) { + EWOL_WARNING("Find a resource that is not removed : [" << (*it)->getId() << "]" + << "=\"" << (*it)->getName() << "\" " + << (*it)->getRefCount() << " elements"); } + m_resourceList.erase(it); + it = m_resourceList.begin(); } m_resourceList.clear(); } diff --git a/sources/ewol/widget/Container.cpp b/sources/ewol/widget/Container.cpp index f6e25bb9..27654711 100644 --- a/sources/ewol/widget/Container.cpp +++ b/sources/ewol/widget/Container.cpp @@ -71,8 +71,9 @@ ewol::object::Shared ewol::widget::Container::getWidgetNamed(const return nullptr; } -void ewol::widget::Container::onObjectRemove(const ewol::object::Shared& _removeObject) { - if (m_subWidget == _removeObject) { +void ewol::widget::Container::onObjectRemove(const ewol::object::Shared& _object) { + ewol::Widget::onObjectRemove(_object); + if (m_subWidget == _object) { m_subWidget.reset(); markToRedraw(); requestUpdateSize(); diff --git a/sources/ewol/widget/Container.h b/sources/ewol/widget/Container.h index 351dd18d..6bd672f8 100644 --- a/sources/ewol/widget/Container.h +++ b/sources/ewol/widget/Container.h @@ -54,7 +54,7 @@ namespace ewol { public: // Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const ewol::object::Shared& _object); virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); diff --git a/sources/ewol/widget/Container2.cpp b/sources/ewol/widget/Container2.cpp index 68ceb0ec..28539782 100644 --- a/sources/ewol/widget/Container2.cpp +++ b/sources/ewol/widget/Container2.cpp @@ -73,13 +73,14 @@ ewol::object::Shared ewol::widget::Container2::getWidgetNamed(cons return nullptr; } -void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared& _removeObject) { - if (m_subWidget[0] == _removeObject) { +void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared& _object) { + ewol::Widget::onObjectRemove(_object); + if (m_subWidget[0] == _object) { m_subWidget[0].reset(); markToRedraw(); requestUpdateSize(); } - if (m_subWidget[1] == _removeObject) { + if (m_subWidget[1] == _object) { m_subWidget[1].reset(); markToRedraw(); requestUpdateSize(); diff --git a/sources/ewol/widget/Container2.h b/sources/ewol/widget/Container2.h index c7761fb4..bbf39536 100644 --- a/sources/ewol/widget/Container2.h +++ b/sources/ewol/widget/Container2.h @@ -152,7 +152,7 @@ namespace ewol { public: // Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const ewol::object::Shared& _object); virtual void calculateSize(const vec2& _availlable) { calculateSizePadded(_availlable); } diff --git a/sources/ewol/widget/ContainerN.cpp b/sources/ewol/widget/ContainerN.cpp index ec5bfa9e..fd1f19c8 100644 --- a/sources/ewol/widget/ContainerN.cpp +++ b/sources/ewol/widget/ContainerN.cpp @@ -142,13 +142,17 @@ ewol::object::Shared ewol::widget::ContainerN::getWidgetNamed(cons return nullptr; } -void ewol::widget::ContainerN::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::widget::ContainerN::onObjectRemove(const ewol::object::Shared& _object) { // First step call parrent : - ewol::Widget::onObjectRemove(_removeObject); + ewol::Widget::onObjectRemove(_object); // second step find if in all the elements ... - for (auto it(m_subWidget.begin()) ; it != m_subWidget.end() ; ++it) { - if(*it == _removeObject) { + auto it(m_subWidget.begin()); + while (it != m_subWidget.end()) { + if(*it == _object) { m_subWidget.erase(it); + it = m_subWidget.begin(); + } else { + ++it; } } } diff --git a/sources/ewol/widget/ContainerN.h b/sources/ewol/widget/ContainerN.h index 255192d9..d723e6fc 100644 --- a/sources/ewol/widget/ContainerN.h +++ b/sources/ewol/widget/ContainerN.h @@ -89,7 +89,7 @@ namespace ewol { public:// Derived function virtual void systemDraw(const ewol::DrawProperty& _displayProp); virtual void onRegenerateDisplay(); - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const ewol::object::Shared& _object); virtual void calculateSize(const vec2& _availlable); virtual void calculateMinMaxSize(); virtual ewol::object::Shared getWidgetAtPos(const vec2& _pos); diff --git a/sources/ewol/widget/Gird.cpp b/sources/ewol/widget/Gird.cpp index a90356c8..523eb54a 100644 --- a/sources/ewol/widget/Gird.cpp +++ b/sources/ewol/widget/Gird.cpp @@ -366,6 +366,6 @@ void ewol::widget::Gird::onObjectRemove(const ewol::object::Shared } } if (m_tmpWidget == _removeObject) { - m_tmpWidget = nullptr; + m_tmpWidget.reset(); } }