ui internal destroy

This commit is contained in:
Eduardo Bart 2011-08-22 16:39:46 -03:00
parent 6a3ee47cc5
commit bfa3903940
2 changed files with 39 additions and 38 deletions

View File

@ -32,43 +32,49 @@ UIWidget::UIWidget()
UIWidget::~UIWidget() UIWidget::~UIWidget()
{ {
if(!m_destroyed) if(!m_destroyed) {
logWarning("widget '", m_id, "' was destructed without being explicit destroyed"); logWarning("widget '", m_id, "' was destructed without being explicit destroyed");
internalDestroy();
}
} }
void UIWidget::destroy() void UIWidget::destroy()
{ {
// destroy only once // destroy only once
if(!m_destroyed) { if(!m_destroyed) {
// first release lua table, because it may contains references to children internalDestroy();
releaseLuaFieldsTable();
// clear additional child references
m_lockedChildren.clear();
m_focusedChild.reset();
m_anchors.clear();
m_anchoredWidgets.clear();
// destroy children
while(m_children.size() > 0) {
UIWidgetPtr child = m_children.front(); //hold reference
child->destroy();
}
// remove itself from parent
if(UIWidgetPtr parent = getParent())
parent->removeChild(asUIWidget());
// by now this widget is destroyed
m_destroyed = true;
// add destroy check event // add destroy check event
g_dispatcher.addEvent(std::bind(&UIWidget::destroyCheck, asUIWidget())); g_dispatcher.addEvent(std::bind(&UIWidget::internalDestroyCheck, asUIWidget()));
} else } else
logWarning("attempt to destroy widget '", m_id, "' again"); logWarning("attempt to destroy widget '", m_id, "' again");
} }
void UIWidget::destroyCheck() void UIWidget::internalDestroy()
{
// first release lua table, because it may contains references to children
releaseLuaFieldsTable();
// clear other references
m_lockedChildren.clear();
m_anchors.clear();
m_anchoredWidgets.clear();
m_focusedChild.reset();
// destroy children
while(m_children.size() > 0) {
UIWidgetPtr child = m_children.front(); //hold reference
child->destroy();
}
// remove itself from parent
if(UIWidgetPtr parent = getParent())
parent->removeChild(asUIWidget());
m_destroyed = true;
}
void UIWidget::internalDestroyCheck()
{ {
// collect lua garbage before checking // collect lua garbage before checking
g_lua.collectGarbage(); g_lua.collectGarbage();
@ -128,7 +134,7 @@ void UIWidget::setParent(const UIWidgetPtr& parent)
// set new parent // set new parent
if(parent) { if(parent) {
m_parent = UIWidgetWeakPtr(parent); m_parent = parent;
// add to parent if needed // add to parent if needed
if(!parent->hasChild(self)) if(!parent->hasChild(self))
@ -141,9 +147,6 @@ void UIWidget::applyStyle(const std::string& styleName)
try { try {
OTMLNodePtr styleNode = g_ui.getStyle(styleName); OTMLNodePtr styleNode = g_ui.getStyle(styleName);
onStyleApply(styleNode); onStyleApply(styleNode);
// forces layout recalculation
updateLayout();
} catch(std::exception& e) { } catch(std::exception& e) {
logError("couldn't change widget '", m_id, "' style: ", e.what()); logError("couldn't change widget '", m_id, "' style: ", e.what());
} }
@ -336,10 +339,8 @@ void UIWidget::focusChild(const UIWidgetPtr& child, UI::FocusReason reason)
{ {
assert(!m_destroyed); assert(!m_destroyed);
if(!child) if(child)
return; assert(hasChild(child));
assert(hasChild(child));
if(child != m_focusedChild) { if(child != m_focusedChild) {
UIWidgetPtr oldFocused = m_focusedChild; UIWidgetPtr oldFocused = m_focusedChild;
@ -704,7 +705,7 @@ void UIWidget::internalUpdateChildrenLayout()
// update children layouts // update children layouts
for(const UIWidgetWeakPtr& anchoredWidgetWeak : m_anchoredWidgets) { for(const UIWidgetWeakPtr& anchoredWidgetWeak : m_anchoredWidgets) {
if(UIWidgetPtr anchoredWidget = anchoredWidgetWeak.lock()) if(UIWidgetPtr anchoredWidget = anchoredWidgetWeak.lock())
anchoredWidget->updateLayout(); anchoredWidget->internalUpdateLayout();
} }
} }
@ -850,10 +851,10 @@ void UIWidget::onStyleApply(const OTMLNodePtr& styleNode)
addAnchor(edge, hookedWidgetId, hookedEdge); addAnchor(edge, hookedWidgetId, hookedEdge);
} }
} }
else if(node->tag() == "onLoad") { /*else if(node->tag() == "onLoad") {
g_lua.loadFunction(node->value<std::string>(), "@" + node->source() + "[" + node->tag() + "]"); g_lua.loadFunction(node->value<std::string>(), "@" + node->source() + "[" + node->tag() + "]");
luaSetField("onLoad"); luaSetField("onLoad");
} }*/
} }
} }

View File

@ -116,6 +116,9 @@ public:
UIWidgetPtr asUIWidget() { return std::static_pointer_cast<UIWidget>(shared_from_this()); } UIWidgetPtr asUIWidget() { return std::static_pointer_cast<UIWidget>(shared_from_this()); }
private: private:
void internalDestroy();
void internalDestroyCheck();
void internalUpdateLayout(); void internalUpdateLayout();
void internalUpdateChildrenLayout(); void internalUpdateChildrenLayout();
@ -154,9 +157,6 @@ protected:
friend class UIManager; friend class UIManager;
private:
void destroyCheck();
protected: protected:
bool m_enabled; bool m_enabled;
bool m_visible; bool m_visible;