[DEV] shared system work corectly with simple example

This commit is contained in:
Edouard DUPIN 2014-05-25 16:15:26 +02:00
parent 49c3036080
commit a1d0185f19
26 changed files with 380 additions and 339 deletions

View File

@ -288,6 +288,7 @@ void ewol::Context::setArchiveDir(int _mode, const char* _str) {
ewol::Context::Context(int32_t _argc, const char* _argv[]) : ewol::Context::Context(int32_t _argc, const char* _argv[]) :
m_objectManager(*this),
m_previousDisplayTime(0), m_previousDisplayTime(0),
m_input(*this), m_input(*this),
#if (defined(__TARGET_OS__Android) || defined(__TARGET_OS__IOs)) #if (defined(__TARGET_OS__Android) || defined(__TARGET_OS__IOs))
@ -382,6 +383,11 @@ ewol::Context::~Context() {
lockContext(); lockContext();
// Remove current windows // Remove current windows
m_windowsCurrent.reset(); 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 // call application to uninit
APP_UnInit(*this); APP_UnInit(*this);
// unset all windows // unset all windows
@ -643,14 +649,23 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) {
m_FpsFlush.draw(); m_FpsFlush.draw();
} }
// while The Gui is drawing in OpenGl, we do some not realTime things // 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; return hasDisplayDone;
} }
void ewol::Context::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) { void ewol::Context::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
//EWOL_CRITICAL("element removed"); //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() { void ewol::Context::resetIOEvent() {

View File

@ -22,6 +22,7 @@
#include <ewol/context/commandLine.h> #include <ewol/context/commandLine.h>
#include <ewol/context/InputManager.h> #include <ewol/context/InputManager.h>
#include <ewol/context/Fps.h> #include <ewol/context/Fps.h>
#include <ewol/object/RemoveEvent.h>
namespace ewol { namespace ewol {
/** /**
@ -37,7 +38,7 @@ namespace ewol {
screenPortrait screenPortrait
}; };
class Context { class Context/* : private ewol::object::RemoveEvent */{
private: private:
ewol::context::CommandLine m_commandLine; //!< Start command line information ewol::context::CommandLine m_commandLine; //!< Start command line information
public: public:
@ -50,18 +51,18 @@ namespace ewol {
ewol::context::ConfigFont& getFontDefault() { ewol::context::ConfigFont& getFontDefault() {
return m_configFont; return m_configFont;
}; };
private:
ewol::widget::Manager m_widgetManager; //!< global widget manager
public:
ewol::widget::Manager& getWidgetManager() {
return m_widgetManager;
};
private: private:
ewol::object::Manager m_objectManager; //!< Object Manager main instance ewol::object::Manager m_objectManager; //!< Object Manager main instance
public: public:
ewol::object::Manager& getEObjectManager() { ewol::object::Manager& getEObjectManager() {
return m_objectManager; return m_objectManager;
}; };
private:
ewol::widget::Manager m_widgetManager; //!< global widget manager
public:
ewol::widget::Manager& getWidgetManager() {
return m_widgetManager;
};
private: private:
ewol::resource::Manager m_resourceManager; //!< global resources Manager ewol::resource::Manager m_resourceManager; //!< global resources Manager
public: public:
@ -121,7 +122,7 @@ namespace ewol {
* @brief The current context is resumed * @brief The current context is resumed
*/ */
virtual void OS_Resume(); virtual void OS_Resume();
/** /**
* @brief The current context is set in foreground (framerate is maximum speed) * @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 // return true if a flush is needed
bool OS_Draw(bool _displayEveryTime); bool OS_Draw(bool _displayEveryTime);
/**
* @brief Inform object that an other object is removed ... virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
* @param[in] removeObject Pointer on the EObject removed == > the user must remove all reference on this EObject public:
* @note : Sub classes must call this class
*/
void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
/** /**
* @brief reset event management for the IO like Input ou Mouse or keyborad * @brief reset event management for the IO like Input ou Mouse or keyborad
*/ */

View File

@ -83,7 +83,7 @@ void ewol::context::InputManager::cleanElement(InputPoperty *_eventTable,
_eventTable[_idInput].isUsed = false; _eventTable[_idInput].isUsed = false;
_eventTable[_idInput].destinationInputId = 0; _eventTable[_idInput].destinationInputId = 0;
_eventTable[_idInput].lastTimeEvent = 0; _eventTable[_idInput].lastTimeEvent = 0;
_eventTable[_idInput].curentWidgetEvent = nullptr; _eventTable[_idInput].curentWidgetEvent.reset();
_eventTable[_idInput].origin.setValue(0,0); _eventTable[_idInput].origin.setValue(0,0);
_eventTable[_idInput].size.setValue(99999999,99999999); _eventTable[_idInput].size.setValue(99999999,99999999);
_eventTable[_idInput].downStart.setValue(0,0); _eventTable[_idInput].downStart.setValue(0,0);
@ -138,17 +138,23 @@ void ewol::context::InputManager::unGrabPointer() {
m_context.grabPointerEvents(false, vec2(0,0)); m_context.grabPointerEvents(false, vec2(0,0));
} }
void ewol::context::InputManager::onObjectRemove(const ewol::object::Shared<ewol::Object>& removeObject) { void ewol::context::InputManager::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
for(int32_t iii=0; iii<MAX_MANAGE_INPUT; iii++) { for(int32_t iii=0; iii<MAX_MANAGE_INPUT; iii++) {
if (m_eventInputSaved[iii].curentWidgetEvent == removeObject) { if (m_eventInputSaved[iii].curentWidgetEvent == _object) {
// remove the property of this input ... // remove the property of this input ...
EWOL_VERBOSE("Remove object ==> rm Input Event !!!");
cleanElement(m_eventInputSaved, iii); cleanElement(m_eventInputSaved, iii);
} }
if (m_eventMouseSaved[iii].curentWidgetEvent == removeObject) { if (m_eventMouseSaved[iii].curentWidgetEvent == _object) {
// remove the property of this input ... // remove the property of this input ...
EWOL_VERBOSE("Remove object ==> rm Mouse Event !!!");
cleanElement(m_eventMouseSaved, iii); cleanElement(m_eventMouseSaved, iii);
} }
} }
if (m_grabWidget == _object) {
EWOL_VERBOSE("Remove object ==> rm Grab widget !!!");
m_grabWidget.reset();
}
} }
void ewol::context::InputManager::newLayerSet() { void ewol::context::InputManager::newLayerSet() {

View File

@ -10,6 +10,7 @@
#define __EWOL_SYSTEM_INPUT_H__ #define __EWOL_SYSTEM_INPUT_H__
#include <ewol/widget/Widget.h> #include <ewol/widget/Widget.h>
#include <ewol/object/RemoveEvent.h>
#define MAX_MANAGE_INPUT (15) #define MAX_MANAGE_INPUT (15)
@ -24,7 +25,7 @@ namespace ewol {
bool isUsed; bool isUsed;
int32_t destinationInputId; int32_t destinationInputId;
int64_t lastTimeEvent; int64_t lastTimeEvent;
ewol::object::Shared<ewol::Widget> curentWidgetEvent; ewol::object::Shared<ewol::Widget> curentWidgetEvent;
vec2 origin; vec2 origin;
vec2 size; vec2 size;
vec2 downStart; vec2 downStart;
@ -44,7 +45,7 @@ namespace ewol {
int32_t DpiOffset; int32_t DpiOffset;
}; };
class Context; class Context;
class InputManager { class InputManager{
// special grab pointer mode : // special grab pointer mode :
private: private:
ewol::object::Shared<ewol::Widget> m_grabWidget; //!< widget that grab the curent pointer. ewol::object::Shared<ewol::Widget> 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 motion(enum ewol::key::type _type, int _pointerID, vec2 _pos );
void state(enum ewol::key::type _type, int _pointerID, bool _isDown, vec2 _pos); void state(enum ewol::key::type _type, int _pointerID, bool _isDown, vec2 _pos);
/** void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
* @brief Inform object that an other object is removed ... public:
* @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<ewol::Object>& _removeObject);
/** /**
* @brief a new layer on the windows is set == > might remove all the property of the current element ... * @brief a new layer on the windows is set == > might remove all the property of the current element ...
*/ */

View File

@ -14,7 +14,8 @@
#undef __class__ #undef __class__
#define __class__ "ewol::object::Manager" #define __class__ "ewol::object::Manager"
ewol::object::Manager::Manager() { ewol::object::Manager::Manager(ewol::Context& _context) :
m_context(_context) {
EWOL_DEBUG(" == > init Object-Manager"); EWOL_DEBUG(" == > init Object-Manager");
} }
@ -31,6 +32,13 @@ ewol::object::Manager::~Manager() {
if (true == hasError) { if (true == hasError) {
EWOL_ERROR("Check if the function UnInit has been called !!!"); 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() { void ewol::object::Manager::unInit() {
@ -67,14 +75,17 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared<
for (auto &it : m_eObjectList) { for (auto &it : m_eObjectList) {
if ( it != nullptr if ( it != nullptr
&& it != _object) { && it != _object) {
EWOL_VERBOSE("[" << _object->getId() << "] Inform remove Element : " << it->getId() << " type : " << it->getTypeDescription());
it->onObjectRemove(_object); 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) { for (auto &it : m_removeEventList) {
EWOL_VERBOSE("[" << _object->getId() << "] Inform Event Remove Object List : ...");
it->onObjectRemove(_object); it->onObjectRemove(_object);
} }
// inform the context ...
ewol::getContext().onObjectRemove(_object);
} }
void ewol::object::Manager::respown(const ewol::object::Shared<ewol::Object>& _object){ void ewol::object::Manager::respown(const ewol::object::Shared<ewol::Object>& _object){
@ -99,13 +110,11 @@ void ewol::object::Manager::remove(const ewol::object::Shared<ewol::Object>& _ob
for (int64_t iii = (int64_t)m_eObjectListActive.size()-1; iii>=0; --iii) { for (int64_t iii = (int64_t)m_eObjectListActive.size()-1; iii>=0; --iii) {
if (m_eObjectListActive[iii] == _object) { if (m_eObjectListActive[iii] == _object) {
// remove Element // remove Element
m_eObjectListActive.erase(m_eObjectListActive.begin()+iii);
EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "'"); EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "'");
if (_object->getStatusResource() == false) { informOneObjectIsRemoved(_object);
informOneObjectIsRemoved(_object);
}
ewol::getContext().forceRedrawAll(); 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; return;
} }
} }
@ -114,16 +123,22 @@ void ewol::object::Manager::remove(const ewol::object::Shared<ewol::Object>& _ob
// clean all Object that request an autoRemove ... // clean all Object that request an autoRemove ...
void ewol::object::Manager::removeAllRemovedObject() { void ewol::object::Manager::removeAllRemovedObject() {
//EWOL_DEBUG("Auto-Remove Object section : " << m_eObjectAutoRemoveList.size() << " elemeents"); EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectListActive.size() << "/" << m_eObjectList.size() << " elemeents");
for (int64_t iii = (int64_t)m_eObjectList.size()-1; iii>=0; --iii) { bool haveRemoveElement = true;
if (m_eObjectList[iii] == nullptr) { while (haveRemoveElement == true) {
continue; 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);
} }
} }

View File

@ -15,14 +15,16 @@
#include <ewol/object/RemoveEvent.h> #include <ewol/object/RemoveEvent.h>
namespace ewol { namespace ewol {
class Context;
namespace object { namespace object {
class Manager { class Manager {
private: private:
std::vector<ewol::object::RemoveEvent*> m_removeEventList; std::vector<ewol::object::RemoveEvent*> m_removeEventList;
std::vector<ewol::object::Shared<ewol::Object>> m_eObjectList; // all widget allocated == > all time increment ... never removed ... std::vector<ewol::object::Shared<ewol::Object>> m_eObjectList; // all widget allocated == > all time increment ... never removed ...
std::vector<ewol::object::Shared<ewol::Object>> m_eObjectListActive; // all active widget std::vector<ewol::object::Shared<ewol::Object>> m_eObjectListActive; // all active widget
Context& m_context;
public: public:
Manager(); Manager(Context& _context);
~Manager(); ~Manager();
/** /**
* @brief remove all resources (un-init) out of the destructor (due to the system implementation) * @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 * @return number of Object
*/ */
int32_t getNumberObject(); int32_t getNumberObject();
void displayListObject();
private: private:
friend class ewol::Object; friend class ewol::Object;
/** /**

View File

@ -22,23 +22,35 @@ size_t ewol::Object::m_valUID = 0;
void ewol::Object::objRefCountIncrement() { void ewol::Object::objRefCountIncrement() {
std::unique_lock<std::mutex> lock(m_lockRefCount); std::unique_lock<std::mutex> lock(m_lockRefCount);
/*
if (std::string("ewol::widget::Windows") == getObjectType()) {
EWOL_ERROR("increment Windows count ++" << m_objRefCount);
//etk::log::displayBacktrace();
}
*/
m_objRefCount++; m_objRefCount++;
} }
void ewol::Object::objRefCountDecrement() { void ewol::Object::objRefCountDecrement() {
std::unique_lock<std::mutex> lock(m_lockRefCount); std::unique_lock<std::mutex> lock(m_lockRefCount);
/*
if (std::string("ewol::widget::Windows") == getObjectType()) {
EWOL_ERROR("Decrement Windows count --" << m_objRefCount);
//etk::log::displayBacktrace();
}
*/
m_objRefCount--; m_objRefCount--;
} }
void ewol::Object::operator delete(void* _ptr, std::size_t _sz) { void ewol::Object::operator delete(void* _ptr, std::size_t _sz) {
EWOL_DEBUG("custom delete for size " << _sz); EWOL_VERBOSE("custom delete for size " << _sz);
ewol::object::Shared<ewol::Object> obj = (ewol::Object*)_ptr; ewol::Object* obj = (ewol::Object*)_ptr;
obj->objRefCountDecrement(); obj->objRefCountDecrement();
if (obj->m_objRefCount <= 0) { if (obj->m_objRefCount <= 0) {
EWOL_DEBUG(" ==> real remove"); EWOL_VERBOSE(" ==> real remove");
::operator delete(_ptr); ::operator delete(_ptr);
} else { } 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(); etk::log::displayBacktrace();
} }
} }
@ -49,7 +61,7 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) {
} }
void ewol::Object::autoDestroy() { void ewol::Object::autoDestroy() {
EWOL_VERBOSE("Destroy object : [" << m_valUID << "] type:" << getTypeDescription()); EWOL_VERBOSE("Destroy object : [" << getId() << "] type:" << getTypeDescription());
{ {
std::unique_lock<std::mutex> lock(m_lockRefCount); std::unique_lock<std::mutex> lock(m_lockRefCount);
if (m_isDestroyed == true) { if (m_isDestroyed == true) {
@ -100,7 +112,7 @@ ewol::Object::Object(const std::string& _name) :
} }
ewol::Object::~Object() { ewol::Object::~Object() {
EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription()); EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription() << " refcount=" << m_objRefCount);
getMultiCast().rm(this); getMultiCast().rm(this);
for (size_t iii=0; iii<m_externEvent.size(); ++iii) { for (size_t iii=0; iii<m_externEvent.size(); ++iii) {
if (m_externEvent[iii] != nullptr) { if (m_externEvent[iii] != nullptr) {
@ -295,9 +307,11 @@ void ewol::Object::unRegisterOnEvent(const ewol::object::Shared<ewol::Object>& _
} }
void ewol::Object::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) { void ewol::Object::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
EWOL_VERBOSE("[" << getId() << "] onObjectRemove(" << _object->getId() << ")");
for(int32_t iii=m_externEvent.size()-1; iii >= 0; iii--) { for(int32_t iii=m_externEvent.size()-1; iii >= 0; iii--) {
if (m_externEvent[iii] != nullptr) { if (m_externEvent[iii] != nullptr) {
m_externEvent.erase(m_externEvent.begin()+iii); m_externEvent.erase(m_externEvent.begin()+iii);
EWOL_VERBOSE("[" << getId() << "] Remove extern event : to object id=" << _object->getId());
} }
} }
} }

View File

@ -14,8 +14,8 @@
#include <vector> #include <vector>
#include <exml/exml.h> #include <exml/exml.h>
#include <mutex> #include <mutex>
#include <ewol/object/Owner.h>
#include <ewol/object/Shared.h> #include <ewol/object/Shared.h>
#include <ewol/object/Owner.h>
namespace ewol { namespace ewol {
// some class need to define element befor other ... // some class need to define element befor other ...

View File

@ -44,7 +44,20 @@ namespace ewol {
m_pointer = _obj.m_pointer; m_pointer = _obj.m_pointer;
_obj.m_pointer = nullptr; _obj.m_pointer = nullptr;
} }
Owner& operator=(const Owner<T>& _obj) noexcept { // shared to private constructor
template<typename T2, typename = typename
std::enable_if<std::is_convertible<T*, T2*>::value>::type>
Owner(const Shared<T2>& _obj) :
m_pointer(nullptr) {
m_pointer = _obj.get();
if (m_pointer == nullptr) {
return;
}
m_pointer->objRefCountIncrement();
}
template<typename T2, typename = typename
std::enable_if<std::is_convertible<T*, T2*>::value>::type>
Owner& operator=(const Owner<T2>& _obj) noexcept {
if(this == &_obj) { if(this == &_obj) {
return *this; return *this;
} }
@ -55,35 +68,50 @@ namespace ewol {
} }
return *this; return *this;
} }
template<typename T2, typename = typename
std::enable_if<std::is_convertible<T*, T2*>::value>::type>
Owner& operator=(const Shared<T2>& _obj) noexcept {
reset();
m_pointer = _obj.get();
if (m_pointer != nullptr) {
m_pointer->objRefCountIncrement();
}
return *this;
}
void reset() { void reset() {
if (m_pointer == nullptr) { if (m_pointer == nullptr) {
return; return;
} }
m_pointer->removeObject(); //etk::log::displayBacktrace();
if (m_pointer->m_objRefCount <= 0) { // To prevent cyclisme
EWOL_ERROR("Object will be already removed"); T* tmp = m_pointer;
} else if (m_pointer->m_objRefCount == 1) {
EWOL_ERROR("Remove object (in Owner)");
delete m_pointer;
} else {
m_pointer->objRefCountDecrement();
}
m_pointer = nullptr; 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() { void resetShared() {
if (m_pointer == nullptr) { if (m_pointer == nullptr) {
return; return;
} }
if (m_pointer->m_objRefCount <= 0) { // To prevent cyclisme
EWOL_ERROR("Object will be already removed"); T* tmp = m_pointer;
} else if (m_pointer->m_objRefCount == 1) {
EWOL_ERROR("Remove object (in Owner)");
delete m_pointer;
} else {
m_pointer->objRefCountDecrement();
}
m_pointer = nullptr; 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 { T* get() noexcept {
return m_pointer; return m_pointer;
@ -97,6 +125,9 @@ namespace ewol {
T* operator->() const noexcept { T* operator->() const noexcept {
return m_pointer; return m_pointer;
} }
operator ewol::object::Shared<T>() const noexcept {
return m_pointer;
}
}; };
}; };
// section to compare Owner pointer of an object with an other // 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<T2>& _obj2) noexcept { inline bool operator==(const T* _obj, const object::Owner<T2>& _obj2) noexcept {
return _obj == _obj2.get(); return _obj == _obj2.get();
} }
//! @not in doc
template<typename T, typename T2>
inline bool operator==(const object::Owner<T>& _obj, const object::Shared<T2>& _obj2) noexcept {
return _obj.get() == _obj2.get();
}
//! @not in doc
template<typename T, typename T2>
inline bool operator==(const object::Shared<T>& _obj, const object::Owner<T2>& _obj2) noexcept {
return _obj.get() == _obj2.get();
}
//! @not in doc
template<typename T, typename T2, typename = typename
std::enable_if<std::is_convertible<T*, T2*>::value>::type>
inline bool operator!=(const object::Owner<T>& _obj, const T2* _obj2) noexcept {
return _obj.get() != _obj2;
}
//! @not in doc
template<typename T, typename T2, typename = typename
std::enable_if<std::is_convertible<T*, T2*>::value>::type>
inline bool operator!=(const T* _obj, const object::Owner<T2>& _obj2) noexcept {
return _obj != _obj2.get();
}
//! @not in doc //! @not in doc
template<typename T, typename T2> template<typename T, typename T2>
@ -145,17 +198,23 @@ namespace ewol {
return _obj.get() != nullptr; return _obj.get() != nullptr;
} }
//! @not in doc //! @not in doc
template<typename T, typename T2, typename = typename template<typename T, typename T2>
std::enable_if<std::is_convertible<T*, T2*>::value>::type> inline bool operator!=(const object::Owner<T>& _obj, const object::Shared<T2>& _obj2) noexcept {
inline bool operator!=(const object::Owner<T>& _obj, const T2* _obj2) noexcept { return _obj.get() != _obj2.get();
return _obj.get() != _obj2;
} }
//! @not in doc //! @not in doc
template<typename T, typename T2>
inline bool operator!=(const object::Shared<T>& _obj, const object::Owner<T2>& _obj2) noexcept {
return _obj.get() != _obj2.get();
}
/*
template<typename T, typename T2, typename = typename template<typename T, typename T2, typename = typename
std::enable_if<std::is_convertible<T*, T2*>::value>::type> std::enable_if<std::is_convertible<T*, T2*>::value>::type>
inline bool operator!=(const T* _obj, const object::Owner<T2>& _obj2) noexcept { object::Shared<T> operator=(const object::Owner<T2>& _obj) {
return _obj != _obj2.get(); return _obj.get();
} }
*/
//! @not in doc //! @not in doc
template<typename T> template<typename T>

View File

@ -7,11 +7,17 @@
*/ */
#include <ewol/object/RemoveEvent.h> #include <ewol/object/RemoveEvent.h>
#include <ewol/context/Context.h>
ewol::object::RemoveEvent::RemoveEvent() { ewol::object::RemoveEvent::RemoveEvent() {
Context& tmp = ewol::getContext();
ewol::object::Manager& manager = tmp.getEObjectManager();
manager.add(this);
} }
ewol::object::RemoveEvent::~RemoveEvent() { ewol::object::RemoveEvent::~RemoveEvent() {
Context& tmp = ewol::getContext();
ewol::object::Manager& manager = tmp.getEObjectManager();
manager.rm(this);
} }

View File

@ -32,15 +32,6 @@ namespace ewol {
~Shared() { ~Shared() {
reset(); reset();
} }
// shared to private constructor
Shared(const Owner<T>& _obj) :
m_pointer(nullptr) {
m_pointer = _obj.get();
if (m_pointer == nullptr) {
return;
}
m_pointer->objRefCountIncrement();
}
// copy constructor // copy constructor
Shared(const Shared& _obj) : Shared(const Shared& _obj) :
m_pointer(nullptr) { m_pointer(nullptr) {
@ -57,12 +48,6 @@ namespace ewol {
m_pointer = _obj.m_pointer; m_pointer = _obj.m_pointer;
_obj.m_pointer = nullptr; _obj.m_pointer = nullptr;
} }
bool hasOwner() {
if (m_pointer == nullptr) {
return false;
}
return m_pointer->getRefOwner();
}
Shared& operator=(const Shared<T>& _obj) noexcept { Shared& operator=(const Shared<T>& _obj) noexcept {
if(this == &_obj) { if(this == &_obj) {
@ -80,15 +65,17 @@ namespace ewol {
if (m_pointer == nullptr) { if (m_pointer == nullptr) {
return; return;
} }
if (m_pointer->m_objRefCount <= 0) { // To prevent cyclisme
EWOL_ERROR("Object is already removed"); T* tmp = m_pointer;
} else if (m_pointer->m_objRefCount == 1) {
EWOL_ERROR("Remove object (in shared)");
delete m_pointer;
} else {
m_pointer->objRefCountDecrement();
}
m_pointer = nullptr; 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 { T* get() const noexcept {
return m_pointer; return m_pointer;
@ -99,9 +86,6 @@ namespace ewol {
T* operator->() const noexcept { T* operator->() const noexcept {
return m_pointer; return m_pointer;
} }
operator ewol::object::Owner<T>() const noexcept {
return m_pointer;
}
template<typename T2> operator ewol::object::Shared<T2>() const noexcept { template<typename T2> operator ewol::object::Shared<T2>() const noexcept {
return m_pointer; return m_pointer;
} }
@ -146,16 +130,6 @@ namespace ewol {
inline bool operator==(const T* _obj, const object::Shared<T2>& _obj2) noexcept { inline bool operator==(const T* _obj, const object::Shared<T2>& _obj2) noexcept {
return _obj == _obj2.get(); return _obj == _obj2.get();
} }
//! @not in doc
template<typename T, typename T2>
inline bool operator==(const object::Owner<T>& _obj, const object::Shared<T2>& _obj2) noexcept {
return _obj.get() == _obj2.get();
}
//! @not in doc
template<typename T, typename T2>
inline bool operator==(const object::Shared<T>& _obj, const object::Owner<T2>& _obj2) noexcept {
return _obj.get() == _obj2.get();
}
//! @not in doc //! @not in doc
template<typename T, typename T2> template<typename T, typename T2>
@ -184,16 +158,6 @@ namespace ewol {
inline bool operator!=(const T* _obj, const object::Shared<T2>& _obj2) noexcept { inline bool operator!=(const T* _obj, const object::Shared<T2>& _obj2) noexcept {
return _obj != _obj2.get(); return _obj != _obj2.get();
} }
//! @not in doc
template<typename T, typename T2>
inline bool operator!=(const object::Owner<T>& _obj, const object::Shared<T2>& _obj2) noexcept {
return _obj.get() != _obj2.get();
}
//! @not in doc
template<typename T, typename T2>
inline bool operator!=(const object::Shared<T>& _obj, const object::Owner<T2>& _obj2) noexcept {
return _obj.get() != _obj2.get();
}
//! @not in doc //! @not in doc
template<typename T> template<typename T>

View File

@ -40,12 +40,12 @@ void ewol::resource::Manager::unInit() {
display(); display();
m_resourceListToUpdate.clear(); m_resourceListToUpdate.clear();
// remove all resources ... // remove all resources ...
for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) { for (auto &it : m_resourceList) {
if (m_resourceList[iii] != nullptr) { if (it != nullptr) {
EWOL_WARNING("Find a resource that is not removed : [" << m_resourceList[iii]->getId() << "]" EWOL_WARNING("Find a resource that is not removed : [" << it->getId() << "]"
<< "=\"" << m_resourceList[iii]->getName() << "\" " << "=\"" << it->getName() << "\" "
<< m_resourceList[iii]->getCounter() << " elements"); << it->getRefCount() << " elements");
m_resourceList[iii].reset(); it.reset();
} }
} }
m_resourceList.clear(); m_resourceList.clear();
@ -54,12 +54,12 @@ void ewol::resource::Manager::unInit() {
void ewol::resource::Manager::display() { void ewol::resource::Manager::display() {
EWOL_INFO("Resources loaded : "); EWOL_INFO("Resources loaded : ");
// remove all resources ... // remove all resources ...
for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) { for (auto &it : m_resourceList) {
if (m_resourceList[iii] != nullptr) { if (it != nullptr) {
EWOL_INFO(" [" << m_resourceList[iii]->getId() << "]" EWOL_INFO(" [" << it->getId() << "]"
<< m_resourceList[iii]->getObjectType() << it->getObjectType()
<< "=\"" << m_resourceList[iii]->getName() << "\" " << "=\"" << it->getName() << "\" "
<< m_resourceList[iii]->getCounter() << " elements"); << it->getRefCount() << " elements");
} }
} }
EWOL_INFO("Resources ---"); EWOL_INFO("Resources ---");
@ -71,11 +71,11 @@ void ewol::resource::Manager::reLoadResources() {
if (m_resourceList.size() != 0) { if (m_resourceList.size() != 0) {
for (size_t jjj=0; jjj<MAX_RESOURCE_LEVEL; jjj++) { for (size_t jjj=0; jjj<MAX_RESOURCE_LEVEL; jjj++) {
EWOL_INFO(" Reload level : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1)); EWOL_INFO(" Reload level : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1));
for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) { for (auto &it : m_resourceList) {
if(m_resourceList[iii] != nullptr) { if(it != nullptr) {
if (jjj == m_resourceList[iii]->getResourceLevel()) { if (jjj == it->getResourceLevel()) {
m_resourceList[iii]->reload(); it->reload();
EWOL_INFO(" [" << m_resourceList[iii]->getId() << "]="<< m_resourceList[iii]->getObjectType()); EWOL_INFO(" [" << it->getId() << "]="<< it->getObjectType());
} }
} }
} }
@ -88,12 +88,11 @@ void ewol::resource::Manager::reLoadResources() {
void ewol::resource::Manager::update(const ewol::object::Shared<ewol::Resource>& _object) { void ewol::resource::Manager::update(const ewol::object::Shared<ewol::Resource>& _object) {
// chek if not added before // chek if not added before
for (size_t iii=0; iii<m_resourceListToUpdate.size(); iii++) { for (auto &it : m_resourceListToUpdate) {
if (m_resourceListToUpdate[iii] != nullptr) { if ( it != nullptr
if (m_resourceListToUpdate[iii] == _object) { && it == _object) {
// just prevent some double add ... // just prevent some double add ...
return; return;
}
} }
} }
// add it ... // add it ...
@ -102,31 +101,29 @@ void ewol::resource::Manager::update(const ewol::object::Shared<ewol::Resource>&
// Specific to load or update the data in the openGl context == > system use only // Specific to load or update the data in the openGl context == > system use only
void ewol::resource::Manager::updateContext() { void ewol::resource::Manager::updateContext() {
if (true == m_contextHasBeenRemoved) { if (m_contextHasBeenRemoved == true) {
// need to update all ... // need to update all ...
m_contextHasBeenRemoved = false; m_contextHasBeenRemoved = false;
if (m_resourceList.size() != 0) { if (m_resourceList.size() != 0) {
for (size_t jjj=0; jjj<MAX_RESOURCE_LEVEL; jjj++) { for (size_t jjj=0; jjj<MAX_RESOURCE_LEVEL; jjj++) {
EWOL_INFO(" updateContext level (D) : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1)); EWOL_INFO(" updateContext level (D) : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1));
for (size_t iii=0; iii<m_resourceList.size(); iii++) { for (auto &it : m_resourceList) {
if(m_resourceList[iii] != nullptr) { if( it != nullptr
if (jjj == m_resourceList[iii]->getResourceLevel()) { && jjj == it->getResourceLevel()) {
//EWOL_DEBUG("Update context of " << iii << " named : " << l_resourceList[iii]->getName()); //EWOL_DEBUG("Update context named : " << l_resourceList[iii]->getName());
m_resourceList[iii]->updateContext(); it->updateContext();
}
} }
} }
} }
} }
}else { } else {
if (m_resourceListToUpdate.size() != 0) { if (m_resourceListToUpdate.size() != 0) {
for (size_t jjj=0; jjj<MAX_RESOURCE_LEVEL; jjj++) { for (size_t jjj=0; jjj<MAX_RESOURCE_LEVEL; jjj++) {
EWOL_INFO(" updateContext level (U) : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1)); EWOL_INFO(" updateContext level (U) : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1));
for (size_t iii=0; iii<m_resourceListToUpdate.size(); iii++) { for (auto &it : m_resourceListToUpdate) {
if(m_resourceListToUpdate[iii] != nullptr) { if ( it != nullptr
if (jjj == m_resourceListToUpdate[iii]->getResourceLevel()) { && jjj == it->getResourceLevel()) {
m_resourceListToUpdate[iii]->updateContext(); it->updateContext();
}
} }
} }
} }
@ -138,9 +135,9 @@ void ewol::resource::Manager::updateContext() {
// in this case, it is really too late ... // in this case, it is really too late ...
void ewol::resource::Manager::contextHasBeenDestroyed() { void ewol::resource::Manager::contextHasBeenDestroyed() {
for (size_t iii=0; iii<m_resourceList.size(); iii++) { for (auto &it : m_resourceList) {
if (m_resourceList[iii] != nullptr) { if (it != nullptr) {
m_resourceList[iii]->removeContextToLate(); it->removeContextToLate();
} }
} }
// no context preent ... // no context preent ...
@ -150,12 +147,10 @@ void ewol::resource::Manager::contextHasBeenDestroyed() {
// internal generic keeper ... // internal generic keeper ...
ewol::object::Shared<ewol::Resource> ewol::resource::Manager::localKeep(const std::string& _filename) { ewol::object::Shared<ewol::Resource> ewol::resource::Manager::localKeep(const std::string& _filename) {
EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\""); EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\"");
for (size_t iii=0; iii<m_resourceList.size(); iii++) { for (auto &it : m_resourceList) {
if (m_resourceList[iii] != nullptr) { if ( it != nullptr
if(m_resourceList[iii]->getName() == _filename) { && it->getName() == _filename) {
m_resourceList[iii]->increment(); return it;
return m_resourceList[iii];
}
} }
} }
// we did not find it ... // we did not find it ...
@ -165,76 +160,33 @@ ewol::object::Shared<ewol::Resource> ewol::resource::Manager::localKeep(const st
// internal generic keeper ... // internal generic keeper ...
void ewol::resource::Manager::localAdd(const ewol::object::Shared<ewol::Resource>& _object) { void ewol::resource::Manager::localAdd(const ewol::object::Shared<ewol::Resource>& _object) {
//Add ... find empty slot //Add ... find empty slot
for (size_t iii=0; iii<m_resourceList.size(); iii++) { for (auto &it : m_resourceList) {
if (m_resourceList[iii] == nullptr) { if (it == nullptr) {
m_resourceList[iii] = _object; it = _object;
return; return;
} }
} }
// add at the end if no slot is free // add at the end if no slot is free
m_resourceList.push_back(_object); m_resourceList.push_back(_object);
} }
/*
bool ewol::resource::Manager::release(ewol::object::Shared<ewol::Resource> _object) { // in case of error ...
if (nullptr == _object) { bool ewol::resource::Manager::checkResourceToRemove() {
EWOL_ERROR("Try to remove a resource that have null pointer ..."); //EWOL_INFO("remove object in Manager");
return false; m_resourceListToUpdate.clear();
} for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) {
for (size_t iii=0; iii<m_resourceListToUpdate.size(); iii++) { if ((*it) == nullptr) {
if (m_resourceListToUpdate[iii] == _object) { m_resourceList.erase(it);
m_resourceListToUpdate[iii] = nullptr; it = m_resourceList.begin();
//l_resourceListToUpdate.Erase(iii);
}
}
EWOL_VERBOSE("RELEASE (default) : file : \"" << _object->getName() << "\"");
for (int64_t iii=m_resourceList.size()-1; iii >= 0; iii--) {
if (m_resourceList[iii] == nullptr) {
continue; continue;
} }
if(m_resourceList[iii] != _object) { // 1 in object list, 1 in reference active list, and one here
if ((*it)->getRefCount() > 3) {
continue; continue;
} }
if (m_resourceList[iii]->decrement() == true) { m_resourceList.erase(it);
// remove element from the list : it = m_resourceList.begin();
m_resourceList[iii] = nullptr; return true;
// 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 ...
} }
EWOL_ERROR("Can not find the resources in the list : " << (int64_t)_object);
// insidiously remove the pointer for the caller ...
_object = nullptr;
return false; return false;
} }
*/
// in case of error ...
void ewol::resource::Manager::onObjectRemove(const ewol::object::Shared<ewol::Object>& _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;
}
}

View File

@ -9,6 +9,8 @@
#ifndef __RESOURCES_MANAGER_H__ #ifndef __RESOURCES_MANAGER_H__
#define __RESOURCES_MANAGER_H__ #define __RESOURCES_MANAGER_H__
#include <list>
#include <vector>
#include <etk/types.h> #include <etk/types.h>
#include <ewol/debug.h> #include <ewol/debug.h>
#include <ewol/resource/Resource.h> #include <ewol/resource/Resource.h>
@ -16,9 +18,9 @@
namespace ewol { namespace ewol {
namespace resource { namespace resource {
class Manager : private ewol::object::RemoveEvent { class Manager{
private: private:
std::vector<ewol::object::Shared<ewol::Resource>> m_resourceList; std::list<ewol::object::Owner<ewol::Resource>> m_resourceList;
std::vector<ewol::object::Shared<ewol::Resource>> m_resourceListToUpdate; std::vector<ewol::object::Shared<ewol::Resource>> m_resourceListToUpdate;
bool m_contextHasBeenRemoved; bool m_contextHasBeenRemoved;
public: public:
@ -61,8 +63,7 @@ namespace ewol {
// internal API to extent eResources in extern Soft // internal API to extent eResources in extern Soft
ewol::object::Shared<ewol::Resource> localKeep(const std::string& _filename); ewol::object::Shared<ewol::Resource> localKeep(const std::string& _filename);
void localAdd(const ewol::object::Shared<ewol::Resource>& _object); void localAdd(const ewol::object::Shared<ewol::Resource>& _object);
public: // herited function virtual bool checkResourceToRemove();
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
}; };
}; };
}; };

View File

@ -15,19 +15,19 @@
void ewol::Resource::updateContext() { 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() { 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() { 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() { 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() { ewol::resource::Manager& ewol::Resource::getManager() {

View File

@ -25,14 +25,12 @@ namespace ewol {
class Resource : public ewol::Object { class Resource : public ewol::Object {
public: public:
Resource() : Resource() :
m_counter(1),
m_resourceLevel(MAX_RESOURCE_LEVEL-1) { m_resourceLevel(MAX_RESOURCE_LEVEL-1) {
addObjectType("ewol::Resource"); addObjectType("ewol::Resource");
setStatusResource(true); setStatusResource(true);
}; };
Resource(const std::string& _name) : Resource(const std::string& _name) :
ewol::Object(_name), ewol::Object(_name),
m_counter(1),
m_resourceLevel(MAX_RESOURCE_LEVEL-1) { m_resourceLevel(MAX_RESOURCE_LEVEL-1) {
addObjectType("ewol::Resource"); addObjectType("ewol::Resource");
setStatusResource(true); setStatusResource(true);
@ -40,19 +38,6 @@ namespace ewol {
virtual ~Resource() { 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: protected:
uint8_t m_resourceLevel; //!< Level of the resource ==> for updata priority [0..5] 0 must be update first. uint8_t m_resourceLevel; //!< Level of the resource ==> for updata priority [0..5] 0 must be update first.
public: public:

View File

@ -47,7 +47,7 @@ void ewol::widget::Container::subWidgetRemove() {
if (nullptr != m_subWidget) { if (nullptr != m_subWidget) {
m_subWidget->removeUpperWidget(); m_subWidget->removeUpperWidget();
m_subWidget->removeObject(); m_subWidget->removeObject();
m_subWidget=nullptr; m_subWidget.reset();
markToRedraw(); markToRedraw();
requestUpdateSize(); requestUpdateSize();
} }
@ -57,7 +57,7 @@ void ewol::widget::Container::subWidgetUnLink() {
if (nullptr != m_subWidget) { if (nullptr != m_subWidget) {
m_subWidget->removeUpperWidget(); m_subWidget->removeUpperWidget();
} }
m_subWidget=nullptr; m_subWidget.reset();
} }
ewol::object::Shared<ewol::Widget> ewol::widget::Container::getWidgetNamed(const std::string& _widgetName) { ewol::object::Shared<ewol::Widget> ewol::widget::Container::getWidgetNamed(const std::string& _widgetName) {
@ -73,7 +73,7 @@ ewol::object::Shared<ewol::Widget> ewol::widget::Container::getWidgetNamed(const
void ewol::widget::Container::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) { void ewol::widget::Container::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) {
if (m_subWidget == _removeObject) { if (m_subWidget == _removeObject) {
m_subWidget=nullptr; m_subWidget.reset();
markToRedraw(); markToRedraw();
requestUpdateSize(); requestUpdateSize();
} }

View File

@ -45,8 +45,7 @@ void ewol::widget::Container2::subWidgetRemove(int32_t _idWidget) {
if (m_subWidget[_idWidget] != nullptr) { if (m_subWidget[_idWidget] != nullptr) {
EWOL_VERBOSE("Remove widget : " << _idWidget); EWOL_VERBOSE("Remove widget : " << _idWidget);
m_subWidget[_idWidget]->removeUpperWidget(); m_subWidget[_idWidget]->removeUpperWidget();
m_subWidget[_idWidget]->removeObject(); m_subWidget[_idWidget].reset();
m_subWidget[_idWidget] = nullptr;
markToRedraw(); markToRedraw();
requestUpdateSize(); requestUpdateSize();
} }
@ -57,7 +56,7 @@ void ewol::widget::Container2::subWidgetUnLink(int32_t _idWidget) {
m_subWidget[_idWidget]->removeUpperWidget(); m_subWidget[_idWidget]->removeUpperWidget();
EWOL_VERBOSE("Unlink widget : " << _idWidget); EWOL_VERBOSE("Unlink widget : " << _idWidget);
} }
m_subWidget[_idWidget] = nullptr; m_subWidget[_idWidget].resetShared();
} }
ewol::object::Shared<ewol::Widget> ewol::widget::Container2::getWidgetNamed(const std::string& _widgetName) { ewol::object::Shared<ewol::Widget> ewol::widget::Container2::getWidgetNamed(const std::string& _widgetName) {
@ -76,12 +75,12 @@ ewol::object::Shared<ewol::Widget> ewol::widget::Container2::getWidgetNamed(cons
void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) { void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) {
if (m_subWidget[0] == _removeObject) { if (m_subWidget[0] == _removeObject) {
m_subWidget[0] = nullptr; m_subWidget[0].reset();
markToRedraw(); markToRedraw();
requestUpdateSize(); requestUpdateSize();
} }
if (m_subWidget[1] == _removeObject) { if (m_subWidget[1] == _removeObject) {
m_subWidget[1] = nullptr; m_subWidget[1].reset();
markToRedraw(); markToRedraw();
requestUpdateSize(); requestUpdateSize();
} }

View File

@ -114,7 +114,7 @@ void ewol::widget::ContainerN::subWidgetUnLink(ewol::object::Shared<ewol::Widget
} }
void ewol::widget::ContainerN::subWidgetRemoveAll() { void ewol::widget::ContainerN::subWidgetRemoveAll() {
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
it->removeUpperWidget(); it->removeUpperWidget();
} }
@ -128,11 +128,13 @@ void ewol::widget::ContainerN::subWidgetRemoveAllDelayed() {
ewol::object::Shared<ewol::Widget> ewol::widget::ContainerN::getWidgetNamed(const std::string& _widgetName) { ewol::object::Shared<ewol::Widget> ewol::widget::ContainerN::getWidgetNamed(const std::string& _widgetName) {
ewol::object::Shared<ewol::Widget> tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName); ewol::object::Shared<ewol::Widget> tmpUpperWidget = ewol::Widget::getWidgetNamed(_widgetName);
if (nullptr!=tmpUpperWidget) { if (tmpUpperWidget != nullptr) {
return tmpUpperWidget; return tmpUpperWidget;
} }
for (auto it : m_subWidget) { EWOL_ERROR("plop");
if (nullptr != it) { for (auto &it : m_subWidget) {
EWOL_ERROR("plop2");
if (it != nullptr) {
ewol::object::Shared<ewol::Widget> tmpWidget = it->getWidgetNamed(_widgetName); ewol::object::Shared<ewol::Widget> tmpWidget = it->getWidgetNamed(_widgetName);
if (tmpWidget != nullptr) { if (tmpWidget != nullptr) {
return tmpWidget; return tmpWidget;
@ -163,7 +165,7 @@ void ewol::widget::ContainerN::systemDraw(const ewol::DrawProperty& _displayProp
// subwidget draw // subwidget draw
ewol::DrawProperty prop = _displayProp; ewol::DrawProperty prop = _displayProp;
prop.limit(m_origin, m_size); prop.limit(m_origin, m_size);
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
it->systemDraw(prop); it->systemDraw(prop);
} }
@ -172,7 +174,7 @@ void ewol::widget::ContainerN::systemDraw(const ewol::DrawProperty& _displayProp
void ewol::widget::ContainerN::calculateSize(const vec2& _availlable) { void ewol::widget::ContainerN::calculateSize(const vec2& _availlable) {
m_size = _availlable; m_size = _availlable;
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
it->setOrigin(m_origin+m_offset); it->setOrigin(m_origin+m_offset);
it->calculateSize(m_size); it->calculateSize(m_size);
@ -186,7 +188,7 @@ void ewol::widget::ContainerN::calculateMinMaxSize() {
m_minSize.setValue(0,0); m_minSize.setValue(0,0);
m_maxSize.setValue(ULTIMATE_MAX_SIZE,ULTIMATE_MAX_SIZE); m_maxSize.setValue(ULTIMATE_MAX_SIZE,ULTIMATE_MAX_SIZE);
//EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} set min size : " << m_minSize); //EWOL_ERROR("[" << getId() << "] {" << getObjectType() << "} set min size : " << m_minSize);
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
it->calculateMinMaxSize(); it->calculateMinMaxSize();
bvec2 subExpendProp = it->canExpand(); bvec2 subExpendProp = it->canExpand();
@ -205,7 +207,7 @@ void ewol::widget::ContainerN::calculateMinMaxSize() {
} }
void ewol::widget::ContainerN::onRegenerateDisplay() { void ewol::widget::ContainerN::onRegenerateDisplay() {
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
it->onRegenerateDisplay(); it->onRegenerateDisplay();
} }
@ -217,7 +219,7 @@ ewol::object::Shared<ewol::Widget> ewol::widget::ContainerN::getWidgetAtPos(cons
return nullptr; return nullptr;
} }
// for all element in the sizer ... // for all element in the sizer ...
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
vec2 tmpSize = it->getSize(); vec2 tmpSize = it->getSize();
vec2 tmpOrigin = it->getOrigin(); vec2 tmpOrigin = it->getOrigin();

View File

@ -72,16 +72,11 @@ ewol::widget::Manager::~Manager() {
m_creatorList.clear(); m_creatorList.clear();
} }
void ewol::widget::Manager::rm(ewol::object::Shared<ewol::Widget> _newWidget) {
periodicCallRm(_newWidget);
focusRemoveIfRemove(_newWidget);
}
/* ************************************************************************* /* *************************************************************************
* focus Area : * focus Area :
* *************************************************************************/ * *************************************************************************/
void ewol::widget::Manager::focusKeep(ewol::object::Shared<ewol::Widget> _newWidget) { void ewol::widget::Manager::focusKeep(const ewol::object::Shared<ewol::Widget>& _newWidget) {
if (nullptr == _newWidget) { if (nullptr == _newWidget) {
// nothing to do ... // nothing to do ...
return; return;
@ -106,7 +101,7 @@ void ewol::widget::Manager::focusKeep(ewol::object::Shared<ewol::Widget> _newWid
} }
} }
void ewol::widget::Manager::focusSetDefault(ewol::object::Shared<ewol::Widget> _newWidget) { void ewol::widget::Manager::focusSetDefault(const ewol::object::Shared<ewol::Widget>& _newWidget) {
if( nullptr != _newWidget if( nullptr != _newWidget
&& false == _newWidget->canHaveFocus() ) { && false == _newWidget->canHaveFocus() ) {
EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() ); EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() );
@ -143,11 +138,11 @@ void ewol::widget::Manager::focusRelease() {
} }
ewol::object::Shared<ewol::Widget> ewol::widget::Manager::focusGet() { const ewol::object::Shared<ewol::Widget>& ewol::widget::Manager::focusGet() {
return m_focusWidgetCurrent; return m_focusWidgetCurrent;
} }
void ewol::widget::Manager::focusRemoveIfRemove(ewol::object::Shared<ewol::Widget> _newWidget) { void ewol::widget::Manager::focusRemoveIfRemove(const ewol::object::Shared<ewol::Widget>& _newWidget) {
if (m_focusWidgetCurrent == _newWidget) { if (m_focusWidgetCurrent == _newWidget) {
EWOL_WARNING("Release focus when remove widget"); EWOL_WARNING("Release focus when remove widget");
focusRelease(); focusRelease();
@ -158,36 +153,49 @@ void ewol::widget::Manager::focusRemoveIfRemove(ewol::object::Shared<ewol::Widge
} }
} }
void ewol::widget::Manager::periodicCallAdd(ewol::object::Shared<ewol::Widget> _pWidget) { void ewol::widget::Manager::periodicCallAdd(const ewol::object::Shared<ewol::Widget>& _pWidget) {
for (size_t iii=0; iii < m_listOfPeriodicWidget.size(); iii++) { if (_pWidget == nullptr) {
if (m_listOfPeriodicWidget[iii] == _pWidget) { return;
}
m_havePeriodic = true;
for (auto &it : m_listOfPeriodicWidget) {
if (it == _pWidget) {
return; return;
} }
} }
for (size_t iii=0; iii < m_listOfPeriodicWidget.size(); iii++) { for (auto &it : m_listOfPeriodicWidget) {
if (nullptr == m_listOfPeriodicWidget[iii]) { if (it == nullptr) {
m_listOfPeriodicWidget[iii] = _pWidget; it = _pWidget;
return; return;
} }
} }
m_listOfPeriodicWidget.push_back(_pWidget); m_listOfPeriodicWidget.push_back(_pWidget);
m_havePeriodic = true;
} }
void ewol::widget::Manager::periodicCallRm(ewol::object::Shared<ewol::Widget> _pWidget) { void ewol::widget::Manager::periodicCallRm(const ewol::object::Shared<ewol::Widget>& _pWidget) {
for (auto &it : m_listOfPeriodicWidget) {
if (it == _pWidget) {
it.reset();
}
}
periodicCallUpdateCount();
}
void ewol::widget::Manager::periodicCallUpdateCount() {
int32_t nbElement = 0; int32_t nbElement = 0;
for (int32_t iii=m_listOfPeriodicWidget.size()-1; iii >= 0 ; iii--) { for (auto &it : m_listOfPeriodicWidget) {
if (m_listOfPeriodicWidget[iii] == _pWidget) { if (it != nullptr) {
m_listOfPeriodicWidget[iii] = nullptr;
} else {
nbElement++; nbElement++;
} }
} }
if (0 == nbElement) { if (0 == nbElement) {
m_havePeriodic = false; m_havePeriodic = false;
} else {
m_havePeriodic = true;
} }
} }
void ewol::widget::Manager::periodicCallResume(int64_t _localTime) { void ewol::widget::Manager::periodicCallResume(int64_t _localTime) {
m_lastPeriodicCallTime = _localTime; m_lastPeriodicCallTime = _localTime;
} }
@ -285,4 +293,20 @@ std::string ewol::widget::Manager::list() {
return tmpVal; return tmpVal;
} }
void ewol::widget::Manager::onObjectRemove(const ewol::object::Shared<ewol::Object>& _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();
}

View File

@ -14,6 +14,7 @@
#include <vector> #include <vector>
#include <etk/Hash.h> #include <etk/Hash.h>
#include <ewol/widget/Widget.h> #include <ewol/widget/Widget.h>
#include <ewol/object/RemoveEvent.h>
namespace ewol { namespace ewol {
namespace widget { namespace widget {
@ -33,17 +34,15 @@ namespace ewol {
public: public:
Manager(); Manager();
~Manager(); ~Manager();
// need to call when remove a widget to clear all dependency of the focus system
void rm(ewol::object::Shared<ewol::Widget> _newWidget);
void focusKeep(ewol::object::Shared<ewol::Widget> _newWidget); // set the focus at the specific widget void focusKeep(const ewol::object::Shared<ewol::Widget>& _newWidget); // set the focus at the specific widget
void focusSetDefault(ewol::object::Shared<ewol::Widget> _newWidget); // select the default focus getter void focusSetDefault(const ewol::object::Shared<ewol::Widget>& _newWidget); // select the default focus getter
void focusRelease(); // release focus from the current widget to the default void focusRelease(); // release focus from the current widget to the default
ewol::object::Shared<ewol::Widget> focusGet(); const ewol::object::Shared<ewol::Widget>& focusGet();
void focusRemoveIfRemove(ewol::object::Shared<ewol::Widget> _newWidget); void focusRemoveIfRemove(const ewol::object::Shared<ewol::Widget>& _newWidget);
void periodicCallAdd(ewol::object::Shared<ewol::Widget> _pWidget); void periodicCallAdd(const ewol::object::Shared<ewol::Widget>& _pWidget);
void periodicCallRm(ewol::object::Shared<ewol::Widget> _pWidget); void periodicCallRm(const ewol::object::Shared<ewol::Widget>& _pWidget);
void periodicCall(int64_t _localTime); void periodicCall(int64_t _localTime);
void periodicCallResume(int64_t _localTime); void periodicCallResume(int64_t _localTime);
bool periodicCallHave(); bool periodicCallHave();
@ -56,6 +55,9 @@ namespace ewol {
ewol::object::Shared<ewol::Widget> create(const std::string& _name); ewol::object::Shared<ewol::Widget> create(const std::string& _name);
bool exist(const std::string& _name); bool exist(const std::string& _name);
std::string list(); std::string list();
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
private:
void periodicCallUpdateCount();
}; };
}; };
}; };

View File

@ -65,7 +65,7 @@ void ewol::widget::Sizer::calculateSize(const vec2& _availlable) {
float unexpandableSize=0.0; float unexpandableSize=0.0;
int32_t nbWidgetFixedSize=0; int32_t nbWidgetFixedSize=0;
int32_t nbWidgetNotFixedSize=0; int32_t nbWidgetNotFixedSize=0;
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
vec2 tmpSize = it->getCalculateMinSize(); vec2 tmpSize = it->getCalculateMinSize();
if (m_mode == ewol::widget::Sizer::modeVert) { if (m_mode == ewol::widget::Sizer::modeVert) {
@ -99,7 +99,7 @@ void ewol::widget::Sizer::calculateSize(const vec2& _availlable) {
} }
} }
vec2 tmpOrigin = m_origin + tmpBorderSize; vec2 tmpOrigin = m_origin + tmpBorderSize;
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
vec2 tmpSize = it->getCalculateMinSize(); vec2 tmpSize = it->getCalculateMinSize();
// set the origin : // set the origin :
@ -136,7 +136,7 @@ void ewol::widget::Sizer::calculateMinMaxSize() {
vec2 tmpBorderSize = m_borderSize.getPixel(); vec2 tmpBorderSize = m_borderSize.getPixel();
EWOL_VERBOSE("[" << getId() << "] {" << getObjectType() << "} set min size : " << m_minSize); EWOL_VERBOSE("[" << getId() << "] {" << getObjectType() << "} set min size : " << m_minSize);
m_minSize += tmpBorderSize*2; m_minSize += tmpBorderSize*2;
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if (it != nullptr) { if (it != nullptr) {
it->calculateMinMaxSize(); it->calculateMinMaxSize();
if (it->canExpand().x() == true) { if (it->canExpand().x() == true) {

View File

@ -125,7 +125,7 @@ void ewol::widget::WSlider::subWidgetSelectSetVectorId(int32_t _id) {
void ewol::widget::WSlider::subWidgetSelectSet(int32_t _id) { void ewol::widget::WSlider::subWidgetSelectSet(int32_t _id) {
int32_t elementID = 0; int32_t elementID = 0;
// search element in the list : // search element in the list :
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
elementID ++; elementID ++;
if (it != nullptr) { if (it != nullptr) {
if (it->getId() == _id) { if (it->getId() == _id) {
@ -146,7 +146,7 @@ void ewol::widget::WSlider::subWidgetSelectSet(const ewol::object::Shared<ewol::
return; return;
} }
int32_t iii = 0; int32_t iii = 0;
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if ( it != nullptr if ( it != nullptr
&& it == _widgetPointer) { && it == _widgetPointer) {
subWidgetSelectSetVectorId(iii); subWidgetSelectSetVectorId(iii);
@ -163,7 +163,7 @@ void ewol::widget::WSlider::subWidgetSelectSet(const std::string& _widgetName) {
return; return;
} }
int32_t iii = 0; int32_t iii = 0;
for (auto it : m_subWidget) { for (auto &it : m_subWidget) {
if ( it != nullptr if ( it != nullptr
&& it->getName() == _widgetName) { && it->getName() == _widgetName) {
subWidgetSelectSetVectorId(iii); subWidgetSelectSetVectorId(iii);

View File

@ -153,14 +153,13 @@ ewol::Widget::Widget() :
ewol::Widget::~Widget() { ewol::Widget::~Widget() {
// remove his own focus...
getWidgetManager().rm(this);
// clean all the short-cut ... // clean all the short-cut ...
shortCutClean(); shortCutClean();
} }
void ewol::Widget::setUpperWidget(ewol::object::Shared<ewol::Widget> _upper) { void ewol::Widget::setUpperWidget(ewol::object::Shared<ewol::Widget> _upper) {
if (_upper == nullptr) { if (_upper == nullptr) {
EWOL_VERBOSE("[" << getId() << "] remove upper widget");
//just remove father : //just remove father :
m_up.reset(); m_up.reset();
return; return;
@ -172,6 +171,7 @@ void ewol::Widget::setUpperWidget(ewol::object::Shared<ewol::Widget> _upper) {
} }
void ewol::Widget::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) { void ewol::Widget::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
EWOL_VERBOSE("[" << getId() << "] onObjectRemove(" << _object->getId() << ")");
ewol::Object::onObjectRemove(_object); ewol::Object::onObjectRemove(_object);
if (_object == m_up) { if (_object == m_up) {
EWOL_WARNING("[" << getId() << "] remove upper widget before removing this widget ..."); EWOL_WARNING("[" << getId() << "] remove upper widget before removing this widget ...");

View File

@ -699,7 +699,7 @@ namespace ewol {
*/ */
virtual enum ewol::context::cursorDisplay getCursor(); virtual enum ewol::context::cursorDisplay getCursor();
public: // Derived function public: // Derived function
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject); virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
virtual bool loadXML(exml::Element* _node); virtual bool loadXML(exml::Element* _node);
protected: // Derived function protected: // Derived function
virtual bool onSetConfig(const ewol::object::Config& _conf); virtual bool onSetConfig(const ewol::object::Config& _conf);

View File

@ -28,7 +28,6 @@ ewol::widget::Windows::Windows() :
m_colorBg(-1) { m_colorBg(-1) {
addObjectType("ewol::widget::Windows"); addObjectType("ewol::widget::Windows");
setCanHaveFocus(true); setCanHaveFocus(true);
m_subWidget = nullptr;
setDecorationDisable(); setDecorationDisable();
m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:Windows.json"); m_colorProperty = ewol::resource::ColorFile::keep("THEME:COLOR:Windows.json");
if (m_colorProperty != nullptr) { if (m_colorProperty != nullptr) {
@ -45,16 +44,16 @@ ewol::widget::Windows::~Windows() {
void ewol::widget::Windows::calculateSize(const vec2& _availlable) { void ewol::widget::Windows::calculateSize(const vec2& _availlable) {
//EWOL_DEBUG(" _availlable : " << _availlable); //EWOL_DEBUG(" _availlable : " << _availlable);
m_size = _availlable; m_size = _availlable;
if (nullptr != m_subWidget) { if (m_subWidget != nullptr) {
m_subWidget->calculateMinMaxSize(); m_subWidget->calculateMinMaxSize();
// TODO : Check if min size is possible ... // TODO : Check if min size is possible ...
// TODO : Herited from MinSize .. and expand ??? // TODO : Herited from MinSize .. and expand ???
m_subWidget->calculateSize(m_size); m_subWidget->calculateSize(m_size);
} }
for (size_t iii=0; iii<m_popUpWidgetList.size(); iii++) { for (auto &it : m_popUpWidgetList) {
if (nullptr != m_popUpWidgetList[iii]) { if(it != nullptr) {
m_popUpWidgetList[iii]->calculateMinMaxSize(); it->calculateMinMaxSize();
m_popUpWidgetList[iii]->calculateSize(m_size); it->calculateSize(m_size);
} }
} }
} }
@ -64,11 +63,7 @@ ewol::object::Shared<ewol::Widget> ewol::widget::Windows::getWidgetAtPos(const v
vec2 relativePos = relativePosition(_pos); vec2 relativePos = relativePosition(_pos);
// event go directly on the pop-up // event go directly on the pop-up
if (0 < m_popUpWidgetList.size()) { if (0 < m_popUpWidgetList.size()) {
if (nullptr == m_popUpWidgetList[m_popUpWidgetList.size()-1]) { return m_popUpWidgetList.back()->getWidgetAtPos(_pos);
m_popUpWidgetList.pop_back();
} else {
return m_popUpWidgetList[m_popUpWidgetList.size()-1]->getWidgetAtPos(_pos);
}
// otherwise in the normal windows // otherwise in the normal windows
} else if (nullptr != m_subWidget) { } else if (nullptr != m_subWidget) {
return m_subWidget->getWidgetAtPos(_pos); return m_subWidget->getWidgetAtPos(_pos);
@ -113,9 +108,9 @@ void ewol::widget::Windows::onRegenerateDisplay() {
if (nullptr != m_subWidget) { if (nullptr != m_subWidget) {
m_subWidget->onRegenerateDisplay(); m_subWidget->onRegenerateDisplay();
} }
for (size_t iii=0; iii<m_popUpWidgetList.size(); iii++) { for (auto &it : m_popUpWidgetList) {
if (nullptr != m_popUpWidgetList[iii]) { if (it != nullptr) {
m_popUpWidgetList[iii]->onRegenerateDisplay(); it->onRegenerateDisplay();
} }
} }
} }
@ -154,9 +149,9 @@ void ewol::widget::Windows::systemDraw(const ewol::DrawProperty& _displayProp) {
int64_t ___startTime2 = ewol::getTime(); int64_t ___startTime2 = ewol::getTime();
#endif #endif
// second display the pop-up // second display the pop-up
for (size_t iii=0; iii<m_popUpWidgetList.size(); iii++) { for (auto &it : m_popUpWidgetList) {
if (nullptr != m_popUpWidgetList[iii]) { if (it != nullptr) {
m_popUpWidgetList[iii]->systemDraw(_displayProp); it->systemDraw(_displayProp);
//EWOL_DEBUG("Draw Pop-up"); //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<ewol::Widget> _widget) { void ewol::widget::Windows::setSubWidget(ewol::object::Shared<ewol::Widget> _widget) {
if (m_subWidget != nullptr) { if (m_subWidget != nullptr) {
EWOL_INFO("Remove current main windows Widget..."); EWOL_INFO("Remove current main windows Widget...");
m_subWidget->removeUpperWidget();
m_subWidget.reset(); m_subWidget.reset();
} }
m_subWidget = _widget; if (_widget != nullptr) {
m_subWidget = _widget;
m_subWidget->setUpperWidget(this);
}
// Regenerate the size calculation : // Regenerate the size calculation :
calculateSize(m_size); calculateSize(m_size);
} }
@ -183,6 +183,7 @@ void ewol::widget::Windows::popUpWidgetPush(ewol::object::Shared<ewol::Widget> _
return; return;
} }
m_popUpWidgetList.push_back(_widget); m_popUpWidgetList.push_back(_widget);
_widget->setUpperWidget(this);
// force the focus on the basic widget ==> this remove many time the virual keyboard area // force the focus on the basic widget ==> this remove many time the virual keyboard area
_widget->keepFocus(); _widget->keepFocus();
// Regenerate the size calculation : // Regenerate the size calculation :
@ -195,11 +196,8 @@ void ewol::widget::Windows::popUpWidgetPop() {
if (m_popUpWidgetList.size() == 0) { if (m_popUpWidgetList.size() == 0) {
return; return;
} }
ewol::object::Shared<ewol::Widget> widget = m_popUpWidgetList[m_popUpWidgetList.size()-1]; m_popUpWidgetList.back()->removeUpperWidget();
if (widget == nullptr) { m_popUpWidgetList.pop_back();
return;
}
widget->removeObject();
} }
void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) { void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) {
@ -209,13 +207,13 @@ void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared<ewol::Obje
if (m_subWidget == _removeObject) { if (m_subWidget == _removeObject) {
EWOL_DEBUG("Remove main element of the windows == > destroyed object"); EWOL_DEBUG("Remove main element of the windows == > destroyed object");
m_subWidget = nullptr; m_subWidget.reset();
} }
for(int32_t iii=m_popUpWidgetList.size()-1; iii >= 0; --iii) { for (auto it(m_popUpWidgetList.begin()) ; it != m_popUpWidgetList.end() ; ++it) {
if(m_popUpWidgetList[iii] == _removeObject) { if(*it == _removeObject) {
EWOL_DEBUG("Remove Pop-up [" << iii << "] element of the windows == > destroyed object"); EWOL_DEBUG("Remove Pop-up element of the windows == > destroyed object");
m_popUpWidgetList[iii] = nullptr; m_popUpWidgetList.erase(it);
m_popUpWidgetList.erase(m_popUpWidgetList.begin()+iii); it = m_popUpWidgetList.begin();
} }
} }
} }

View File

@ -14,6 +14,7 @@
#include <ewol/widget/Widget.h> #include <ewol/widget/Widget.h>
#include <etk/Color.h> #include <etk/Color.h>
#include <ewol/resource/ColorFile.h> #include <ewol/resource/ColorFile.h>
#include <list>
namespace ewol { namespace ewol {
namespace widget { namespace widget {
@ -57,7 +58,7 @@ namespace ewol {
} }
private: private:
ewol::object::Owner<ewol::Widget> m_subWidget; ewol::object::Owner<ewol::Widget> m_subWidget;
std::vector<ewol::object::Owner<ewol::Widget>> m_popUpWidgetList; std::list<ewol::object::Owner<ewol::Widget>> m_popUpWidgetList;
public: public:
void setSubWidget(ewol::object::Shared<ewol::Widget> _widget); void setSubWidget(ewol::object::Shared<ewol::Widget> _widget);
void popUpWidgetPush(ewol::object::Shared<ewol::Widget> _widget); void popUpWidgetPush(ewol::object::Shared<ewol::Widget> _widget);