[DEV] shared system work corectly with simple example

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

View File

@ -288,6 +288,7 @@ void ewol::Context::setArchiveDir(int _mode, const char* _str) {
ewol::Context::Context(int32_t _argc, const char* _argv[]) :
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() {

View File

@ -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
*/

View File

@ -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() {

View File

@ -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 ...
*/

View File

@ -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);
}
}

View File

@ -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;
/**

View File

@ -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());
}
}
}

View File

@ -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 ...

View File

@ -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>

View File

@ -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);
}

View File

@ -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>

View File

@ -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;
}
}

View File

@ -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();
};
};
};

View File

@ -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() {

View File

@ -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:

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();

View File

@ -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();
}

View File

@ -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();
};
};
};

View File

@ -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) {

View File

@ -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);

View File

@ -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 ...");

View File

@ -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);

View File

@ -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();
}
}
}

View File

@ -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);