[DEV] shared system work corectly with simple example
This commit is contained in:
parent
49c3036080
commit
a1d0185f19
@ -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<ewol::Object>& _removeObject) {
|
||||
void ewol::Context::onObjectRemove(const ewol::object::Shared<ewol::Object>& _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() {
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <ewol/context/commandLine.h>
|
||||
#include <ewol/context/InputManager.h>
|
||||
#include <ewol/context/Fps.h>
|
||||
#include <ewol/object/RemoveEvent.h>
|
||||
|
||||
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<ewol::Object>& _removeObject);
|
||||
|
||||
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
|
||||
public:
|
||||
/**
|
||||
* @brief reset event management for the IO like Input ou Mouse or keyborad
|
||||
*/
|
||||
|
@ -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<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++) {
|
||||
if (m_eventInputSaved[iii].curentWidgetEvent == removeObject) {
|
||||
if (m_eventInputSaved[iii].curentWidgetEvent == _object) {
|
||||
// remove the property of this input ...
|
||||
EWOL_VERBOSE("Remove object ==> 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() {
|
||||
|
@ -10,6 +10,7 @@
|
||||
#define __EWOL_SYSTEM_INPUT_H__
|
||||
|
||||
#include <ewol/widget/Widget.h>
|
||||
#include <ewol/object/RemoveEvent.h>
|
||||
|
||||
#define MAX_MANAGE_INPUT (15)
|
||||
|
||||
@ -24,7 +25,7 @@ namespace ewol {
|
||||
bool isUsed;
|
||||
int32_t destinationInputId;
|
||||
int64_t lastTimeEvent;
|
||||
ewol::object::Shared<ewol::Widget> curentWidgetEvent;
|
||||
ewol::object::Shared<ewol::Widget> 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<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 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<ewol::Object>& _removeObject);
|
||||
void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
|
||||
public:
|
||||
/**
|
||||
* @brief a new layer on the windows is set == > might remove all the property of the current element ...
|
||||
*/
|
||||
|
@ -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<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) {
|
||||
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<ewol::Object>& _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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,14 +15,16 @@
|
||||
#include <ewol/object/RemoveEvent.h>
|
||||
|
||||
namespace ewol {
|
||||
class Context;
|
||||
namespace object {
|
||||
class Manager {
|
||||
private:
|
||||
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_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;
|
||||
/**
|
||||
|
@ -22,23 +22,35 @@ size_t ewol::Object::m_valUID = 0;
|
||||
|
||||
void ewol::Object::objRefCountIncrement() {
|
||||
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++;
|
||||
}
|
||||
|
||||
void ewol::Object::objRefCountDecrement() {
|
||||
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--;
|
||||
}
|
||||
|
||||
void ewol::Object::operator delete(void* _ptr, std::size_t _sz) {
|
||||
EWOL_DEBUG("custom delete for size " << _sz);
|
||||
ewol::object::Shared<ewol::Object> 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<std::mutex> 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<m_externEvent.size(); ++iii) {
|
||||
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) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,8 +14,8 @@
|
||||
#include <vector>
|
||||
#include <exml/exml.h>
|
||||
#include <mutex>
|
||||
#include <ewol/object/Owner.h>
|
||||
#include <ewol/object/Shared.h>
|
||||
#include <ewol/object/Owner.h>
|
||||
|
||||
namespace ewol {
|
||||
// some class need to define element befor other ...
|
||||
|
@ -44,7 +44,20 @@ namespace ewol {
|
||||
m_pointer = _obj.m_pointer;
|
||||
_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) {
|
||||
return *this;
|
||||
}
|
||||
@ -55,35 +68,50 @@ namespace ewol {
|
||||
}
|
||||
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() {
|
||||
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<T>() 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<T2>& _obj2) noexcept {
|
||||
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
|
||||
template<typename T, typename T2>
|
||||
@ -145,17 +198,23 @@ namespace ewol {
|
||||
return _obj.get() != nullptr;
|
||||
}
|
||||
//! @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;
|
||||
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();
|
||||
}
|
||||
/*
|
||||
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();
|
||||
object::Shared<T> operator=(const object::Owner<T2>& _obj) {
|
||||
return _obj.get();
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//! @not in doc
|
||||
template<typename T>
|
||||
|
@ -7,11 +7,17 @@
|
||||
*/
|
||||
|
||||
#include <ewol/object/RemoveEvent.h>
|
||||
#include <ewol/context/Context.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -32,15 +32,6 @@ namespace ewol {
|
||||
~Shared() {
|
||||
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
|
||||
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<T>& _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<T>() const noexcept {
|
||||
return m_pointer;
|
||||
}
|
||||
template<typename T2> operator ewol::object::Shared<T2>() const noexcept {
|
||||
return m_pointer;
|
||||
}
|
||||
@ -146,16 +130,6 @@ namespace ewol {
|
||||
inline bool operator==(const T* _obj, const object::Shared<T2>& _obj2) noexcept {
|
||||
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>
|
||||
@ -184,16 +158,6 @@ namespace ewol {
|
||||
inline bool operator!=(const T* _obj, const object::Shared<T2>& _obj2) noexcept {
|
||||
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>
|
||||
|
@ -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<MAX_RESOURCE_LEVEL; jjj++) {
|
||||
EWOL_INFO(" Reload level : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1));
|
||||
for (int64_t iii=m_resourceList.size()-1; iii >= 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<ewol::Resource>& _object) {
|
||||
// chek if not added before
|
||||
for (size_t iii=0; iii<m_resourceListToUpdate.size(); iii++) {
|
||||
if (m_resourceListToUpdate[iii] != nullptr) {
|
||||
if (m_resourceListToUpdate[iii] == _object) {
|
||||
// just prevent some double add ...
|
||||
return;
|
||||
}
|
||||
for (auto &it : m_resourceListToUpdate) {
|
||||
if ( it != nullptr
|
||||
&& it == _object) {
|
||||
// just prevent some double add ...
|
||||
return;
|
||||
}
|
||||
}
|
||||
// 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
|
||||
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; jjj<MAX_RESOURCE_LEVEL; jjj++) {
|
||||
EWOL_INFO(" updateContext level (D) : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1));
|
||||
for (size_t iii=0; iii<m_resourceList.size(); iii++) {
|
||||
if(m_resourceList[iii] != nullptr) {
|
||||
if (jjj == m_resourceList[iii]->getResourceLevel()) {
|
||||
//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; jjj<MAX_RESOURCE_LEVEL; jjj++) {
|
||||
EWOL_INFO(" updateContext level (U) : " << jjj << "/" << (MAX_RESOURCE_LEVEL-1));
|
||||
for (size_t iii=0; iii<m_resourceListToUpdate.size(); iii++) {
|
||||
if(m_resourceListToUpdate[iii] != nullptr) {
|
||||
if (jjj == m_resourceListToUpdate[iii]->getResourceLevel()) {
|
||||
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; iii<m_resourceList.size(); iii++) {
|
||||
if (m_resourceList[iii] != nullptr) {
|
||||
m_resourceList[iii]->removeContextToLate();
|
||||
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> ewol::resource::Manager::localKeep(const std::string& _filename) {
|
||||
EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\"");
|
||||
for (size_t iii=0; iii<m_resourceList.size(); iii++) {
|
||||
if (m_resourceList[iii] != nullptr) {
|
||||
if(m_resourceList[iii]->getName() == _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> ewol::resource::Manager::localKeep(const st
|
||||
// internal generic keeper ...
|
||||
void ewol::resource::Manager::localAdd(const ewol::object::Shared<ewol::Resource>& _object) {
|
||||
//Add ... find empty slot
|
||||
for (size_t iii=0; iii<m_resourceList.size(); iii++) {
|
||||
if (m_resourceList[iii] == nullptr) {
|
||||
m_resourceList[iii] = _object;
|
||||
for (auto &it : m_resourceList) {
|
||||
if (it == nullptr) {
|
||||
it = _object;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// add at the end if no slot is free
|
||||
m_resourceList.push_back(_object);
|
||||
}
|
||||
/*
|
||||
bool ewol::resource::Manager::release(ewol::object::Shared<ewol::Resource> _object) {
|
||||
if (nullptr == _object) {
|
||||
EWOL_ERROR("Try to remove a resource that have null pointer ...");
|
||||
return false;
|
||||
}
|
||||
for (size_t iii=0; iii<m_resourceListToUpdate.size(); iii++) {
|
||||
if (m_resourceListToUpdate[iii] == _object) {
|
||||
m_resourceListToUpdate[iii] = nullptr;
|
||||
//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) {
|
||||
|
||||
// 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<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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -9,6 +9,8 @@
|
||||
#ifndef __RESOURCES_MANAGER_H__
|
||||
#define __RESOURCES_MANAGER_H__
|
||||
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <etk/types.h>
|
||||
#include <ewol/debug.h>
|
||||
#include <ewol/resource/Resource.h>
|
||||
@ -16,9 +18,9 @@
|
||||
|
||||
namespace ewol {
|
||||
namespace resource {
|
||||
class Manager : private ewol::object::RemoveEvent {
|
||||
class Manager{
|
||||
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;
|
||||
bool m_contextHasBeenRemoved;
|
||||
public:
|
||||
@ -61,8 +63,7 @@ namespace ewol {
|
||||
// internal API to extent eResources in extern Soft
|
||||
ewol::object::Shared<ewol::Resource> localKeep(const std::string& _filename);
|
||||
void localAdd(const ewol::object::Shared<ewol::Resource>& _object);
|
||||
public: // herited function
|
||||
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
|
||||
virtual bool checkResourceToRemove();
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -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() {
|
||||
|
@ -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:
|
||||
|
@ -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> 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) {
|
||||
if (m_subWidget == _removeObject) {
|
||||
m_subWidget=nullptr;
|
||||
m_subWidget.reset();
|
||||
markToRedraw();
|
||||
requestUpdateSize();
|
||||
}
|
||||
|
@ -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> 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) {
|
||||
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();
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ void ewol::widget::ContainerN::subWidgetUnLink(ewol::object::Shared<ewol::Widget
|
||||
}
|
||||
|
||||
void ewol::widget::ContainerN::subWidgetRemoveAll() {
|
||||
for (auto it : m_subWidget) {
|
||||
for (auto &it : m_subWidget) {
|
||||
if (it != nullptr) {
|
||||
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> 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<ewol::Widget> 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> 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();
|
||||
|
@ -72,16 +72,11 @@ ewol::widget::Manager::~Manager() {
|
||||
m_creatorList.clear();
|
||||
}
|
||||
|
||||
void ewol::widget::Manager::rm(ewol::object::Shared<ewol::Widget> _newWidget) {
|
||||
periodicCallRm(_newWidget);
|
||||
focusRemoveIfRemove(_newWidget);
|
||||
}
|
||||
|
||||
/* *************************************************************************
|
||||
* 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) {
|
||||
// nothing to do ...
|
||||
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
|
||||
&& 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> ewol::widget::Manager::focusGet() {
|
||||
const ewol::object::Shared<ewol::Widget>& ewol::widget::Manager::focusGet() {
|
||||
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) {
|
||||
EWOL_WARNING("Release focus when remove widget");
|
||||
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) {
|
||||
for (size_t iii=0; iii < m_listOfPeriodicWidget.size(); iii++) {
|
||||
if (m_listOfPeriodicWidget[iii] == _pWidget) {
|
||||
void ewol::widget::Manager::periodicCallAdd(const ewol::object::Shared<ewol::Widget>& _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<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;
|
||||
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<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();
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <vector>
|
||||
#include <etk/Hash.h>
|
||||
#include <ewol/widget/Widget.h>
|
||||
#include <ewol/object/RemoveEvent.h>
|
||||
|
||||
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<ewol::Widget> _newWidget);
|
||||
|
||||
void focusKeep(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 focusKeep(const ewol::object::Shared<ewol::Widget>& _newWidget); // set the focus at the specific widget
|
||||
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
|
||||
ewol::object::Shared<ewol::Widget> focusGet();
|
||||
void focusRemoveIfRemove(ewol::object::Shared<ewol::Widget> _newWidget);
|
||||
const ewol::object::Shared<ewol::Widget>& focusGet();
|
||||
void focusRemoveIfRemove(const ewol::object::Shared<ewol::Widget>& _newWidget);
|
||||
|
||||
void periodicCallAdd(ewol::object::Shared<ewol::Widget> _pWidget);
|
||||
void periodicCallRm(ewol::object::Shared<ewol::Widget> _pWidget);
|
||||
void periodicCallAdd(const ewol::object::Shared<ewol::Widget>& _pWidget);
|
||||
void periodicCallRm(const ewol::object::Shared<ewol::Widget>& _pWidget);
|
||||
void periodicCall(int64_t _localTime);
|
||||
void periodicCallResume(int64_t _localTime);
|
||||
bool periodicCallHave();
|
||||
@ -56,6 +55,9 @@ namespace ewol {
|
||||
ewol::object::Shared<ewol::Widget> create(const std::string& _name);
|
||||
bool exist(const std::string& _name);
|
||||
std::string list();
|
||||
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
|
||||
private:
|
||||
void periodicCallUpdateCount();
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -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) {
|
||||
|
@ -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::Shared<ewol::
|
||||
return;
|
||||
}
|
||||
int32_t iii = 0;
|
||||
for (auto it : m_subWidget) {
|
||||
for (auto &it : m_subWidget) {
|
||||
if ( it != nullptr
|
||||
&& it == _widgetPointer) {
|
||||
subWidgetSelectSetVectorId(iii);
|
||||
@ -163,7 +163,7 @@ void ewol::widget::WSlider::subWidgetSelectSet(const std::string& _widgetName) {
|
||||
return;
|
||||
}
|
||||
int32_t iii = 0;
|
||||
for (auto it : m_subWidget) {
|
||||
for (auto &it : m_subWidget) {
|
||||
if ( it != nullptr
|
||||
&& it->getName() == _widgetName) {
|
||||
subWidgetSelectSetVectorId(iii);
|
||||
|
@ -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<ewol::Widget> _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<ewol::Widget> _upper) {
|
||||
}
|
||||
|
||||
void ewol::Widget::onObjectRemove(const ewol::object::Shared<ewol::Object>& _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 ...");
|
||||
|
@ -699,7 +699,7 @@ namespace ewol {
|
||||
*/
|
||||
virtual enum ewol::context::cursorDisplay getCursor();
|
||||
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);
|
||||
protected: // Derived function
|
||||
virtual bool onSetConfig(const ewol::object::Config& _conf);
|
||||
|
@ -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; iii<m_popUpWidgetList.size(); iii++) {
|
||||
if (nullptr != m_popUpWidgetList[iii]) {
|
||||
m_popUpWidgetList[iii]->calculateMinMaxSize();
|
||||
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> 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; iii<m_popUpWidgetList.size(); iii++) {
|
||||
if (nullptr != m_popUpWidgetList[iii]) {
|
||||
m_popUpWidgetList[iii]->onRegenerateDisplay();
|
||||
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; iii<m_popUpWidgetList.size(); iii++) {
|
||||
if (nullptr != m_popUpWidgetList[iii]) {
|
||||
m_popUpWidgetList[iii]->systemDraw(_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<ewol::Widget> _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<ewol::Widget> _
|
||||
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<ewol::Widget> 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<ewol::Object>& _removeObject) {
|
||||
@ -209,13 +207,13 @@ void ewol::widget::Windows::onObjectRemove(const ewol::object::Shared<ewol::Obje
|
||||
|
||||
if (m_subWidget == _removeObject) {
|
||||
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) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <ewol/widget/Widget.h>
|
||||
#include <etk/Color.h>
|
||||
#include <ewol/resource/ColorFile.h>
|
||||
#include <list>
|
||||
|
||||
namespace ewol {
|
||||
namespace widget {
|
||||
@ -57,7 +58,7 @@ namespace ewol {
|
||||
}
|
||||
private:
|
||||
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:
|
||||
void setSubWidget(ewol::object::Shared<ewol::Widget> _widget);
|
||||
void popUpWidgetPush(ewol::object::Shared<ewol::Widget> _widget);
|
||||
|
Loading…
x
Reference in New Issue
Block a user