From 27f3470b7ecff97e5e7798a3cf120260c209fc42 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 15 Dec 2010 15:44:06 +0200 Subject: STORM-786 FIXED Fixed disappearing controls in avatar picks list. Caused by an improper fix of STORM-690. Made the way we switch between profile view panels (profile view / pick_info / pick_edit) more robust. It now suits both My Profile and Profile View panels. --- indra/newview/llpanelprofile.cpp | 126 +++++++++++++++++++++++++++++++++------ 1 file changed, 109 insertions(+), 17 deletions(-) (limited to 'indra/newview/llpanelprofile.cpp') diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 6038ab20d8..f4e8392916 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -114,9 +114,102 @@ public: LLAgentHandler gAgentHandler; +//-- LLPanelProfile::ChildStack begins ---------------------------------------- +LLPanelProfile::ChildStack::ChildStack(LLPanel* parent) +: mParent(parent) +{ + llassert_always(parent != NULL); +} + +/// Save current parent's child views and remove them from the child list. +bool LLPanelProfile::ChildStack::push() +{ + view_list_t vlist = *mParent->getChildList(); + + for (view_list_t::const_iterator it = vlist.begin(); it != vlist.end(); ++it) + { + LLView* viewp = *it; + mParent->removeChild(viewp); + } + + mStack.push_back(vlist); + dump(); + return true; +} + +/// Restore saved children (adding them back to the child list). +bool LLPanelProfile::ChildStack::pop() +{ + if (mStack.size() == 0) + { + llwarns << "Empty stack" << llendl; + llassert(mStack.size() == 0); + return false; + } + + view_list_t& top = mStack.back(); + for (view_list_t::const_iterator it = top.begin(); it != top.end(); ++it) + { + LLView* viewp = *it; + mParent->addChild(viewp); + } + + mStack.pop_back(); + dump(); + return true; +} + +/// Temporarily add all saved children back. +void LLPanelProfile::ChildStack::preParentReshape() +{ + mSavedStack = mStack; + while(mStack.size() > 0) + { + pop(); + } +} + +/// Add the temporarily saved children back. +void LLPanelProfile::ChildStack::postParentReshape() +{ + mStack = mSavedStack; + mSavedStack = stack_t(); + + for (stack_t::const_iterator stack_it = mStack.begin(); stack_it != mStack.end(); ++stack_it) + { + const view_list_t& vlist = (*stack_it); + for (view_list_t::const_iterator list_it = vlist.begin(); list_it != vlist.end(); ++list_it) + { + LLView* viewp = *list_it; + lldebugs << "removing " << viewp->getName() << llendl; + mParent->removeChild(viewp); + } + } +} + +void LLPanelProfile::ChildStack::dump() +{ + unsigned lvl = 0; + lldebugs << "child stack dump:" << llendl; + for (stack_t::const_iterator stack_it = mStack.begin(); stack_it != mStack.end(); ++stack_it, ++lvl) + { + std::ostringstream dbg_line; + dbg_line << "lvl #" << lvl << ":"; + const view_list_t& vlist = (*stack_it); + for (view_list_t::const_iterator list_it = vlist.begin(); list_it != vlist.end(); ++list_it) + { + dbg_line << " " << (*list_it)->getName(); + } + lldebugs << dbg_line.str() << llendl; + } +} + +//-- LLPanelProfile::ChildStack ends ------------------------------------------ + LLPanelProfile::LLPanelProfile() : LLPanel() , mTabCtrl(NULL) + , mChildStack(this) , mAvatarId(LLUUID::null) { } @@ -136,6 +229,15 @@ BOOL LLPanelProfile::postBuild() return TRUE; } +// virtual +void LLPanelProfile::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + // Temporarily add saved children back and reshape them. + mChildStack.preParentReshape(); + LLPanel::reshape(width, height, called_from_parent); + mChildStack.postParentReshape(); +} + void LLPanelProfile::onOpen(const LLSD& key) { // open the desired panel @@ -177,7 +279,6 @@ void LLPanelProfile::onOpen(const LLSD& key) } } -//*TODO redo panel toggling void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key) { // TRUE - we need to open/expand "panel" @@ -204,21 +305,10 @@ void LLPanelProfile::onTabSelected(const LLSD& param) } } -void LLPanelProfile::setAllChildrenVisible(BOOL visible) -{ - const child_list_t* child_list = getChildList(); - child_list_const_iter_t child_it = child_list->begin(); - for (; child_it != child_list->end(); ++child_it) - { - LLView* viewp = *child_it; - viewp->setVisible(visible); - } -} - void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params) { // Hide currently visible panel (STORM-690). - setAllChildrenVisible(FALSE); + mChildStack.push(); // Add the panel or bring it to front. if (panel->getParent() != this) @@ -231,7 +321,7 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params) } panel->setVisible(TRUE); - + panel->setFocus(TRUE); // prevent losing focus by the floater panel->onOpen(params); LLRect new_rect = getRect(); @@ -249,15 +339,17 @@ void LLPanelProfile::closePanel(LLPanel* panel) removeChild(panel); // Make the underlying panel visible. + mChildStack.pop(); + + // Prevent losing focus by the floater const child_list_t* child_list = getChildList(); if (child_list->size() > 0) { - child_list->front()->setVisible(TRUE); - child_list->front()->setFocus(TRUE); // prevent losing focus by the floater + child_list->front()->setFocus(TRUE); } else { - llwarns << "No underlying panel to make visible." << llendl; + llwarns << "No underlying panel to focus." << llendl; } } } -- cgit v1.2.3 From 10d9328b86991272b6cbc7eda73e8f09afccfb52 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 15 Dec 2010 16:00:37 +0200 Subject: STORM-786 ADDITIONAL FIX Fixed Windows build. --- indra/newview/llpanelprofile.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'indra/newview/llpanelprofile.cpp') diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index f4e8392916..b035d7d473 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -115,10 +115,15 @@ LLAgentHandler gAgentHandler; //-- LLPanelProfile::ChildStack begins ---------------------------------------- -LLPanelProfile::ChildStack::ChildStack(LLPanel* parent) -: mParent(parent) +LLPanelProfile::ChildStack::ChildStack() +: mParent(NULL) +{ +} + +void LLPanelProfile::ChildStack::setParent(LLPanel* parent) { llassert_always(parent != NULL); + mParent = parent; } /// Save current parent's child views and remove them from the child list. @@ -209,9 +214,9 @@ void LLPanelProfile::ChildStack::dump() LLPanelProfile::LLPanelProfile() : LLPanel() , mTabCtrl(NULL) - , mChildStack(this) , mAvatarId(LLUUID::null) { + mChildStack.setParent(this); } BOOL LLPanelProfile::postBuild() -- cgit v1.2.3