diff --git a/sources/ewol/context/Context.cpp b/sources/ewol/context/Context.cpp index 06dd7e0a..e4467e80 100644 --- a/sources/ewol/context/Context.cpp +++ b/sources/ewol/context/Context.cpp @@ -388,18 +388,15 @@ ewol::Context::~Context() { // Remove current windows m_windowsCurrent.reset(); // clean all widget and sub widget with their resources: - do { - m_objectManager.removeAllRemovedObject(); - } while (m_resourceManager.checkResourceToRemove() == true); + m_objectManager.cleanInternalRemoved(); // call application to uninit m_application->unInit(*this); m_application.reset(); // clean all messages m_msgSystem.clean(); - // an other cycle of removing ... - do { - m_objectManager.removeAllRemovedObject(); - } while (m_resourceManager.checkResourceToRemove() == true); + // internal clean elements + m_objectManager.cleanInternalRemoved(); + m_resourceManager.cleanInternalRemoved(); EWOL_INFO("List of all widget of this context must be equal at 0 ==> otherwise some remove is missing"); m_objectManager.displayListObject(); @@ -667,9 +664,8 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) { m_resourceManager.updateContext(); // release open GL Context ewol::openGL::unLock(); - do { - m_objectManager.removeAllRemovedObject(); - } while (m_resourceManager.checkResourceToRemove() == true); + m_objectManager.cleanInternalRemoved(); + m_resourceManager.cleanInternalRemoved(); // release the curent interface : unLockContext(); } @@ -683,8 +679,7 @@ void ewol::Context::onObjectRemove(const std::shared_ptr& _object) } // inform all manager that can not be directly linked with the object manager m_input.onObjectRemove(_object); - m_widgetManager.onObjectRemove(_object); - m_resourceManager.checkResourceToRemove(); + m_resourceManager.cleanInternalRemoved(); } void ewol::Context::resetIOEvent() { diff --git a/sources/ewol/object/Manager.cpp b/sources/ewol/object/Manager.cpp index f229eff9..2f942b68 100644 --- a/sources/ewol/object/Manager.cpp +++ b/sources/ewol/object/Manager.cpp @@ -37,7 +37,7 @@ void ewol::object::Manager::displayListObject() { for (auto &it : m_eObjectList) { std::shared_ptr element = it.lock(); if (element != nullptr) { - EWOL_INFO(" name='" << element->getName() << "' type=" << element->getObjectType()); + EWOL_INFO(" [" << element->getId() << "] ref=" << element.use_count()-1 << " name='" << element->getName() << "' type=" << element->getObjectType()); } } } @@ -68,65 +68,8 @@ int32_t ewol::object::Manager::getNumberObject() { return m_eObjectList.size(); } -void ewol::object::Manager::informOneObjectIsRemoved(const std::shared_ptr& _object) { - EWOL_TODO("ewol::object::Manager::informOneObjectIsRemoved()"); - /* - for (auto &it : m_eObjectList) { - std::shared_ptr element = it.lock(); - if ( element != nullptr - && element != _object) { - EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << element->getId() << " type=" << element->getObjectType() << " name='" << element->getName() << "'"); - element->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 : ..."); - std::shared_ptr element = it.lock(); - if (element != nullptr) { - element->onObjectRemove(_object); - } - } - */ -} - -void ewol::object::Manager::remove(const std::shared_ptr& _object) { - EWOL_TODO("ewol::object::Manager::remove()"); - /* - if (_object == nullptr) { - EWOL_ERROR("Try to Auto-Remove (nullptr) Object"); - return; - } - int32_t count = 0; - 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() << "' name=" << _object->getName()); - informOneObjectIsRemoved(_object); - ewol::getContext().forceRedrawAll(); - EWOL_VERBOSE("Auto-Remove Object ... done (have " << _object->getRefCount() << " references)"); - it = m_eObjectListActive.begin(); - count++; - } else { - ++it; - } - } - if (count == 0) { - EWOL_ERROR("Try to Auto-Remove Object that is not referenced ..."); - } else if ( count>1 - || count<0) { - EWOL_ERROR("Remove more than one object in the system list ==> this is a real problem ..."); - } - */ -} - // clean all Object that request an autoRemove ... -void ewol::object::Manager::removeAllRemovedObject() { +void ewol::object::Manager::cleanInternalRemoved() { size_t nbObject = m_eObjectList.size(); EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectList.size() << " elements"); auto it(m_eObjectList.begin()); diff --git a/sources/ewol/object/Manager.h b/sources/ewol/object/Manager.h index 4d8a3d63..6d0ac476 100644 --- a/sources/ewol/object/Manager.h +++ b/sources/ewol/object/Manager.h @@ -43,17 +43,10 @@ namespace ewol { * @param[in] _object Reference shared pointer on the object */ void add(const std::shared_ptr& _object); - /** - * @brief Called when an object request to be removed - * @param[in] _object Reference shared pointer on the object - */ - void remove(const std::shared_ptr& _object); public: - void removeAllRemovedObject(); + void cleanInternalRemoved(); std::shared_ptr get(const std::string& _name); - private: - void informOneObjectIsRemoved(const std::shared_ptr& _object); private: ewol::object::MultiCast m_multiCast; //!< muticast manager public: diff --git a/sources/ewol/object/Object.cpp b/sources/ewol/object/Object.cpp index 838070c6..73643427 100644 --- a/sources/ewol/object/Object.cpp +++ b/sources/ewol/object/Object.cpp @@ -34,7 +34,7 @@ void ewol::Object::autoDestroy() { } void ewol::Object::requestDestroyFromChild(const std::shared_ptr& _child) { - EWOL_WARNING("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)"); + EWOL_CRITICAL("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)"); } void ewol::Object::setParent(const std::shared_ptr& _newParent) { // TODO : Implement change of parent ... @@ -59,8 +59,6 @@ ewol::Object::Object() : ewol::Object::~Object() { EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription()); - //getObjectManager().remove(shared_from_this()); - // TODO : getMultiCast().rm(); m_externEvent.clear(); m_availlableEventId.clear(); m_uniqueId = -1; diff --git a/sources/ewol/resource/Manager.cpp b/sources/ewol/resource/Manager.cpp index 73bddde2..3f6a6d84 100644 --- a/sources/ewol/resource/Manager.cpp +++ b/sources/ewol/resource/Manager.cpp @@ -154,15 +154,15 @@ void ewol::resource::Manager::contextHasBeenDestroyed() { // internal generic keeper ... std::shared_ptr ewol::resource::Manager::localKeep(const std::string& _filename) { - EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\""); + EWOL_VERBOSE("KEEP (DEFAULT) : file : '" << _filename << "' in " << m_resourceList.size() << " resources"); for (auto &it : m_resourceList) { std::shared_ptr tmpRessource = it.lock(); - if ( tmpRessource != nullptr - && tmpRessource->getName() == _filename) { - return tmpRessource; + if (tmpRessource != nullptr) { + if (tmpRessource->getName() == _filename) { + return tmpRessource; + } } } - // we did not find it ... return nullptr; } @@ -181,18 +181,13 @@ void ewol::resource::Manager::localAdd(const std::shared_ptr& _o } // in case of error ... -bool ewol::resource::Manager::checkResourceToRemove() { +void ewol::resource::Manager::cleanInternalRemoved() { //EWOL_INFO("remove object in Manager"); updateContext(); for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) { - if ((*it).lock() == nullptr) { + if ((*it).expired() == true) { m_resourceList.erase(it); it = m_resourceList.begin(); - continue; } - m_resourceList.erase(it); - it = m_resourceList.begin(); - return true; } - return false; } diff --git a/sources/ewol/resource/Manager.h b/sources/ewol/resource/Manager.h index d9635042..38dbc510 100644 --- a/sources/ewol/resource/Manager.h +++ b/sources/ewol/resource/Manager.h @@ -63,7 +63,7 @@ namespace ewol { // internal API to extent eResources in extern Soft std::shared_ptr localKeep(const std::string& _filename); void localAdd(const std::shared_ptr& _object); - virtual bool checkResourceToRemove(); + virtual void cleanInternalRemoved(); }; }; }; diff --git a/sources/ewol/widget/Manager.cpp b/sources/ewol/widget/Manager.cpp index c2a81ccb..8ec5ce0a 100644 --- a/sources/ewol/widget/Manager.cpp +++ b/sources/ewol/widget/Manager.cpp @@ -33,8 +33,6 @@ #define __class__ "ewol::widget::Manager" ewol::widget::Manager::Manager() : - m_focusWidgetDefault(nullptr), - m_focusWidgetCurrent(nullptr), m_havePeriodic(false), m_haveRedraw(true), m_applWakeUpTime(0), @@ -85,23 +83,24 @@ void ewol::widget::Manager::focusKeep(const std::shared_ptr& _newW } EWOL_VERBOSE("focusKeep=" << _newWidget->getId() ); //etk::log::displayBacktrace(); - if (_newWidget == m_focusWidgetCurrent) { + auto focusWidgetCurrent = m_focusWidgetCurrent.lock(); + if (_newWidget == focusWidgetCurrent) { // nothing to do ... return; } - if (m_focusWidgetCurrent != nullptr) { - EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() ); - m_focusWidgetCurrent->rmFocus(); - m_focusWidgetCurrent = nullptr; + if (focusWidgetCurrent != nullptr) { + EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() ); + focusWidgetCurrent->rmFocus(); + focusWidgetCurrent.reset(); } if (_newWidget->canHaveFocus() == false) { EWOL_DEBUG("Widget can not have focus, id=" << _newWidget->getId() ); return; } m_focusWidgetCurrent = _newWidget; - if (m_focusWidgetCurrent != nullptr) { - EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() ); - m_focusWidgetCurrent->setFocus(); + if (_newWidget != nullptr) { + EWOL_DEBUG("Set focus on WidgetID=" << _newWidget->getId() ); + _newWidget->setFocus(); } } @@ -111,47 +110,54 @@ void ewol::widget::Manager::focusSetDefault(const std::shared_ptr& EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() ); return; } - if (m_focusWidgetDefault == m_focusWidgetCurrent) { - if (m_focusWidgetCurrent != nullptr) { - EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() ); - m_focusWidgetCurrent->rmFocus(); + std::shared_ptr focusWidgetDefault = m_focusWidgetDefault.lock(); + std::shared_ptr focusWidgetCurrent = m_focusWidgetCurrent.lock(); + if (focusWidgetDefault == focusWidgetCurrent) { + if (focusWidgetCurrent != nullptr) { + EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() ); + focusWidgetCurrent->rmFocus(); } m_focusWidgetCurrent = _newWidget; - if (m_focusWidgetCurrent != nullptr) { - EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() ); - m_focusWidgetCurrent->setFocus(); + if (_newWidget != nullptr) { + EWOL_DEBUG("Set focus on WidgetID=" << _newWidget->getId() ); + _newWidget->setFocus(); } } m_focusWidgetDefault = _newWidget; } void ewol::widget::Manager::focusRelease() { - if (m_focusWidgetDefault == m_focusWidgetCurrent) { + std::shared_ptr focusWidgetDefault = m_focusWidgetDefault.lock(); + std::shared_ptr focusWidgetCurrent = m_focusWidgetCurrent.lock(); + if (focusWidgetDefault == focusWidgetCurrent) { // nothink to do ... return; } - if (m_focusWidgetCurrent != nullptr) { - EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() ); - m_focusWidgetCurrent->rmFocus(); + if (focusWidgetCurrent != nullptr) { + EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() ); + focusWidgetCurrent->rmFocus(); } m_focusWidgetCurrent = m_focusWidgetDefault; - if (nullptr != m_focusWidgetCurrent) { - EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() ); - m_focusWidgetCurrent->setFocus(); + focusWidgetCurrent = m_focusWidgetCurrent.lock(); + if (nullptr != focusWidgetCurrent) { + EWOL_DEBUG("Set focus on WidgetID=" << focusWidgetCurrent->getId() ); + focusWidgetCurrent->setFocus(); } } -const std::shared_ptr& ewol::widget::Manager::focusGet() { - return m_focusWidgetCurrent; +std::shared_ptr ewol::widget::Manager::focusGet() { + return m_focusWidgetCurrent.lock(); } void ewol::widget::Manager::focusRemoveIfRemove(const std::shared_ptr& _newWidget) { - if (m_focusWidgetCurrent == _newWidget) { + std::shared_ptr focusWidgetDefault = m_focusWidgetDefault.lock(); + std::shared_ptr focusWidgetCurrent = m_focusWidgetCurrent.lock(); + if (focusWidgetCurrent == _newWidget) { EWOL_WARNING("Release focus when remove widget"); focusRelease(); } - if (m_focusWidgetDefault == _newWidget) { + if (focusWidgetDefault == _newWidget) { EWOL_WARNING("Release default focus when remove widget"); focusSetDefault(nullptr); } @@ -163,14 +169,13 @@ void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr& } m_havePeriodic = true; for (auto &it : m_listOfPeriodicWidget) { - if (it == _pWidget) { + if (it.lock() == _pWidget) { return; } } for (auto &it : m_listOfPeriodicWidget) { - if (it == nullptr) { + if (it.expired() == true) { it = _pWidget; - return; } } @@ -179,16 +184,17 @@ void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr& void ewol::widget::Manager::periodicCallRm(const std::shared_ptr& _pWidget) { for (auto &it : m_listOfPeriodicWidget) { - if (it == _pWidget) { + if (it.lock() == _pWidget) { it.reset(); } } periodicCallUpdateCount(); } + void ewol::widget::Manager::periodicCallUpdateCount() { int32_t nbElement = 0; for (auto &it : m_listOfPeriodicWidget) { - if (it != nullptr) { + if (it.expired() == false) { nbElement++; } } @@ -216,15 +222,16 @@ void ewol::widget::Manager::periodicCall(int64_t _localTime) { EWOL_VERBOSE("periodic : " << _localTime); for (int32_t iii=m_listOfPeriodicWidget.size()-1; iii >= 0 ; iii--) { - if (nullptr != m_listOfPeriodicWidget[iii]) { - int64_t deltaTimeCallUser = m_listOfPeriodicWidget[iii]->systemGetCallDeltaTime(); + auto tmpWidget = m_listOfPeriodicWidget[iii].lock(); + if (nullptr != tmpWidget) { + int64_t deltaTimeCallUser = tmpWidget->systemGetCallDeltaTime(); if (deltaTimeCallUser <= 0) { myTime.setDeltaCall(deltaTime); EWOL_VERBOSE("[" << iii << "] periodic : " << myTime); - m_listOfPeriodicWidget[iii]->systemSetLastCallTime(_localTime); - m_listOfPeriodicWidget[iii]->periodicCall(myTime); + tmpWidget->systemSetLastCallTime(_localTime); + tmpWidget->periodicCall(myTime); } else { - int64_t lastCallTime = m_listOfPeriodicWidget[iii]->systemGetLastCallTime(); + int64_t lastCallTime = tmpWidget->systemGetLastCallTime(); if (lastCallTime == 0) { lastCallTime = _localTime; } @@ -232,8 +239,8 @@ void ewol::widget::Manager::periodicCall(int64_t _localTime) { if (deltaLocalTime >= lastCallTime) { myTime.setDeltaCall(deltaLocalTime); EWOL_VERBOSE("[" << iii << "] periodic : " << myTime); - m_listOfPeriodicWidget[iii]->systemSetLastCallTime(_localTime); - m_listOfPeriodicWidget[iii]->periodicCall(myTime); + tmpWidget->systemSetLastCallTime(_localTime); + tmpWidget->periodicCall(myTime); } } } @@ -297,20 +304,3 @@ std::string ewol::widget::Manager::list() { return tmpVal; } -void ewol::widget::Manager::onObjectRemove(const std::shared_ptr& _object) { - if (m_focusWidgetDefault == _object) { - EWOL_VERBOSE("Remove object ==> rm default focus !!!"); - m_focusWidgetDefault.reset(); - } - if (m_focusWidgetCurrent == _object) { - EWOL_VERBOSE("Remove object ==> rm current focus !!!"); - m_focusWidgetCurrent.reset(); - } - for (auto &it : m_listOfPeriodicWidget) { - if (it == _object) { - EWOL_VERBOSE("Remove object ==> rm periodic call !!!"); - it.reset(); - } - } - periodicCallUpdateCount(); -} diff --git a/sources/ewol/widget/Manager.h b/sources/ewol/widget/Manager.h index 5cb993af..28209d3d 100644 --- a/sources/ewol/widget/Manager.h +++ b/sources/ewol/widget/Manager.h @@ -23,9 +23,9 @@ namespace ewol { typedef std::shared_ptr (*creator_tf)(); private: // For the focus Management - std::shared_ptr m_focusWidgetDefault; - std::shared_ptr m_focusWidgetCurrent; - std::vector> m_listOfPeriodicWidget; + std::weak_ptr m_focusWidgetDefault; + std::weak_ptr m_focusWidgetCurrent; + std::vector> m_listOfPeriodicWidget; bool m_havePeriodic; bool m_haveRedraw; etk::Hash m_creatorList; @@ -38,7 +38,7 @@ namespace ewol { void focusKeep(const std::shared_ptr& _newWidget); // set the focus at the specific widget void focusSetDefault(const std::shared_ptr& _newWidget); // select the default focus getter void focusRelease(); // release focus from the current widget to the default - const std::shared_ptr& focusGet(); + std::shared_ptr focusGet(); void focusRemoveIfRemove(const std::shared_ptr& _newWidget); void periodicCallAdd(const std::shared_ptr& _pWidget); @@ -55,7 +55,6 @@ namespace ewol { std::shared_ptr create(const std::string& _name); bool exist(const std::string& _name); std::string list(); - virtual void onObjectRemove(const std::shared_ptr& _object); private: void periodicCallUpdateCount(); }; diff --git a/sources/ewol/widget/Windows.cpp b/sources/ewol/widget/Windows.cpp index e4339044..0ada939d 100644 --- a/sources/ewol/widget/Windows.cpp +++ b/sources/ewol/widget/Windows.cpp @@ -196,7 +196,6 @@ void ewol::widget::Windows::popUpWidgetPop() { if (m_popUpWidgetList.size() == 0) { return; } - m_popUpWidgetList.back()->removeParent(); m_popUpWidgetList.pop_back(); } @@ -271,6 +270,7 @@ void ewol::widget::Windows::requestDestroyFromChild(const std::shared_ptrremoveParent(); m_subWidget.reset(); + markToRedraw(); } }