[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[]) :
|
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() {
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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() {
|
||||||
|
@ -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 ...
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
/**
|
/**
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 ...
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -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);
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -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() {
|
||||||
|
@ -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:
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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 ...");
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user