diff options
| -rw-r--r-- | indra/newview/llsidetray.cpp | 99 | ||||
| -rw-r--r-- | indra/newview/llsidetray.h | 2 | 
2 files changed, 64 insertions, 37 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,6 +1192,38 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)  	arrange();  } +// 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. +LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) +{ +	for (LLView::child_list_const_iter_t child_it = panel->beginChild(); +		 child_it != panel->endChild(); ++child_it) +	{ +		LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); +		if (!child_panel) +			continue; +		if (child_panel->getName() == name) +			return child_panel; +	} +	if (recurse) +	{ +		for (LLView::child_list_const_iter_t child_it = panel->beginChild(); +			 child_it != panel->endChild(); ++child_it) +		{ +			LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); +			if (!child_panel) +				continue; +			LLPanel *found_panel = findChildPanel(child_panel,name,recurse); +			if (found_panel) +			{ +				return found_panel; +			} +		} +	} +	return NULL; +} +  /**   * Activate tab with "panel_name" panel   * if no such tab - return false, otherwise true. @@ -1221,23 +1253,50 @@ LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& para  	return new_panel;  } -void LLSideTray::hidePanel(const std::string& panel_name) +bool LLSideTray::hidePanel(const std::string& panel_name)  { +	bool panelHidden = false; +	  	LLPanel* panelp = getPanel(panel_name); +  	if (panelp)  	{ -		if(isTabAttached(panel_name)) +		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  		{ -			LLFloaterReg::hideInstance("side_bar_tab", panel_name); +			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<LLPanel*>(*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) @@ -1255,38 +1314,6 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name,  	}  } -// 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. -LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) -{ -	for (LLView::child_list_const_iter_t child_it = panel->beginChild(); -		 child_it != panel->endChild(); ++child_it) -	{ -		LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); -		if (!child_panel) -			continue; -		if (child_panel->getName() == name) -			return child_panel; -	} -	if (recurse) -	{ -		for (LLView::child_list_const_iter_t child_it = panel->beginChild(); -			 child_it != panel->endChild(); ++child_it) -		{ -			LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); -			if (!child_panel) -				continue; -			LLPanel *found_panel = findChildPanel(child_panel,name,recurse); -			if (found_panel) -			{ -				return found_panel; -			} -		} -	} -	return NULL; -} -  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. | 
