[DEV] run with no error ==> have many small error that thing not work compleately

This commit is contained in:
Edouard DUPIN 2014-08-08 21:39:25 +02:00
parent e3305c3757
commit 4b8c98c110
9 changed files with 72 additions and 158 deletions

View File

@ -388,18 +388,15 @@ ewol::Context::~Context() {
// 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.cleanInternalRemoved();
// call application to uninit
m_application->unInit(*this);
m_application.reset();
// clean all messages
m_msgSystem.clean();
// an other cycle of removing ...
do {
m_objectManager.removeAllRemovedObject();
} while (m_resourceManager.checkResourceToRemove() == true);
// internal clean elements
m_objectManager.cleanInternalRemoved();
m_resourceManager.cleanInternalRemoved();
EWOL_INFO("List of all widget of this context must be equal at 0 ==> otherwise some remove is missing");
m_objectManager.displayListObject();
@ -667,9 +664,8 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) {
m_resourceManager.updateContext();
// release open GL Context
ewol::openGL::unLock();
do {
m_objectManager.removeAllRemovedObject();
} while (m_resourceManager.checkResourceToRemove() == true);
m_objectManager.cleanInternalRemoved();
m_resourceManager.cleanInternalRemoved();
// release the curent interface :
unLockContext();
}
@ -683,8 +679,7 @@ void ewol::Context::onObjectRemove(const std::shared_ptr<ewol::Object>& _object)
}
// inform all manager that can not be directly linked with the object manager
m_input.onObjectRemove(_object);
m_widgetManager.onObjectRemove(_object);
m_resourceManager.checkResourceToRemove();
m_resourceManager.cleanInternalRemoved();
}
void ewol::Context::resetIOEvent() {

View File

@ -37,7 +37,7 @@ void ewol::object::Manager::displayListObject() {
for (auto &it : m_eObjectList) {
std::shared_ptr<ewol::Object> element = it.lock();
if (element != nullptr) {
EWOL_INFO(" name='" << element->getName() << "' type=" << element->getObjectType());
EWOL_INFO(" [" << element->getId() << "] ref=" << element.use_count()-1 << " name='" << element->getName() << "' type=" << element->getObjectType());
}
}
}
@ -68,65 +68,8 @@ int32_t ewol::object::Manager::getNumberObject() {
return m_eObjectList.size();
}
void ewol::object::Manager::informOneObjectIsRemoved(const std::shared_ptr<ewol::Object>& _object) {
EWOL_TODO("ewol::object::Manager::informOneObjectIsRemoved()");
/*
for (auto &it : m_eObjectList) {
std::shared_ptr<ewol::Object> element = it.lock();
if ( element != nullptr
&& element != _object) {
EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << element->getId() << " type=" << element->getObjectType() << " name='" << element->getName() << "'");
element->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 : ...");
std::shared_ptr<ewol::Object> element = it.lock();
if (element != nullptr) {
element->onObjectRemove(_object);
}
}
*/
}
void ewol::object::Manager::remove(const std::shared_ptr<ewol::Object>& _object) {
EWOL_TODO("ewol::object::Manager::remove()");
/*
if (_object == nullptr) {
EWOL_ERROR("Try to Auto-Remove (nullptr) Object");
return;
}
int32_t count = 0;
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() << "' name=" << _object->getName());
informOneObjectIsRemoved(_object);
ewol::getContext().forceRedrawAll();
EWOL_VERBOSE("Auto-Remove Object ... done (have " << _object->getRefCount() << " references)");
it = m_eObjectListActive.begin();
count++;
} else {
++it;
}
}
if (count == 0) {
EWOL_ERROR("Try to Auto-Remove Object that is not referenced ...");
} else if ( count>1
|| count<0) {
EWOL_ERROR("Remove more than one object in the system list ==> this is a real problem ...");
}
*/
}
// clean all Object that request an autoRemove ...
void ewol::object::Manager::removeAllRemovedObject() {
void ewol::object::Manager::cleanInternalRemoved() {
size_t nbObject = m_eObjectList.size();
EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectList.size() << " elements");
auto it(m_eObjectList.begin());

View File

@ -43,17 +43,10 @@ namespace ewol {
* @param[in] _object Reference shared pointer on the object
*/
void add(const std::shared_ptr<ewol::Object>& _object);
/**
* @brief Called when an object request to be removed
* @param[in] _object Reference shared pointer on the object
*/
void remove(const std::shared_ptr<ewol::Object>& _object);
public:
void removeAllRemovedObject();
void cleanInternalRemoved();
std::shared_ptr<ewol::Object> get(const std::string& _name);
private:
void informOneObjectIsRemoved(const std::shared_ptr<ewol::Object>& _object);
private:
ewol::object::MultiCast m_multiCast; //!< muticast manager
public:

View File

@ -34,7 +34,7 @@ void ewol::Object::autoDestroy() {
}
void ewol::Object::requestDestroyFromChild(const std::shared_ptr<ewol::Object>& _child) {
EWOL_WARNING("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)");
EWOL_CRITICAL("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)");
}
void ewol::Object::setParent(const std::shared_ptr<ewol::Object>& _newParent) {
// TODO : Implement change of parent ...
@ -59,8 +59,6 @@ ewol::Object::Object() :
ewol::Object::~Object() {
EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription());
//getObjectManager().remove(shared_from_this());
// TODO : getMultiCast().rm();
m_externEvent.clear();
m_availlableEventId.clear();
m_uniqueId = -1;

View File

@ -154,15 +154,15 @@ void ewol::resource::Manager::contextHasBeenDestroyed() {
// internal generic keeper ...
std::shared_ptr<ewol::Resource> ewol::resource::Manager::localKeep(const std::string& _filename) {
EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\"");
EWOL_VERBOSE("KEEP (DEFAULT) : file : '" << _filename << "' in " << m_resourceList.size() << " resources");
for (auto &it : m_resourceList) {
std::shared_ptr<ewol::Resource> tmpRessource = it.lock();
if ( tmpRessource != nullptr
&& tmpRessource->getName() == _filename) {
return tmpRessource;
if (tmpRessource != nullptr) {
if (tmpRessource->getName() == _filename) {
return tmpRessource;
}
}
}
// we did not find it ...
return nullptr;
}
@ -181,18 +181,13 @@ void ewol::resource::Manager::localAdd(const std::shared_ptr<ewol::Resource>& _o
}
// in case of error ...
bool ewol::resource::Manager::checkResourceToRemove() {
void ewol::resource::Manager::cleanInternalRemoved() {
//EWOL_INFO("remove object in Manager");
updateContext();
for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) {
if ((*it).lock() == nullptr) {
if ((*it).expired() == true) {
m_resourceList.erase(it);
it = m_resourceList.begin();
continue;
}
m_resourceList.erase(it);
it = m_resourceList.begin();
return true;
}
return false;
}

View File

@ -63,7 +63,7 @@ namespace ewol {
// internal API to extent eResources in extern Soft
std::shared_ptr<ewol::Resource> localKeep(const std::string& _filename);
void localAdd(const std::shared_ptr<ewol::Resource>& _object);
virtual bool checkResourceToRemove();
virtual void cleanInternalRemoved();
};
};
};

View File

@ -33,8 +33,6 @@
#define __class__ "ewol::widget::Manager"
ewol::widget::Manager::Manager() :
m_focusWidgetDefault(nullptr),
m_focusWidgetCurrent(nullptr),
m_havePeriodic(false),
m_haveRedraw(true),
m_applWakeUpTime(0),
@ -85,23 +83,24 @@ void ewol::widget::Manager::focusKeep(const std::shared_ptr<ewol::Widget>& _newW
}
EWOL_VERBOSE("focusKeep=" << _newWidget->getId() );
//etk::log::displayBacktrace();
if (_newWidget == m_focusWidgetCurrent) {
auto focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (_newWidget == focusWidgetCurrent) {
// nothing to do ...
return;
}
if (m_focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() );
m_focusWidgetCurrent->rmFocus();
m_focusWidgetCurrent = nullptr;
if (focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() );
focusWidgetCurrent->rmFocus();
focusWidgetCurrent.reset();
}
if (_newWidget->canHaveFocus() == false) {
EWOL_DEBUG("Widget can not have focus, id=" << _newWidget->getId() );
return;
}
m_focusWidgetCurrent = _newWidget;
if (m_focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() );
m_focusWidgetCurrent->setFocus();
if (_newWidget != nullptr) {
EWOL_DEBUG("Set focus on WidgetID=" << _newWidget->getId() );
_newWidget->setFocus();
}
}
@ -111,47 +110,54 @@ void ewol::widget::Manager::focusSetDefault(const std::shared_ptr<ewol::Widget>&
EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() );
return;
}
if (m_focusWidgetDefault == m_focusWidgetCurrent) {
if (m_focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() );
m_focusWidgetCurrent->rmFocus();
std::shared_ptr<ewol::Widget> focusWidgetDefault = m_focusWidgetDefault.lock();
std::shared_ptr<ewol::Widget> focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (focusWidgetDefault == focusWidgetCurrent) {
if (focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() );
focusWidgetCurrent->rmFocus();
}
m_focusWidgetCurrent = _newWidget;
if (m_focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() );
m_focusWidgetCurrent->setFocus();
if (_newWidget != nullptr) {
EWOL_DEBUG("Set focus on WidgetID=" << _newWidget->getId() );
_newWidget->setFocus();
}
}
m_focusWidgetDefault = _newWidget;
}
void ewol::widget::Manager::focusRelease() {
if (m_focusWidgetDefault == m_focusWidgetCurrent) {
std::shared_ptr<ewol::Widget> focusWidgetDefault = m_focusWidgetDefault.lock();
std::shared_ptr<ewol::Widget> focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (focusWidgetDefault == focusWidgetCurrent) {
// nothink to do ...
return;
}
if (m_focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() );
m_focusWidgetCurrent->rmFocus();
if (focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() );
focusWidgetCurrent->rmFocus();
}
m_focusWidgetCurrent = m_focusWidgetDefault;
if (nullptr != m_focusWidgetCurrent) {
EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() );
m_focusWidgetCurrent->setFocus();
focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (nullptr != focusWidgetCurrent) {
EWOL_DEBUG("Set focus on WidgetID=" << focusWidgetCurrent->getId() );
focusWidgetCurrent->setFocus();
}
}
const std::shared_ptr<ewol::Widget>& ewol::widget::Manager::focusGet() {
return m_focusWidgetCurrent;
std::shared_ptr<ewol::Widget> ewol::widget::Manager::focusGet() {
return m_focusWidgetCurrent.lock();
}
void ewol::widget::Manager::focusRemoveIfRemove(const std::shared_ptr<ewol::Widget>& _newWidget) {
if (m_focusWidgetCurrent == _newWidget) {
std::shared_ptr<ewol::Widget> focusWidgetDefault = m_focusWidgetDefault.lock();
std::shared_ptr<ewol::Widget> focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (focusWidgetCurrent == _newWidget) {
EWOL_WARNING("Release focus when remove widget");
focusRelease();
}
if (m_focusWidgetDefault == _newWidget) {
if (focusWidgetDefault == _newWidget) {
EWOL_WARNING("Release default focus when remove widget");
focusSetDefault(nullptr);
}
@ -163,14 +169,13 @@ void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr<ewol::Widget>&
}
m_havePeriodic = true;
for (auto &it : m_listOfPeriodicWidget) {
if (it == _pWidget) {
if (it.lock() == _pWidget) {
return;
}
}
for (auto &it : m_listOfPeriodicWidget) {
if (it == nullptr) {
if (it.expired() == true) {
it = _pWidget;
return;
}
}
@ -179,16 +184,17 @@ void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr<ewol::Widget>&
void ewol::widget::Manager::periodicCallRm(const std::shared_ptr<ewol::Widget>& _pWidget) {
for (auto &it : m_listOfPeriodicWidget) {
if (it == _pWidget) {
if (it.lock() == _pWidget) {
it.reset();
}
}
periodicCallUpdateCount();
}
void ewol::widget::Manager::periodicCallUpdateCount() {
int32_t nbElement = 0;
for (auto &it : m_listOfPeriodicWidget) {
if (it != nullptr) {
if (it.expired() == false) {
nbElement++;
}
}
@ -216,15 +222,16 @@ void ewol::widget::Manager::periodicCall(int64_t _localTime) {
EWOL_VERBOSE("periodic : " << _localTime);
for (int32_t iii=m_listOfPeriodicWidget.size()-1; iii >= 0 ; iii--) {
if (nullptr != m_listOfPeriodicWidget[iii]) {
int64_t deltaTimeCallUser = m_listOfPeriodicWidget[iii]->systemGetCallDeltaTime();
auto tmpWidget = m_listOfPeriodicWidget[iii].lock();
if (nullptr != tmpWidget) {
int64_t deltaTimeCallUser = tmpWidget->systemGetCallDeltaTime();
if (deltaTimeCallUser <= 0) {
myTime.setDeltaCall(deltaTime);
EWOL_VERBOSE("[" << iii << "] periodic : " << myTime);
m_listOfPeriodicWidget[iii]->systemSetLastCallTime(_localTime);
m_listOfPeriodicWidget[iii]->periodicCall(myTime);
tmpWidget->systemSetLastCallTime(_localTime);
tmpWidget->periodicCall(myTime);
} else {
int64_t lastCallTime = m_listOfPeriodicWidget[iii]->systemGetLastCallTime();
int64_t lastCallTime = tmpWidget->systemGetLastCallTime();
if (lastCallTime == 0) {
lastCallTime = _localTime;
}
@ -232,8 +239,8 @@ void ewol::widget::Manager::periodicCall(int64_t _localTime) {
if (deltaLocalTime >= lastCallTime) {
myTime.setDeltaCall(deltaLocalTime);
EWOL_VERBOSE("[" << iii << "] periodic : " << myTime);
m_listOfPeriodicWidget[iii]->systemSetLastCallTime(_localTime);
m_listOfPeriodicWidget[iii]->periodicCall(myTime);
tmpWidget->systemSetLastCallTime(_localTime);
tmpWidget->periodicCall(myTime);
}
}
}
@ -297,20 +304,3 @@ std::string ewol::widget::Manager::list() {
return tmpVal;
}
void ewol::widget::Manager::onObjectRemove(const std::shared_ptr<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

@ -23,9 +23,9 @@ namespace ewol {
typedef std::shared_ptr<ewol::Widget> (*creator_tf)();
private:
// For the focus Management
std::shared_ptr<ewol::Widget> m_focusWidgetDefault;
std::shared_ptr<ewol::Widget> m_focusWidgetCurrent;
std::vector<std::shared_ptr<ewol::Widget>> m_listOfPeriodicWidget;
std::weak_ptr<ewol::Widget> m_focusWidgetDefault;
std::weak_ptr<ewol::Widget> m_focusWidgetCurrent;
std::vector<std::weak_ptr<ewol::Widget>> m_listOfPeriodicWidget;
bool m_havePeriodic;
bool m_haveRedraw;
etk::Hash<creator_tf> m_creatorList;
@ -38,7 +38,7 @@ namespace ewol {
void focusKeep(const std::shared_ptr<ewol::Widget>& _newWidget); // set the focus at the specific widget
void focusSetDefault(const std::shared_ptr<ewol::Widget>& _newWidget); // select the default focus getter
void focusRelease(); // release focus from the current widget to the default
const std::shared_ptr<ewol::Widget>& focusGet();
std::shared_ptr<ewol::Widget> focusGet();
void focusRemoveIfRemove(const std::shared_ptr<ewol::Widget>& _newWidget);
void periodicCallAdd(const std::shared_ptr<ewol::Widget>& _pWidget);
@ -55,7 +55,6 @@ namespace ewol {
std::shared_ptr<ewol::Widget> create(const std::string& _name);
bool exist(const std::string& _name);
std::string list();
virtual void onObjectRemove(const std::shared_ptr<ewol::Object>& _object);
private:
void periodicCallUpdateCount();
};

View File

@ -196,7 +196,6 @@ void ewol::widget::Windows::popUpWidgetPop() {
if (m_popUpWidgetList.size() == 0) {
return;
}
m_popUpWidgetList.back()->removeParent();
m_popUpWidgetList.pop_back();
}
@ -271,6 +270,7 @@ void ewol::widget::Windows::requestDestroyFromChild(const std::shared_ptr<Object
(*it).reset();
m_popUpWidgetList.erase(it);
it = m_popUpWidgetList.begin();
markToRedraw();
continue;
}
++it;
@ -281,5 +281,6 @@ void ewol::widget::Windows::requestDestroyFromChild(const std::shared_ptr<Object
}
m_subWidget->removeParent();
m_subWidget.reset();
markToRedraw();
}
}