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.meow-7.2.2
parent
4f798c40d8
commit
27f3470b7e
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 @@ protected:
|
|||
|
||||
virtual void onTabSelected(const LLSD& param);
|
||||
|
||||
virtual void setAllChildrenVisible(BOOL visible);
|
||||
|
||||
LLTabContainer* getTabCtrl() { return mTabCtrl; }
|
||||
|
||||
const LLUUID& getAvatarId() { return mAvatarId; }
|
||||
|
|
@ -72,8 +70,33 @@ protected:
|
|||
|
||||
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;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue