From 64d20b8b745c184464c2a2f0795aeff0124ea3c5 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Tue, 19 Apr 2011 11:13:36 -0700 Subject: [PATCH] EXP-631 FIX -- REGRESSION - Clicking people button in Basic mode does not toggle the People panel to close EXP-640 FIX -- [PUBLIC] Ctrl+I doesn't close side tray LLSideTray::hidePanel now checks if the parent is the side tray or if it is a child to a detached tab to determine what panel to attempt to close. Reviewed by Leyla --- indra/newview/llsidetray.cpp | 153 ++++++++++++++++++++--------------- indra/newview/llsidetray.h | 2 +- 2 files changed, 91 insertions(+), 64 deletions(-) diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 4f18ee1da2..e4c2293938 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -1192,69 +1192,6 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) arrange(); } -/** - * Activate tab with "panel_name" panel - * if no such tab - return false, otherwise true. - * TODO* In some cases a pointer to a panel of - * a specific class may be needed so this method - * would need to use templates. - */ -LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params) -{ - LLPanel* new_panel = NULL; - - // Look up the tab in the list of detached tabs. - child_vector_const_iter_t child_it; - for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) - { - new_panel = openChildPanel(*child_it, panel_name, params); - if (new_panel) break; - } - - // Look up the tab in the list of attached tabs. - for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) - { - new_panel = openChildPanel(*child_it, panel_name, params); - if (new_panel) break; - } - - return new_panel; -} - -void LLSideTray::hidePanel(const std::string& panel_name) -{ - LLPanel* panelp = getPanel(panel_name); - if (panelp) - { - if(isTabAttached(panel_name)) - { - collapseSideBar(); - } - else - { - LLFloaterReg::hideInstance("side_bar_tab", panel_name); - } - } -} - - -void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) -{ - if(!sub_panel) - return; - - // If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors) - // it should be toggled off by collapsing Side Tray. - if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this)) - { - LLSideTray::getInstance()->collapseSideBar(); - } - else - { - LLSideTray::getInstance()->showPanel(panel_name, params); - } -} - // This is just LLView::findChildView specialized to restrict the search to LLPanels. // Optimization for EXT-4068 to avoid searching down to the individual item level // when inventories are large. @@ -1287,6 +1224,96 @@ LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) return NULL; } +/** + * Activate tab with "panel_name" panel + * if no such tab - return false, otherwise true. + * TODO* In some cases a pointer to a panel of + * a specific class may be needed so this method + * would need to use templates. + */ +LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params) +{ + LLPanel* new_panel = NULL; + + // Look up the tab in the list of detached tabs. + child_vector_const_iter_t child_it; + for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) + { + new_panel = openChildPanel(*child_it, panel_name, params); + if (new_panel) break; + } + + // Look up the tab in the list of attached tabs. + for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + { + new_panel = openChildPanel(*child_it, panel_name, params); + if (new_panel) break; + } + + return new_panel; +} + +bool LLSideTray::hidePanel(const std::string& panel_name) +{ + bool panelHidden = false; + + LLPanel* panelp = getPanel(panel_name); + + if (panelp) + { + LLView* parentp = panelp->getParent(); + + // Collapse the side bar if the panel or the panel's parent is an attached tab + if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName()))) + { + collapseSideBar(); + panelHidden = true; + } + else + { + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name); + + if (!panelHidden) + { + // Look up the panel in the list of detached tabs. + for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) + { + LLPanel *detached_panel = dynamic_cast(*child_it); + + if (detached_panel) + { + // Hide this detached panel if it is a parent of our panel + if (findChildPanel(detached_panel, panel_name, true) != NULL) + { + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName()); + break; + } + } + } + } + } + } + + return panelHidden; +} + +void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) +{ + if(!sub_panel) + return; + + // If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors) + // it should be toggled off by collapsing Side Tray. + if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this)) + { + LLSideTray::getInstance()->collapseSideBar(); + } + else + { + LLSideTray::getInstance()->showPanel(panel_name, params); + } +} + LLPanel* LLSideTray::getPanel(const std::string& panel_name) { // Look up the panel in the list of detached tabs. diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 1dddd9e9bc..46765bfbcc 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -104,7 +104,7 @@ public: */ LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD()); - void hidePanel (const std::string& panel_name); + bool hidePanel (const std::string& panel_name); /** * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.