From a1d0185f1988ca9fac44781c7a1cc6c20f3b9c60 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 25 May 2014 16:15:26 +0200 Subject: [PATCH] [DEV] shared system work corectly with simple example --- sources/ewol/context/Context.cpp | 21 +++- sources/ewol/context/Context.h | 26 ++--- sources/ewol/context/InputManager.cpp | 14 ++- sources/ewol/context/InputManager.h | 13 +-- sources/ewol/object/Manager.cpp | 49 +++++--- sources/ewol/object/Manager.h | 5 +- sources/ewol/object/Object.cpp | 26 ++++- sources/ewol/object/Object.h | 2 +- sources/ewol/object/Owner.h | 107 +++++++++++++---- sources/ewol/object/RemoveEvent.cpp | 8 +- sources/ewol/object/Shared.h | 56 ++------- sources/ewol/resource/Manager.cpp | 162 +++++++++----------------- sources/ewol/resource/Manager.h | 9 +- sources/ewol/resource/Resource.cpp | 8 +- sources/ewol/resource/Resource.h | 15 --- sources/ewol/widget/Container.cpp | 6 +- sources/ewol/widget/Container2.cpp | 9 +- sources/ewol/widget/ContainerN.cpp | 20 ++-- sources/ewol/widget/Manager.cpp | 68 +++++++---- sources/ewol/widget/Manager.h | 18 +-- sources/ewol/widget/Sizer.cpp | 6 +- sources/ewol/widget/WSlider.cpp | 6 +- sources/ewol/widget/Widget.cpp | 4 +- sources/ewol/widget/Widget.h | 2 +- sources/ewol/widget/Windows.cpp | 56 +++++---- sources/ewol/widget/Windows.h | 3 +- 26 files changed, 380 insertions(+), 339 deletions(-) diff --git a/sources/ewol/context/Context.cpp b/sources/ewol/context/Context.cpp index 8f66e840..f84cf5cf 100644 --- a/sources/ewol/context/Context.cpp +++ b/sources/ewol/context/Context.cpp @@ -288,6 +288,7 @@ void ewol::Context::setArchiveDir(int _mode, const char* _str) { ewol::Context::Context(int32_t _argc, const char* _argv[]) : + m_objectManager(*this), m_previousDisplayTime(0), m_input(*this), #if (defined(__TARGET_OS__Android) || defined(__TARGET_OS__IOs)) @@ -382,6 +383,11 @@ ewol::Context::~Context() { lockContext(); // 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.displayListObject(); // call application to uninit APP_UnInit(*this); // unset all windows @@ -643,14 +649,23 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) { m_FpsFlush.draw(); } // while The Gui is drawing in OpenGl, we do some not realTime things - m_objectManager.removeAllRemovedObject(); + m_resourceManager.updateContext(); + do { + m_objectManager.removeAllRemovedObject(); + } while (m_resourceManager.checkResourceToRemove() == true); return hasDisplayDone; } -void ewol::Context::onObjectRemove(const ewol::object::Shared& _removeObject) { +void ewol::Context::onObjectRemove(const ewol::object::Shared& _object) { //EWOL_CRITICAL("element removed"); - m_input.onObjectRemove(_removeObject); + if (m_windowsCurrent == _object) { + m_windowsCurrent.reset(); // This might never arrived, the owner is the current element (expected when the widget auto remove itself) + } + // inform all manager that can not be directly linked with the object manager + m_input.onObjectRemove(_object); + m_widgetManager.onObjectRemove(_object); + m_resourceManager.checkResourceToRemove(); } void ewol::Context::resetIOEvent() { diff --git a/sources/ewol/context/Context.h b/sources/ewol/context/Context.h index 53da0740..d23908e5 100644 --- a/sources/ewol/context/Context.h +++ b/sources/ewol/context/Context.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace ewol { /** @@ -37,7 +38,7 @@ namespace ewol { screenPortrait }; - class Context { + class Context/* : private ewol::object::RemoveEvent */{ private: ewol::context::CommandLine m_commandLine; //!< Start command line information public: @@ -50,18 +51,18 @@ namespace ewol { ewol::context::ConfigFont& getFontDefault() { return m_configFont; }; - private: - ewol::widget::Manager m_widgetManager; //!< global widget manager - public: - ewol::widget::Manager& getWidgetManager() { - return m_widgetManager; - }; private: ewol::object::Manager m_objectManager; //!< Object Manager main instance public: ewol::object::Manager& getEObjectManager() { return m_objectManager; }; + private: + ewol::widget::Manager m_widgetManager; //!< global widget manager + public: + ewol::widget::Manager& getWidgetManager() { + return m_widgetManager; + }; private: ewol::resource::Manager m_resourceManager; //!< global resources Manager public: @@ -121,7 +122,7 @@ namespace ewol { * @brief The current context is resumed */ virtual void OS_Resume(); - + /** * @brief The current context is set in foreground (framerate is maximum speed) */ @@ -135,12 +136,9 @@ namespace ewol { // return true if a flush is needed bool OS_Draw(bool _displayEveryTime); - /** - * @brief Inform object that an other object is removed ... - * @param[in] removeObject Pointer on the EObject removed == > the user must remove all reference on this EObject - * @note : Sub classes must call this class - */ - void onObjectRemove(const ewol::object::Shared& _removeObject); + + virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + public: /** * @brief reset event management for the IO like Input ou Mouse or keyborad */ diff --git a/sources/ewol/context/InputManager.cpp b/sources/ewol/context/InputManager.cpp index 8a59376b..4269a8ee 100644 --- a/sources/ewol/context/InputManager.cpp +++ b/sources/ewol/context/InputManager.cpp @@ -83,7 +83,7 @@ void ewol::context::InputManager::cleanElement(InputPoperty *_eventTable, _eventTable[_idInput].isUsed = false; _eventTable[_idInput].destinationInputId = 0; _eventTable[_idInput].lastTimeEvent = 0; - _eventTable[_idInput].curentWidgetEvent = nullptr; + _eventTable[_idInput].curentWidgetEvent.reset(); _eventTable[_idInput].origin.setValue(0,0); _eventTable[_idInput].size.setValue(99999999,99999999); _eventTable[_idInput].downStart.setValue(0,0); @@ -138,17 +138,23 @@ void ewol::context::InputManager::unGrabPointer() { m_context.grabPointerEvents(false, vec2(0,0)); } -void ewol::context::InputManager::onObjectRemove(const ewol::object::Shared& removeObject) { +void ewol::context::InputManager::onObjectRemove(const ewol::object::Shared& _object) { for(int32_t iii=0; iii rm Input Event !!!"); cleanElement(m_eventInputSaved, iii); } - if (m_eventMouseSaved[iii].curentWidgetEvent == removeObject) { + if (m_eventMouseSaved[iii].curentWidgetEvent == _object) { // remove the property of this input ... + EWOL_VERBOSE("Remove object ==> rm Mouse Event !!!"); cleanElement(m_eventMouseSaved, iii); } } + if (m_grabWidget == _object) { + EWOL_VERBOSE("Remove object ==> rm Grab widget !!!"); + m_grabWidget.reset(); + } } void ewol::context::InputManager::newLayerSet() { diff --git a/sources/ewol/context/InputManager.h b/sources/ewol/context/InputManager.h index f0905e8c..d929fa18 100644 --- a/sources/ewol/context/InputManager.h +++ b/sources/ewol/context/InputManager.h @@ -10,6 +10,7 @@ #define __EWOL_SYSTEM_INPUT_H__ #include +#include #define MAX_MANAGE_INPUT (15) @@ -24,7 +25,7 @@ namespace ewol { bool isUsed; int32_t destinationInputId; int64_t lastTimeEvent; - ewol::object::Shared curentWidgetEvent; + ewol::object::Shared curentWidgetEvent; vec2 origin; vec2 size; vec2 downStart; @@ -44,7 +45,7 @@ namespace ewol { int32_t DpiOffset; }; class Context; - class InputManager { + class InputManager{ // special grab pointer mode : private: ewol::object::Shared m_grabWidget; //!< widget that grab the curent pointer. @@ -94,12 +95,8 @@ namespace ewol { void motion(enum ewol::key::type _type, int _pointerID, vec2 _pos ); void state(enum ewol::key::type _type, int _pointerID, bool _isDown, vec2 _pos); - /** - * @brief Inform object that an other object is removed ... - * @param[in] removeObject Pointer on the Object remeved == > the user must remove all reference on this Object - * @note : Sub classes must call this class - */ - void onObjectRemove(const ewol::object::Shared& _removeObject); + void onObjectRemove(const ewol::object::Shared& _object); + public: /** * @brief a new layer on the windows is set == > might remove all the property of the current element ... */ diff --git a/sources/ewol/object/Manager.cpp b/sources/ewol/object/Manager.cpp index 3a839be0..670a2aa8 100644 --- a/sources/ewol/object/Manager.cpp +++ b/sources/ewol/object/Manager.cpp @@ -14,7 +14,8 @@ #undef __class__ #define __class__ "ewol::object::Manager" -ewol::object::Manager::Manager() { +ewol::object::Manager::Manager(ewol::Context& _context) : + m_context(_context) { EWOL_DEBUG(" == > init Object-Manager"); } @@ -31,6 +32,13 @@ ewol::object::Manager::~Manager() { if (true == hasError) { EWOL_ERROR("Check if the function UnInit has been called !!!"); } + displayListObject(); +} + +void ewol::object::Manager::displayListObject() { + for (auto &it : m_eObjectList) { + EWOL_ERROR("List object : " << it->getName() << " : " << it->getTypeDescription() << " nb ref=" << it->getRefCount()); + } } void ewol::object::Manager::unInit() { @@ -67,14 +75,17 @@ 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()); it->onObjectRemove(_object); } } + // inform context that n object is removed ... + m_context.onObjectRemove(_object); + EWOL_VERBOSE("m_removeEventList.size() = " << m_removeEventList.size()); for (auto &it : m_removeEventList) { + EWOL_VERBOSE("[" << _object->getId() << "] Inform Event Remove Object List : ..."); it->onObjectRemove(_object); } - // inform the context ... - ewol::getContext().onObjectRemove(_object); } void ewol::object::Manager::respown(const ewol::object::Shared& _object){ @@ -99,13 +110,11 @@ void ewol::object::Manager::remove(const ewol::object::Shared& _ob for (int64_t iii = (int64_t)m_eObjectListActive.size()-1; iii>=0; --iii) { if (m_eObjectListActive[iii] == _object) { // remove Element - m_eObjectListActive.erase(m_eObjectListActive.begin()+iii); EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "'"); - if (_object->getStatusResource() == false) { - informOneObjectIsRemoved(_object); - } + informOneObjectIsRemoved(_object); ewol::getContext().forceRedrawAll(); - EWOL_DEBUG("Auto-Remove Object ... done"); + EWOL_DEBUG("Auto-Remove Object ... done (have " << _object->getRefCount() << " references)"); + m_eObjectListActive.erase(m_eObjectListActive.begin()+iii); return; } } @@ -114,16 +123,22 @@ void ewol::object::Manager::remove(const ewol::object::Shared& _ob // clean all Object that request an autoRemove ... void ewol::object::Manager::removeAllRemovedObject() { - //EWOL_DEBUG("Auto-Remove Object section : " << m_eObjectAutoRemoveList.size() << " elemeents"); - for (int64_t iii = (int64_t)m_eObjectList.size()-1; iii>=0; --iii) { - if (m_eObjectList[iii] == nullptr) { - continue; + 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; } - 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); } } diff --git a/sources/ewol/object/Manager.h b/sources/ewol/object/Manager.h index 867eccef..2f3d7a0e 100644 --- a/sources/ewol/object/Manager.h +++ b/sources/ewol/object/Manager.h @@ -15,14 +15,16 @@ #include namespace ewol { + class Context; namespace object { class Manager { private: std::vector m_removeEventList; std::vector> m_eObjectList; // all widget allocated == > all time increment ... never removed ... std::vector> m_eObjectListActive; // all active widget + Context& m_context; public: - Manager(); + Manager(Context& _context); ~Manager(); /** * @brief remove all resources (un-init) out of the destructor (due to the system implementation) @@ -33,6 +35,7 @@ namespace ewol { * @return number of Object */ int32_t getNumberObject(); + void displayListObject(); private: friend class ewol::Object; /** diff --git a/sources/ewol/object/Object.cpp b/sources/ewol/object/Object.cpp index c03e74e2..b97417a0 100644 --- a/sources/ewol/object/Object.cpp +++ b/sources/ewol/object/Object.cpp @@ -22,23 +22,35 @@ size_t ewol::Object::m_valUID = 0; void ewol::Object::objRefCountIncrement() { std::unique_lock lock(m_lockRefCount); + /* + if (std::string("ewol::widget::Windows") == getObjectType()) { + EWOL_ERROR("increment Windows count ++" << m_objRefCount); + //etk::log::displayBacktrace(); + } + */ m_objRefCount++; } void ewol::Object::objRefCountDecrement() { std::unique_lock lock(m_lockRefCount); + /* + if (std::string("ewol::widget::Windows") == getObjectType()) { + EWOL_ERROR("Decrement Windows count --" << m_objRefCount); + //etk::log::displayBacktrace(); + } + */ m_objRefCount--; } void ewol::Object::operator delete(void* _ptr, std::size_t _sz) { - EWOL_DEBUG("custom delete for size " << _sz); - ewol::object::Shared obj = (ewol::Object*)_ptr; + EWOL_VERBOSE("custom delete for size " << _sz); + ewol::Object* obj = (ewol::Object*)_ptr; obj->objRefCountDecrement(); if (obj->m_objRefCount <= 0) { - EWOL_DEBUG(" ==> real remove"); + EWOL_VERBOSE(" ==> real remove"); ::operator delete(_ptr); } else { - EWOL_DEBUG(" ==> Some user is link on it : " << obj->m_objRefCount); + EWOL_ERROR(" ==> Some user is link on it : " << obj->m_objRefCount); etk::log::displayBacktrace(); } } @@ -49,7 +61,7 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) { } void ewol::Object::autoDestroy() { - EWOL_VERBOSE("Destroy object : [" << m_valUID << "] type:" << getTypeDescription()); + EWOL_VERBOSE("Destroy object : [" << getId() << "] type:" << getTypeDescription()); { std::unique_lock lock(m_lockRefCount); if (m_isDestroyed == true) { @@ -100,7 +112,7 @@ ewol::Object::Object(const std::string& _name) : } ewol::Object::~Object() { - EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription()); + EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription() << " refcount=" << m_objRefCount); getMultiCast().rm(this); for (size_t iii=0; iii& _ } void ewol::Object::onObjectRemove(const ewol::object::Shared& _object) { + EWOL_VERBOSE("[" << getId() << "] onObjectRemove(" << _object->getId() << ")"); for(int32_t iii=m_externEvent.size()-1; iii >= 0; iii--) { if (m_externEvent[iii] != nullptr) { m_externEvent.erase(m_externEvent.begin()+iii); + EWOL_VERBOSE("[" << getId() << "] Remove extern event : to object id=" << _object->getId()); } } } diff --git a/sources/ewol/object/Object.h b/sources/ewol/object/Object.h index bf46377f..45e85112 100644 --- a/sources/ewol/object/Object.h +++ b/sources/ewol/object/Object.h @@ -14,8 +14,8 @@ #include #include #include -#include #include +#include namespace ewol { // some class need to define element befor other ... diff --git a/sources/ewol/object/Owner.h b/sources/ewol/object/Owner.h index 51f898e1..05e102b3 100644 --- a/sources/ewol/object/Owner.h +++ b/sources/ewol/object/Owner.h @@ -44,7 +44,20 @@ namespace ewol { m_pointer = _obj.m_pointer; _obj.m_pointer = nullptr; } - Owner& operator=(const Owner& _obj) noexcept { + // shared to private constructor + template::value>::type> + Owner(const Shared& _obj) : + m_pointer(nullptr) { + m_pointer = _obj.get(); + if (m_pointer == nullptr) { + return; + } + m_pointer->objRefCountIncrement(); + } + template::value>::type> + Owner& operator=(const Owner& _obj) noexcept { if(this == &_obj) { return *this; } @@ -55,35 +68,50 @@ namespace ewol { } return *this; } + template::value>::type> + Owner& operator=(const Shared& _obj) noexcept { + reset(); + m_pointer = _obj.get(); + if (m_pointer != nullptr) { + m_pointer->objRefCountIncrement(); + } + return *this; + } void reset() { if (m_pointer == nullptr) { return; } - m_pointer->removeObject(); - if (m_pointer->m_objRefCount <= 0) { - EWOL_ERROR("Object will be already removed"); - } else if (m_pointer->m_objRefCount == 1) { - EWOL_ERROR("Remove object (in Owner)"); - delete m_pointer; - } else { - m_pointer->objRefCountDecrement(); - } + //etk::log::displayBacktrace(); + // To prevent cyclisme + T* tmp = m_pointer; m_pointer = nullptr; + tmp->removeObject(); + if (tmp->m_objRefCount <= 0) { + EWOL_WARNING("Object will be already removed"); + } else if (tmp->m_objRefCount == 1) { + EWOL_VERBOSE("Remove object (in Owner)"); + delete tmp; + } else { + tmp->objRefCountDecrement(); + } } void resetShared() { if (m_pointer == nullptr) { return; } - if (m_pointer->m_objRefCount <= 0) { - EWOL_ERROR("Object will be already removed"); - } else if (m_pointer->m_objRefCount == 1) { - EWOL_ERROR("Remove object (in Owner)"); - delete m_pointer; - } else { - m_pointer->objRefCountDecrement(); - } + // To prevent cyclisme + T* tmp = m_pointer; m_pointer = nullptr; + if (tmp->m_objRefCount <= 0) { + EWOL_WARNING("Object will be already removed"); + } else if (tmp->m_objRefCount == 1) { + EWOL_VERBOSE("Remove object (in Owner)"); + delete tmp; + } else { + tmp->objRefCountDecrement(); + } } T* get() noexcept { return m_pointer; @@ -97,6 +125,9 @@ namespace ewol { T* operator->() const noexcept { return m_pointer; } + operator ewol::object::Shared() const noexcept { + return m_pointer; + } }; }; // section to compare Owner pointer of an object with an other @@ -128,6 +159,28 @@ namespace ewol { inline bool operator==(const T* _obj, const object::Owner& _obj2) noexcept { return _obj == _obj2.get(); } + //! @not in doc + template + inline bool operator==(const object::Owner& _obj, const object::Shared& _obj2) noexcept { + return _obj.get() == _obj2.get(); + } + //! @not in doc + template + inline bool operator==(const object::Shared& _obj, const object::Owner& _obj2) noexcept { + return _obj.get() == _obj2.get(); + } + //! @not in doc + template::value>::type> + inline bool operator!=(const object::Owner& _obj, const T2* _obj2) noexcept { + return _obj.get() != _obj2; + } + //! @not in doc + template::value>::type> + inline bool operator!=(const T* _obj, const object::Owner& _obj2) noexcept { + return _obj != _obj2.get(); + } //! @not in doc template @@ -145,17 +198,23 @@ namespace ewol { return _obj.get() != nullptr; } //! @not in doc - template::value>::type> - inline bool operator!=(const object::Owner& _obj, const T2* _obj2) noexcept { - return _obj.get() != _obj2; + template + inline bool operator!=(const object::Owner& _obj, const object::Shared& _obj2) noexcept { + return _obj.get() != _obj2.get(); } //! @not in doc + template + inline bool operator!=(const object::Shared& _obj, const object::Owner& _obj2) noexcept { + return _obj.get() != _obj2.get(); + } + /* template::value>::type> - inline bool operator!=(const T* _obj, const object::Owner& _obj2) noexcept { - return _obj != _obj2.get(); + object::Shared operator=(const object::Owner& _obj) { + return _obj.get(); } + */ + //! @not in doc template diff --git a/sources/ewol/object/RemoveEvent.cpp b/sources/ewol/object/RemoveEvent.cpp index 464a2230..70e5199a 100644 --- a/sources/ewol/object/RemoveEvent.cpp +++ b/sources/ewol/object/RemoveEvent.cpp @@ -7,11 +7,17 @@ */ #include +#include ewol::object::RemoveEvent::RemoveEvent() { + Context& tmp = ewol::getContext(); + ewol::object::Manager& manager = tmp.getEObjectManager(); + manager.add(this); } ewol::object::RemoveEvent::~RemoveEvent() { - + Context& tmp = ewol::getContext(); + ewol::object::Manager& manager = tmp.getEObjectManager(); + manager.rm(this); } diff --git a/sources/ewol/object/Shared.h b/sources/ewol/object/Shared.h index e1c22887..1a6b8ce2 100644 --- a/sources/ewol/object/Shared.h +++ b/sources/ewol/object/Shared.h @@ -32,15 +32,6 @@ namespace ewol { ~Shared() { reset(); } - // shared to private constructor - Shared(const Owner& _obj) : - m_pointer(nullptr) { - m_pointer = _obj.get(); - if (m_pointer == nullptr) { - return; - } - m_pointer->objRefCountIncrement(); - } // copy constructor Shared(const Shared& _obj) : m_pointer(nullptr) { @@ -57,12 +48,6 @@ namespace ewol { m_pointer = _obj.m_pointer; _obj.m_pointer = nullptr; } - bool hasOwner() { - if (m_pointer == nullptr) { - return false; - } - return m_pointer->getRefOwner(); - } Shared& operator=(const Shared& _obj) noexcept { if(this == &_obj) { @@ -80,15 +65,17 @@ namespace ewol { if (m_pointer == nullptr) { return; } - if (m_pointer->m_objRefCount <= 0) { - EWOL_ERROR("Object is already removed"); - } else if (m_pointer->m_objRefCount == 1) { - EWOL_ERROR("Remove object (in shared)"); - delete m_pointer; - } else { - m_pointer->objRefCountDecrement(); - } + // To prevent cyclisme + T* tmp = m_pointer; m_pointer = nullptr; + if (tmp->m_objRefCount <= 0) { + EWOL_WARNING("Object is already removed"); + } else if (tmp->m_objRefCount == 1) { + EWOL_VERBOSE("Remove object (in shared)"); + delete tmp; + } else { + tmp->objRefCountDecrement(); + } } T* get() const noexcept { return m_pointer; @@ -99,9 +86,6 @@ namespace ewol { T* operator->() const noexcept { return m_pointer; } - operator ewol::object::Owner() const noexcept { - return m_pointer; - } template operator ewol::object::Shared() const noexcept { return m_pointer; } @@ -146,16 +130,6 @@ namespace ewol { inline bool operator==(const T* _obj, const object::Shared& _obj2) noexcept { return _obj == _obj2.get(); } - //! @not in doc - template - inline bool operator==(const object::Owner& _obj, const object::Shared& _obj2) noexcept { - return _obj.get() == _obj2.get(); - } - //! @not in doc - template - inline bool operator==(const object::Shared& _obj, const object::Owner& _obj2) noexcept { - return _obj.get() == _obj2.get(); - } //! @not in doc template @@ -184,16 +158,6 @@ namespace ewol { inline bool operator!=(const T* _obj, const object::Shared& _obj2) noexcept { return _obj != _obj2.get(); } - //! @not in doc - template - inline bool operator!=(const object::Owner& _obj, const object::Shared& _obj2) noexcept { - return _obj.get() != _obj2.get(); - } - //! @not in doc - template - inline bool operator!=(const object::Shared& _obj, const object::Owner& _obj2) noexcept { - return _obj.get() != _obj2.get(); - } //! @not in doc template diff --git a/sources/ewol/resource/Manager.cpp b/sources/ewol/resource/Manager.cpp index 18dfd9b9..a2539c88 100644 --- a/sources/ewol/resource/Manager.cpp +++ b/sources/ewol/resource/Manager.cpp @@ -40,12 +40,12 @@ void ewol::resource::Manager::unInit() { display(); m_resourceListToUpdate.clear(); // remove all resources ... - for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) { - if (m_resourceList[iii] != nullptr) { - EWOL_WARNING("Find a resource that is not removed : [" << m_resourceList[iii]->getId() << "]" - << "=\"" << m_resourceList[iii]->getName() << "\" " - << m_resourceList[iii]->getCounter() << " elements"); - m_resourceList[iii].reset(); + 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(); } } m_resourceList.clear(); @@ -54,12 +54,12 @@ void ewol::resource::Manager::unInit() { void ewol::resource::Manager::display() { EWOL_INFO("Resources loaded : "); // remove all resources ... - for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) { - if (m_resourceList[iii] != nullptr) { - EWOL_INFO(" [" << m_resourceList[iii]->getId() << "]" - << m_resourceList[iii]->getObjectType() - << "=\"" << m_resourceList[iii]->getName() << "\" " - << m_resourceList[iii]->getCounter() << " elements"); + for (auto &it : m_resourceList) { + if (it != nullptr) { + EWOL_INFO(" [" << it->getId() << "]" + << it->getObjectType() + << "=\"" << it->getName() << "\" " + << it->getRefCount() << " elements"); } } EWOL_INFO("Resources ---"); @@ -71,11 +71,11 @@ void ewol::resource::Manager::reLoadResources() { if (m_resourceList.size() != 0) { for (size_t jjj=0; jjj= 0; iii--) { - if(m_resourceList[iii] != nullptr) { - if (jjj == m_resourceList[iii]->getResourceLevel()) { - m_resourceList[iii]->reload(); - EWOL_INFO(" [" << m_resourceList[iii]->getId() << "]="<< m_resourceList[iii]->getObjectType()); + for (auto &it : m_resourceList) { + if(it != nullptr) { + if (jjj == it->getResourceLevel()) { + it->reload(); + EWOL_INFO(" [" << it->getId() << "]="<< it->getObjectType()); } } } @@ -88,12 +88,11 @@ void ewol::resource::Manager::reLoadResources() { void ewol::resource::Manager::update(const ewol::object::Shared& _object) { // chek if not added before - for (size_t iii=0; iii& // Specific to load or update the data in the openGl context == > system use only void ewol::resource::Manager::updateContext() { - if (true == m_contextHasBeenRemoved) { + if (m_contextHasBeenRemoved == true) { // need to update all ... m_contextHasBeenRemoved = false; if (m_resourceList.size() != 0) { for (size_t jjj=0; jjjgetResourceLevel()) { - //EWOL_DEBUG("Update context of " << iii << " named : " << l_resourceList[iii]->getName()); - m_resourceList[iii]->updateContext(); - } + for (auto &it : m_resourceList) { + if( it != nullptr + && jjj == it->getResourceLevel()) { + //EWOL_DEBUG("Update context named : " << l_resourceList[iii]->getName()); + it->updateContext(); } } } } - }else { + } else { if (m_resourceListToUpdate.size() != 0) { for (size_t jjj=0; jjjgetResourceLevel()) { - m_resourceListToUpdate[iii]->updateContext(); - } + for (auto &it : m_resourceListToUpdate) { + if ( it != nullptr + && jjj == it->getResourceLevel()) { + it->updateContext(); } } } @@ -138,9 +135,9 @@ void ewol::resource::Manager::updateContext() { // in this case, it is really too late ... void ewol::resource::Manager::contextHasBeenDestroyed() { - for (size_t iii=0; iiiremoveContextToLate(); + for (auto &it : m_resourceList) { + if (it != nullptr) { + it->removeContextToLate(); } } // no context preent ... @@ -150,12 +147,10 @@ void ewol::resource::Manager::contextHasBeenDestroyed() { // internal generic keeper ... ewol::object::Shared ewol::resource::Manager::localKeep(const std::string& _filename) { EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\""); - for (size_t iii=0; iiigetName() == _filename) { - m_resourceList[iii]->increment(); - return m_resourceList[iii]; - } + for (auto &it : m_resourceList) { + if ( it != nullptr + && it->getName() == _filename) { + return it; } } // we did not find it ... @@ -165,76 +160,33 @@ ewol::object::Shared ewol::resource::Manager::localKeep(const st // internal generic keeper ... void ewol::resource::Manager::localAdd(const ewol::object::Shared& _object) { //Add ... find empty slot - for (size_t iii=0; iii _object) { - if (nullptr == _object) { - EWOL_ERROR("Try to remove a resource that have null pointer ..."); - return false; - } - for (size_t iii=0; iiigetName() << "\""); - for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) { - if (m_resourceList[iii] == nullptr) { + +// in case of error ... +bool ewol::resource::Manager::checkResourceToRemove() { + //EWOL_INFO("remove object in Manager"); + m_resourceListToUpdate.clear(); + for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) { + if ((*it) == nullptr) { + m_resourceList.erase(it); + it = m_resourceList.begin(); continue; } - if(m_resourceList[iii] != _object) { + // 1 in object list, 1 in reference active list, and one here + if ((*it)->getRefCount() > 3) { continue; } - if (m_resourceList[iii]->decrement() == true) { - // remove element from the list : - m_resourceList[iii] = nullptr; - // delete element - _object->removeObject(); - // insidiously remove the pointer for the caller ... - _object = nullptr; - return true; // object really removed - } - // insidiously remove the pointer for the caller ... - _object = nullptr; - return false; // just decrement ... + m_resourceList.erase(it); + it = m_resourceList.begin(); + return true; } - EWOL_ERROR("Can not find the resources in the list : " << (int64_t)_object); - // insidiously remove the pointer for the caller ... - _object = nullptr; return false; } -*/ -// in case of error ... -void ewol::resource::Manager::onObjectRemove(const ewol::object::Shared& _removeObject) { - EWOL_INFO("remove object in Manager"); - for (int64_t iii = (int64_t)m_resourceListToUpdate.size()-1; iii>=0; --iii) { - if (m_resourceListToUpdate[iii] == nullptr) { - continue; - } - if (m_resourceListToUpdate[iii]->getRefCount() >= 3) { - continue; - } - m_resourceListToUpdate.erase(m_resourceListToUpdate.begin() + iii); - break; - } - for (int64_t iii = (int64_t)m_resourceList.size()-1; iii>=0; --iii) { - if (m_resourceList[iii] == nullptr) { - continue; - } - if (m_resourceList[iii]->getRefCount() >= 2) { - continue; - } - m_resourceList.erase(m_resourceList.begin() + iii); - break; - } - -} diff --git a/sources/ewol/resource/Manager.h b/sources/ewol/resource/Manager.h index 12ff4259..0a0321da 100644 --- a/sources/ewol/resource/Manager.h +++ b/sources/ewol/resource/Manager.h @@ -9,6 +9,8 @@ #ifndef __RESOURCES_MANAGER_H__ #define __RESOURCES_MANAGER_H__ +#include +#include #include #include #include @@ -16,9 +18,9 @@ namespace ewol { namespace resource { - class Manager : private ewol::object::RemoveEvent { + class Manager{ private: - std::vector> m_resourceList; + std::list> m_resourceList; std::vector> m_resourceListToUpdate; bool m_contextHasBeenRemoved; public: @@ -61,8 +63,7 @@ namespace ewol { // internal API to extent eResources in extern Soft ewol::object::Shared localKeep(const std::string& _filename); void localAdd(const ewol::object::Shared& _object); - public: // herited function - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual bool checkResourceToRemove(); }; }; }; diff --git a/sources/ewol/resource/Resource.cpp b/sources/ewol/resource/Resource.cpp index 91a0085e..9395f398 100644 --- a/sources/ewol/resource/Resource.cpp +++ b/sources/ewol/resource/Resource.cpp @@ -15,19 +15,19 @@ void ewol::Resource::updateContext() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << m_counter << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); } void ewol::Resource::removeContext() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << m_counter << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); } void ewol::Resource::removeContextToLate() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << m_counter << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); } void ewol::Resource::reload() { - EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << m_counter << " time(s)"); + EWOL_DEBUG("Not set for : [" << getId() << "]" << getName() << " loaded " << getRefCount() << " time(s)"); } ewol::resource::Manager& ewol::Resource::getManager() { diff --git a/sources/ewol/resource/Resource.h b/sources/ewol/resource/Resource.h index eff982c7..79789cb9 100644 --- a/sources/ewol/resource/Resource.h +++ b/sources/ewol/resource/Resource.h @@ -25,14 +25,12 @@ namespace ewol { class Resource : public ewol::Object { public: Resource() : - m_counter(1), m_resourceLevel(MAX_RESOURCE_LEVEL-1) { addObjectType("ewol::Resource"); setStatusResource(true); }; Resource(const std::string& _name) : ewol::Object(_name), - m_counter(1), m_resourceLevel(MAX_RESOURCE_LEVEL-1) { addObjectType("ewol::Resource"); setStatusResource(true); @@ -40,19 +38,6 @@ namespace ewol { virtual ~Resource() { }; - private: - uint32_t m_counter; //!< number of time the element was loaded. - public: - void increment() { - m_counter++; - }; - bool decrement() { - m_counter--; - return (m_counter == 0)?true:false; - }; - int32_t getCounter() { - return m_counter; - }; protected: uint8_t m_resourceLevel; //!< Level of the resource ==> for updata priority [0..5] 0 must be update first. public: diff --git a/sources/ewol/widget/Container.cpp b/sources/ewol/widget/Container.cpp index db24394d..f6e25bb9 100644 --- a/sources/ewol/widget/Container.cpp +++ b/sources/ewol/widget/Container.cpp @@ -47,7 +47,7 @@ void ewol::widget::Container::subWidgetRemove() { if (nullptr != m_subWidget) { m_subWidget->removeUpperWidget(); m_subWidget->removeObject(); - m_subWidget=nullptr; + m_subWidget.reset(); markToRedraw(); requestUpdateSize(); } @@ -57,7 +57,7 @@ void ewol::widget::Container::subWidgetUnLink() { if (nullptr != m_subWidget) { m_subWidget->removeUpperWidget(); } - m_subWidget=nullptr; + m_subWidget.reset(); } ewol::object::Shared ewol::widget::Container::getWidgetNamed(const std::string& _widgetName) { @@ -73,7 +73,7 @@ ewol::object::Shared ewol::widget::Container::getWidgetNamed(const void ewol::widget::Container::onObjectRemove(const ewol::object::Shared& _removeObject) { if (m_subWidget == _removeObject) { - m_subWidget=nullptr; + m_subWidget.reset(); markToRedraw(); requestUpdateSize(); } diff --git a/sources/ewol/widget/Container2.cpp b/sources/ewol/widget/Container2.cpp index 0c55f78d..68ceb0ec 100644 --- a/sources/ewol/widget/Container2.cpp +++ b/sources/ewol/widget/Container2.cpp @@ -45,8 +45,7 @@ void ewol::widget::Container2::subWidgetRemove(int32_t _idWidget) { if (m_subWidget[_idWidget] != nullptr) { EWOL_VERBOSE("Remove widget : " << _idWidget); m_subWidget[_idWidget]->removeUpperWidget(); - m_subWidget[_idWidget]->removeObject(); - m_subWidget[_idWidget] = nullptr; + m_subWidget[_idWidget].reset(); markToRedraw(); requestUpdateSize(); } @@ -57,7 +56,7 @@ void ewol::widget::Container2::subWidgetUnLink(int32_t _idWidget) { m_subWidget[_idWidget]->removeUpperWidget(); EWOL_VERBOSE("Unlink widget : " << _idWidget); } - m_subWidget[_idWidget] = nullptr; + m_subWidget[_idWidget].resetShared(); } ewol::object::Shared ewol::widget::Container2::getWidgetNamed(const std::string& _widgetName) { @@ -76,12 +75,12 @@ ewol::object::Shared ewol::widget::Container2::getWidgetNamed(cons void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared& _removeObject) { if (m_subWidget[0] == _removeObject) { - m_subWidget[0] = nullptr; + m_subWidget[0].reset(); markToRedraw(); requestUpdateSize(); } if (m_subWidget[1] == _removeObject) { - m_subWidget[1] = nullptr; + m_subWidget[1].reset(); markToRedraw(); requestUpdateSize(); } diff --git a/sources/ewol/widget/ContainerN.cpp b/sources/ewol/widget/ContainerN.cpp index 406f9c54..69310891 100644 --- a/sources/ewol/widget/ContainerN.cpp +++ b/sources/ewol/widget/ContainerN.cpp @@ -114,7 +114,7 @@ void ewol::widget::ContainerN::subWidgetUnLink(ewol::object::SharedremoveUpperWidget(); } @@ -128,11 +128,13 @@ void ewol::widget::ContainerN::subWidgetRemoveAllDelayed() { ewol::object::Shared ewol::widget::ContainerN::getWidgetNamed(const std::string& _widgetName) { ewol::object::Shared tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); - if (nullptr!=tmpUpperWidget) { + if (tmpUpperWidget != nullptr) { return tmpUpperWidget; } - for (auto it : m_subWidget) { - if (nullptr != it) { + EWOL_ERROR("plop"); + for (auto &it : m_subWidget) { + EWOL_ERROR("plop2"); + if (it != nullptr) { ewol::object::Shared tmpWidget = it->getWidgetNamed(_widgetName); if (tmpWidget != nullptr) { return tmpWidget; @@ -163,7 +165,7 @@ void ewol::widget::ContainerN::systemDraw(const ewol::DrawProperty& _displayProp // subwidget draw ewol::DrawProperty prop = _displayProp; prop.limit(m_origin, m_size); - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { it->systemDraw(prop); } @@ -172,7 +174,7 @@ void ewol::widget::ContainerN::systemDraw(const ewol::DrawProperty& _displayProp void ewol::widget::ContainerN::calculateSize(const vec2& _availlable) { m_size = _availlable; - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { it->setOrigin(m_origin+m_offset); it->calculateSize(m_size); @@ -186,7 +188,7 @@ void ewol::widget::ContainerN::calculateMinMaxSize() { m_minSize.setValue(0,0); m_maxSize.setValue(ULTIMATE_MAX_SIZE,ULTIMATE_MAX_SIZE); //EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} set min size : " << m_minSize); - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { it->calculateMinMaxSize(); bvec2 subExpendProp = it->canExpand(); @@ -205,7 +207,7 @@ void ewol::widget::ContainerN::calculateMinMaxSize() { } void ewol::widget::ContainerN::onRegenerateDisplay() { - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { it->onRegenerateDisplay(); } @@ -217,7 +219,7 @@ ewol::object::Shared ewol::widget::ContainerN::getWidgetAtPos(cons return nullptr; } // for all element in the sizer ... - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { vec2 tmpSize = it->getSize(); vec2 tmpOrigin = it->getOrigin(); diff --git a/sources/ewol/widget/Manager.cpp b/sources/ewol/widget/Manager.cpp index b84877bd..86425a93 100644 --- a/sources/ewol/widget/Manager.cpp +++ b/sources/ewol/widget/Manager.cpp @@ -72,16 +72,11 @@ ewol::widget::Manager::~Manager() { m_creatorList.clear(); } -void ewol::widget::Manager::rm(ewol::object::Shared _newWidget) { - periodicCallRm(_newWidget); - focusRemoveIfRemove(_newWidget); -} - /* ************************************************************************* * focus Area : * *************************************************************************/ -void ewol::widget::Manager::focusKeep(ewol::object::Shared _newWidget) { +void ewol::widget::Manager::focusKeep(const ewol::object::Shared& _newWidget) { if (nullptr == _newWidget) { // nothing to do ... return; @@ -106,7 +101,7 @@ void ewol::widget::Manager::focusKeep(ewol::object::Shared _newWid } } -void ewol::widget::Manager::focusSetDefault(ewol::object::Shared _newWidget) { +void ewol::widget::Manager::focusSetDefault(const ewol::object::Shared& _newWidget) { if( nullptr != _newWidget && false == _newWidget->canHaveFocus() ) { EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() ); @@ -143,11 +138,11 @@ void ewol::widget::Manager::focusRelease() { } -ewol::object::Shared ewol::widget::Manager::focusGet() { +const ewol::object::Shared& ewol::widget::Manager::focusGet() { return m_focusWidgetCurrent; } -void ewol::widget::Manager::focusRemoveIfRemove(ewol::object::Shared _newWidget) { +void ewol::widget::Manager::focusRemoveIfRemove(const ewol::object::Shared& _newWidget) { if (m_focusWidgetCurrent == _newWidget) { EWOL_WARNING("Release focus when remove widget"); focusRelease(); @@ -158,36 +153,49 @@ void ewol::widget::Manager::focusRemoveIfRemove(ewol::object::Shared _pWidget) { - for (size_t iii=0; iii < m_listOfPeriodicWidget.size(); iii++) { - if (m_listOfPeriodicWidget[iii] == _pWidget) { +void ewol::widget::Manager::periodicCallAdd(const ewol::object::Shared& _pWidget) { + if (_pWidget == nullptr) { + return; + } + m_havePeriodic = true; + for (auto &it : m_listOfPeriodicWidget) { + if (it == _pWidget) { return; } } - for (size_t iii=0; iii < m_listOfPeriodicWidget.size(); iii++) { - if (nullptr == m_listOfPeriodicWidget[iii]) { - m_listOfPeriodicWidget[iii] = _pWidget; + for (auto &it : m_listOfPeriodicWidget) { + if (it == nullptr) { + it = _pWidget; + return; } } m_listOfPeriodicWidget.push_back(_pWidget); - m_havePeriodic = true; } -void ewol::widget::Manager::periodicCallRm(ewol::object::Shared _pWidget) { +void ewol::widget::Manager::periodicCallRm(const ewol::object::Shared& _pWidget) { + for (auto &it : m_listOfPeriodicWidget) { + if (it == _pWidget) { + it.reset(); + } + } + periodicCallUpdateCount(); +} +void ewol::widget::Manager::periodicCallUpdateCount() { int32_t nbElement = 0; - for (int32_t iii=m_listOfPeriodicWidget.size()-1; iii >= 0 ; iii--) { - if (m_listOfPeriodicWidget[iii] == _pWidget) { - m_listOfPeriodicWidget[iii] = nullptr; - } else { + for (auto &it : m_listOfPeriodicWidget) { + if (it != nullptr) { nbElement++; } } if (0 == nbElement) { m_havePeriodic = false; + } else { + m_havePeriodic = true; } } + void ewol::widget::Manager::periodicCallResume(int64_t _localTime) { m_lastPeriodicCallTime = _localTime; } @@ -285,4 +293,20 @@ std::string ewol::widget::Manager::list() { return tmpVal; } - +void ewol::widget::Manager::onObjectRemove(const ewol::object::Shared& _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 cc76d33f..12b6b796 100644 --- a/sources/ewol/widget/Manager.h +++ b/sources/ewol/widget/Manager.h @@ -14,6 +14,7 @@ #include #include #include +#include namespace ewol { namespace widget { @@ -33,17 +34,15 @@ namespace ewol { public: Manager(); ~Manager(); - // need to call when remove a widget to clear all dependency of the focus system - void rm(ewol::object::Shared _newWidget); - void focusKeep(ewol::object::Shared _newWidget); // set the focus at the specific widget - void focusSetDefault(ewol::object::Shared _newWidget); // select the default focus getter + void focusKeep(const ewol::object::Shared& _newWidget); // set the focus at the specific widget + void focusSetDefault(const ewol::object::Shared& _newWidget); // select the default focus getter void focusRelease(); // release focus from the current widget to the default - ewol::object::Shared focusGet(); - void focusRemoveIfRemove(ewol::object::Shared _newWidget); + const ewol::object::Shared& focusGet(); + void focusRemoveIfRemove(const ewol::object::Shared& _newWidget); - void periodicCallAdd(ewol::object::Shared _pWidget); - void periodicCallRm(ewol::object::Shared _pWidget); + void periodicCallAdd(const ewol::object::Shared& _pWidget); + void periodicCallRm(const ewol::object::Shared& _pWidget); void periodicCall(int64_t _localTime); void periodicCallResume(int64_t _localTime); bool periodicCallHave(); @@ -56,6 +55,9 @@ namespace ewol { ewol::object::Shared create(const std::string& _name); bool exist(const std::string& _name); std::string list(); + virtual void onObjectRemove(const ewol::object::Shared& _object); + private: + void periodicCallUpdateCount(); }; }; }; diff --git a/sources/ewol/widget/Sizer.cpp b/sources/ewol/widget/Sizer.cpp index 417864a6..17f40092 100644 --- a/sources/ewol/widget/Sizer.cpp +++ b/sources/ewol/widget/Sizer.cpp @@ -65,7 +65,7 @@ void ewol::widget::Sizer::calculateSize(const vec2& _availlable) { float unexpandableSize=0.0; int32_t nbWidgetFixedSize=0; int32_t nbWidgetNotFixedSize=0; - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { vec2 tmpSize = it->getCalculateMinSize(); if (m_mode == ewol::widget::Sizer::modeVert) { @@ -99,7 +99,7 @@ void ewol::widget::Sizer::calculateSize(const vec2& _availlable) { } } vec2 tmpOrigin = m_origin + tmpBorderSize; - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { vec2 tmpSize = it->getCalculateMinSize(); // set the origin : @@ -136,7 +136,7 @@ void ewol::widget::Sizer::calculateMinMaxSize() { vec2 tmpBorderSize = m_borderSize.getPixel(); EWOL_VERBOSE("[" << getId() << "] {" << getObjectType() << "} set min size : " << m_minSize); m_minSize += tmpBorderSize*2; - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { if (it != nullptr) { it->calculateMinMaxSize(); if (it->canExpand().x() == true) { diff --git a/sources/ewol/widget/WSlider.cpp b/sources/ewol/widget/WSlider.cpp index e0edb9cd..c0a92521 100644 --- a/sources/ewol/widget/WSlider.cpp +++ b/sources/ewol/widget/WSlider.cpp @@ -125,7 +125,7 @@ void ewol::widget::WSlider::subWidgetSelectSetVectorId(int32_t _id) { void ewol::widget::WSlider::subWidgetSelectSet(int32_t _id) { int32_t elementID = 0; // search element in the list : - for (auto it : m_subWidget) { + for (auto &it : m_subWidget) { elementID ++; if (it != nullptr) { if (it->getId() == _id) { @@ -146,7 +146,7 @@ void ewol::widget::WSlider::subWidgetSelectSet(const ewol::object::SharedgetName() == _widgetName) { subWidgetSelectSetVectorId(iii); diff --git a/sources/ewol/widget/Widget.cpp b/sources/ewol/widget/Widget.cpp index 17bf76d3..3f6b98a6 100644 --- a/sources/ewol/widget/Widget.cpp +++ b/sources/ewol/widget/Widget.cpp @@ -153,14 +153,13 @@ ewol::Widget::Widget() : ewol::Widget::~Widget() { - // remove his own focus... - getWidgetManager().rm(this); // clean all the short-cut ... shortCutClean(); } void ewol::Widget::setUpperWidget(ewol::object::Shared _upper) { if (_upper == nullptr) { + EWOL_VERBOSE("[" << getId() << "] remove upper widget"); //just remove father : m_up.reset(); return; @@ -172,6 +171,7 @@ void ewol::Widget::setUpperWidget(ewol::object::Shared _upper) { } void ewol::Widget::onObjectRemove(const ewol::object::Shared& _object) { + EWOL_VERBOSE("[" << getId() << "] onObjectRemove(" << _object->getId() << ")"); ewol::Object::onObjectRemove(_object); if (_object == m_up) { EWOL_WARNING("[" << getId() << "] remove upper widget before removing this widget ..."); diff --git a/sources/ewol/widget/Widget.h b/sources/ewol/widget/Widget.h index 283dda36..27632c1b 100644 --- a/sources/ewol/widget/Widget.h +++ b/sources/ewol/widget/Widget.h @@ -699,7 +699,7 @@ namespace ewol { */ virtual enum ewol::context::cursorDisplay getCursor(); public: // Derived function - virtual void onObjectRemove(const ewol::object::Shared& _removeObject); + virtual void onObjectRemove(const ewol::object::Shared& _object); virtual bool loadXML(exml::Element* _node); protected: // Derived function virtual bool onSetConfig(const ewol::object::Config& _conf); diff --git a/sources/ewol/widget/Windows.cpp b/sources/ewol/widget/Windows.cpp index c5b9b2cb..e63a8e8b 100644 --- a/sources/ewol/widget/Windows.cpp +++ b/sources/ewol/widget/Windows.cpp @@ -28,7 +28,6 @@ ewol::widget::Windows::Windows() : m_colorBg(-1) { addObjectType("ewol::widget::Windows"); setCanHaveFocus(true); - m_subWidget = nullptr; setDecorationDisable(); m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:Windows.json"); if (m_colorProperty != nullptr) { @@ -45,16 +44,16 @@ ewol::widget::Windows::~Windows() { void ewol::widget::Windows::calculateSize(const vec2& _availlable) { //EWOL_DEBUG(" _availlable : " << _availlable); m_size = _availlable; - if (nullptr != m_subWidget) { + if (m_subWidget != nullptr) { m_subWidget->calculateMinMaxSize(); // TODO : Check if min size is possible ... // TODO : Herited from MinSize .. and expand ??? m_subWidget->calculateSize(m_size); } - for (size_t iii=0; iiicalculateMinMaxSize(); - m_popUpWidgetList[iii]->calculateSize(m_size); + for (auto &it : m_popUpWidgetList) { + if(it != nullptr) { + it->calculateMinMaxSize(); + it->calculateSize(m_size); } } } @@ -64,11 +63,7 @@ ewol::object::Shared ewol::widget::Windows::getWidgetAtPos(const v vec2 relativePos = relativePosition(_pos); // event go directly on the pop-up if (0 < m_popUpWidgetList.size()) { - if (nullptr == m_popUpWidgetList[m_popUpWidgetList.size()-1]) { - m_popUpWidgetList.pop_back(); - } else { - return m_popUpWidgetList[m_popUpWidgetList.size()-1]->getWidgetAtPos(_pos); - } + return m_popUpWidgetList.back()->getWidgetAtPos(_pos); // otherwise in the normal windows } else if (nullptr != m_subWidget) { return m_subWidget->getWidgetAtPos(_pos); @@ -113,9 +108,9 @@ void ewol::widget::Windows::onRegenerateDisplay() { if (nullptr != m_subWidget) { m_subWidget->onRegenerateDisplay(); } - for (size_t iii=0; iiionRegenerateDisplay(); + for (auto &it : m_popUpWidgetList) { + if (it != nullptr) { + it->onRegenerateDisplay(); } } } @@ -154,9 +149,9 @@ void ewol::widget::Windows::systemDraw(const ewol::DrawProperty& _displayProp) { int64_t ___startTime2 = ewol::getTime(); #endif // second display the pop-up - for (size_t iii=0; iiisystemDraw(_displayProp); + for (auto &it : m_popUpWidgetList) { + if (it != nullptr) { + it->systemDraw(_displayProp); //EWOL_DEBUG("Draw Pop-up"); } } @@ -169,9 +164,14 @@ void ewol::widget::Windows::systemDraw(const ewol::DrawProperty& _displayProp) { void ewol::widget::Windows::setSubWidget(ewol::object::Shared _widget) { if (m_subWidget != nullptr) { EWOL_INFO("Remove current main windows Widget..."); + m_subWidget->removeUpperWidget(); m_subWidget.reset(); } - m_subWidget = _widget; + if (_widget != nullptr) { + m_subWidget = _widget; + m_subWidget->setUpperWidget(this); + } + // Regenerate the size calculation : calculateSize(m_size); } @@ -183,6 +183,7 @@ void ewol::widget::Windows::popUpWidgetPush(ewol::object::Shared _ return; } m_popUpWidgetList.push_back(_widget); + _widget->setUpperWidget(this); // force the focus on the basic widget ==> this remove many time the virual keyboard area _widget->keepFocus(); // Regenerate the size calculation : @@ -195,11 +196,8 @@ void ewol::widget::Windows::popUpWidgetPop() { if (m_popUpWidgetList.size() == 0) { return; } - ewol::object::Shared widget = m_popUpWidgetList[m_popUpWidgetList.size()-1]; - if (widget == nullptr) { - return; - } - widget->removeObject(); + m_popUpWidgetList.back()->removeUpperWidget(); + m_popUpWidgetList.pop_back(); } void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared& _removeObject) { @@ -209,13 +207,13 @@ void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared destroyed object"); - m_subWidget = nullptr; + m_subWidget.reset(); } - for(int32_t iii=m_popUpWidgetList.size()-1; iii >= 0; --iii) { - if(m_popUpWidgetList[iii] == _removeObject) { - EWOL_DEBUG("Remove Pop-up [" << iii << "] element of the windows == > destroyed object"); - m_popUpWidgetList[iii] = nullptr; - m_popUpWidgetList.erase(m_popUpWidgetList.begin()+iii); + for (auto it(m_popUpWidgetList.begin()) ; it != m_popUpWidgetList.end() ; ++it) { + if(*it == _removeObject) { + EWOL_DEBUG("Remove Pop-up element of the windows == > destroyed object"); + m_popUpWidgetList.erase(it); + it = m_popUpWidgetList.begin(); } } } diff --git a/sources/ewol/widget/Windows.h b/sources/ewol/widget/Windows.h index c3565740..e176a404 100644 --- a/sources/ewol/widget/Windows.h +++ b/sources/ewol/widget/Windows.h @@ -14,6 +14,7 @@ #include #include #include +#include namespace ewol { namespace widget { @@ -57,7 +58,7 @@ namespace ewol { } private: ewol::object::Owner m_subWidget; - std::vector> m_popUpWidgetList; + std::list> m_popUpWidgetList; public: void setSubWidget(ewol::object::Shared _widget); void popUpWidgetPush(ewol::object::Shared _widget);