[DEV] seem to work, but the result is really bad ...

This commit is contained in:
Edouard DUPIN 2014-05-26 21:33:17 +02:00
parent 3c52398511
commit c2eb3c1467
14 changed files with 102 additions and 62 deletions

View File

@ -387,12 +387,17 @@ ewol::Context::~Context() {
do {
m_objectManager.removeAllRemovedObject();
} while (m_resourceManager.checkResourceToRemove() == true);
m_objectManager.displayListObject();
// call application to uninit
APP_UnInit(*this);
// unset all windows
// clean all messages
m_msgSystem.clean();
// an other cycle of removing ...
do {
m_objectManager.removeAllRemovedObject();
} while (m_resourceManager.checkResourceToRemove() == true);
EWOL_INFO("List of all widget of this context must be equal at 0 ==> otherwise some remove is missing");
m_objectManager.displayListObject();
// Resource is an lower element as objects ...
m_resourceManager.unInit();
// now All must be removed !!!

View File

@ -9,6 +9,7 @@
#include <ewol/object/Manager.h>
#include <ewol/context/Context.h>
#include <ewol/ewol.h>
#include <etk/stdTools.h>
#include <unistd.h>
#undef __class__
@ -36,8 +37,9 @@ ewol::object::Manager::~Manager() {
}
void ewol::object::Manager::displayListObject() {
EWOL_INFO("List loaded object : ");
for (auto &it : m_eObjectList) {
EWOL_ERROR("List object : " << it->getName() << " : " << it->getTypeDescription() << " nb ref=" << it->getRefCount());
EWOL_INFO(" Ref=" << it->getRefCount() << " remove=" << it->isDestroyed() << " name='" << it->getName() << "' type=" << it->getObjectType());
}
}
@ -54,9 +56,11 @@ void ewol::object::Manager::unInit() {
if (m_eObjectListActive.size() != 0) {
EWOL_ERROR("Have " << m_eObjectListActive.size() << " active Object");
}
m_multiCast.clear();
m_eObjectListActive.clear();
m_eObjectList.clear();
removeAllRemovedObject();
}
void ewol::object::Manager::add(const ewol::object::Shared<ewol::Object>& _object) {
@ -75,12 +79,13 @@ 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());
EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << it->getId() << " type=" << it->getObjectType() << " name='" << it->getName() << "'");
it->onObjectRemove(_object);
}
}
// inform context that n object is removed ...
m_context.onObjectRemove(_object);
m_multiCast.onObjectRemove(_object);
EWOL_VERBOSE("m_removeEventList.size() = " << m_removeEventList.size());
for (auto &it : m_removeEventList) {
EWOL_VERBOSE("[" << _object->getId() << "] Inform Event Remove Object List : ...");
@ -107,15 +112,18 @@ void ewol::object::Manager::remove(const ewol::object::Shared<ewol::Object>& _ob
EWOL_ERROR("Try to Auto-Remove (nullptr) Object");
return;
}
for (int64_t iii = (int64_t)m_eObjectListActive.size()-1; iii>=0; --iii) {
if (m_eObjectListActive[iii] == _object) {
auto it(m_eObjectListActive.begin());
while (it != m_eObjectListActive.end()) {
if (*it == _object) {
m_eObjectListActive.erase(it);
// remove Element
EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "'");
EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "' name=" << _object->getName());
informOneObjectIsRemoved(_object);
ewol::getContext().forceRedrawAll();
EWOL_DEBUG("Auto-Remove Object ... done (have " << _object->getRefCount() << " references)");
m_eObjectListActive.erase(m_eObjectListActive.begin()+iii);
return;
it = m_eObjectListActive.begin();
} else {
++it;
}
}
EWOL_ERROR("Try to Auto-Remove Object that is not referenced ...");
@ -124,20 +132,15 @@ 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_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;
auto it(m_eObjectList.begin());
while (it != m_eObjectList.end()) {
if ( *it != nullptr
&& (*it)->getRefCount() <= 1) {
EWOL_DEBUG("remove definitly : [" << (*it)->getId() << "] type='" << (*it)->getObjectType() << "'");
m_eObjectList.erase(it);
it = m_eObjectList.begin();
} else {
++it;
}
}
}
@ -146,11 +149,10 @@ ewol::object::Shared<ewol::Object> ewol::object::Manager::get(const std::string&
if (_name == "") {
return nullptr;
}
for (size_t iii=0; iii<m_eObjectList.size(); iii++) {
if (m_eObjectList[iii] != nullptr) {
if (m_eObjectList[iii]->getName() == _name) {
return m_eObjectList[iii];
}
for (auto &it : m_eObjectList) {
if ( it != nullptr
&& it->getName() == _name) {
return it;
}
}
return nullptr;

View File

@ -23,6 +23,22 @@ ewol::object::MultiCast::~MultiCast() {
m_messageList.clear();
}
void ewol::object::MultiCast::clear() {
EWOL_INFO("EObject message Multi-Cast");
m_messageList.clear();
}
void ewol::object::MultiCast::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
auto it(m_messageList.begin());
while (it != m_messageList.end()) {
if (it->m_object == _object) {
m_messageList.erase(it);
it = m_messageList.begin();
} else {
++it;
}
}
}
void ewol::object::MultiCast::add(const ewol::object::Shared<ewol::Object>& _object, const char* const _message) {
if (nullptr == _object) {
@ -44,12 +60,14 @@ void ewol::object::MultiCast::rm(const ewol::object::Shared<ewol::Object>& _obje
return;
}
// send the message at all registered widget ...
for (int32_t iii=m_messageList.size()-1; iii >= 0; iii--) {
if(m_messageList[iii].m_object == _object) {
auto it(m_messageList.begin());
while (it != m_messageList.end()) {
if(it->m_object == _object) {
EWOL_DEBUG("SendMulticast RM listener :" << _object->getId());
m_messageList[iii].m_message = nullptr;
m_messageList[iii].m_object = nullptr;
m_messageList.erase(m_messageList.begin()+iii);
m_messageList.erase(it);
it = m_messageList.begin();
} else {
++it;
}
}
}
@ -58,15 +76,14 @@ void ewol::object::MultiCast::send(const ewol::object::Shared<ewol::Object>& _ob
EWOL_VERBOSE("SendMulticast message \"" << _message << "\" data=\"" << _data << "\" to :");
// send the message at all registered widget ...
for (size_t iii=0; iii<m_messageList.size(); iii++) {
if( m_messageList[iii].m_message == _message
&& m_messageList[iii].m_object != _object)
{
if (nullptr != m_messageList[iii].m_object) {
EWOL_VERBOSE(" id = " << m_messageList[iii].m_object->getId() << " type=" << m_messageList[iii].m_object->getObjectType());
for (auto &it : m_messageList) {
if( it.m_message == _message
&& it.m_object != _object) {
if (it.m_object != nullptr) {
EWOL_VERBOSE(" id = " << it.m_object->getId() << " type=" << it.m_object->getObjectType());
// generate event ... (create message before ...
ewol::object::Message tmpMsg(_object, m_messageList[iii].m_message, _data);
m_messageList[iii].m_object->onReceiveMessage(tmpMsg);
ewol::object::Message tmpMsg(_object, it.m_message, _data);
it.m_object->onReceiveMessage(tmpMsg);
}
}
}

View File

@ -33,12 +33,14 @@ namespace ewol {
public:
MultiCast();
~MultiCast();
void clear();
void anonymousSend(const char* const _messageId, const std::string& _data) {
send(nullptr, _messageId, _data);
};
void send(const ewol::object::Shared<ewol::Object>& _object, const char* const _message, const std::string& _data);
void rm(const ewol::object::Shared<ewol::Object>& _object);
void add(const ewol::object::Shared<ewol::Object>& _object, const char* const _message);
void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
};
};
};

View File

@ -61,7 +61,7 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) {
}
void ewol::Object::autoDestroy() {
EWOL_VERBOSE("Destroy object : [" << getId() << "] type:" << getTypeDescription());
EWOL_VERBOSE("Destroy object : [" << getId() << "] type:" << getObjectType());
{
std::unique_lock<std::mutex> lock(m_lockRefCount);
if (m_isDestroyed == true) {

View File

@ -100,11 +100,17 @@ namespace ewol {
* @brief Asynchronous removing the object
*/
void removeObject();
public:
/**
* @brief Respown a removed object
*/
void respownObject();
/**
* @brief Get if the element is destroyed or not
* @return true The element in destroyed
*/
bool isDestroyed() {
return m_isDestroyed;
}
private:
std::vector<const char*> m_listType;
public:

View File

@ -40,13 +40,15 @@ void ewol::resource::Manager::unInit() {
display();
m_resourceListToUpdate.clear();
// remove all resources ...
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();
auto it(m_resourceList.begin());
while(it != m_resourceList.end()) {
if ((*it) != nullptr) {
EWOL_WARNING("Find a resource that is not removed : [" << (*it)->getId() << "]"
<< "=\"" << (*it)->getName() << "\" "
<< (*it)->getRefCount() << " elements");
}
m_resourceList.erase(it);
it = m_resourceList.begin();
}
m_resourceList.clear();
}

View File

@ -71,8 +71,9 @@ ewol::object::Shared<ewol::Widget> ewol::widget::Container::getWidgetNamed(const
return nullptr;
}
void ewol::widget::Container::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) {
if (m_subWidget == _removeObject) {
void ewol::widget::Container::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
ewol::Widget::onObjectRemove(_object);
if (m_subWidget == _object) {
m_subWidget.reset();
markToRedraw();
requestUpdateSize();

View File

@ -54,7 +54,7 @@ namespace ewol {
public: // Derived function
virtual void systemDraw(const ewol::DrawProperty& _displayProp);
virtual void onRegenerateDisplay();
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
virtual void calculateSize(const vec2& _availlable);
virtual void calculateMinMaxSize();
virtual ewol::object::Shared<ewol::Widget> getWidgetAtPos(const vec2& _pos);

View File

@ -73,13 +73,14 @@ ewol::object::Shared<ewol::Widget> ewol::widget::Container2::getWidgetNamed(cons
return nullptr;
}
void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) {
if (m_subWidget[0] == _removeObject) {
void ewol::widget::Container2::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
ewol::Widget::onObjectRemove(_object);
if (m_subWidget[0] == _object) {
m_subWidget[0].reset();
markToRedraw();
requestUpdateSize();
}
if (m_subWidget[1] == _removeObject) {
if (m_subWidget[1] == _object) {
m_subWidget[1].reset();
markToRedraw();
requestUpdateSize();

View File

@ -152,7 +152,7 @@ namespace ewol {
public: // Derived function
virtual void systemDraw(const ewol::DrawProperty& _displayProp);
virtual void onRegenerateDisplay();
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
virtual void calculateSize(const vec2& _availlable) {
calculateSizePadded(_availlable);
}

View File

@ -142,13 +142,17 @@ ewol::object::Shared<ewol::Widget> ewol::widget::ContainerN::getWidgetNamed(cons
return nullptr;
}
void ewol::widget::ContainerN::onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject) {
void ewol::widget::ContainerN::onObjectRemove(const ewol::object::Shared<ewol::Object>& _object) {
// First step call parrent :
ewol::Widget::onObjectRemove(_removeObject);
ewol::Widget::onObjectRemove(_object);
// second step find if in all the elements ...
for (auto it(m_subWidget.begin()) ; it != m_subWidget.end() ; ++it) {
if(*it == _removeObject) {
auto it(m_subWidget.begin());
while (it != m_subWidget.end()) {
if(*it == _object) {
m_subWidget.erase(it);
it = m_subWidget.begin();
} else {
++it;
}
}
}

View File

@ -89,7 +89,7 @@ namespace ewol {
public:// Derived function
virtual void systemDraw(const ewol::DrawProperty& _displayProp);
virtual void onRegenerateDisplay();
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _removeObject);
virtual void onObjectRemove(const ewol::object::Shared<ewol::Object>& _object);
virtual void calculateSize(const vec2& _availlable);
virtual void calculateMinMaxSize();
virtual ewol::object::Shared<ewol::Widget> getWidgetAtPos(const vec2& _pos);

View File

@ -366,6 +366,6 @@ void ewol::widget::Gird::onObjectRemove(const ewol::object::Shared<ewol::Object>
}
}
if (m_tmpWidget == _removeObject) {
m_tmpWidget = nullptr;
m_tmpWidget.reset();
}
}