Skip to content
Snippets Groups Projects
Commit 27f3470b authored by Vadim ProductEngine's avatar Vadim ProductEngine
Browse files

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.
parent 4f798c40
No related branches found
No related tags found
No related merge requests found
......@@ -114,9 +114,102 @@ class LLAgentHandler : public LLCommandHandler
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;
}
}
}
......
......@@ -41,7 +41,7 @@ class LLPanelProfile : public LLPanel
public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void onOpen(const LLSD& key);
virtual void togglePanel(LLPanel*, const LLSD& key = LLSD());
......@@ -58,8 +58,6 @@ class LLPanelProfile : public LLPanel
virtual void onTabSelected(const LLSD& param);
virtual void setAllChildrenVisible(BOOL visible);
LLTabContainer* getTabCtrl() { return mTabCtrl; }
const LLUUID& getAvatarId() { return mAvatarId; }
......@@ -72,8 +70,33 @@ class LLPanelProfile : public LLPanel
private:
//-- ChildStack begins ----------------------------------------------------
class ChildStack
{
LOG_CLASS(LLPanelProfile::ChildStack);
public:
ChildStack(LLPanel* parent);
bool push();
bool pop();
void preParentReshape();
void postParentReshape();
private:
void dump();
typedef LLView::child_list_t view_list_t;
typedef std::list<view_list_t> stack_t;
stack_t mStack;
stack_t mSavedStack;
LLPanel* mParent;
};
//-- ChildStack ends ------------------------------------------------------
LLTabContainer* mTabCtrl;
profile_tabs_t mTabContainer;
ChildStack mChildStack;
LLUUID mAvatarId;
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment