From 64d20b8b745c184464c2a2f0795aeff0124ea3c5 Mon Sep 17 00:00:00 2001
From: Leslie Linden <leslie@lindenlab.com>
Date: Tue, 19 Apr 2011 11:13:36 -0700
Subject: 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 | 99 ++++++++++++++++++++++++++++----------------
 indra/newview/llsidetray.h   |  2 +-
 2 files changed, 64 insertions(+), 37 deletions(-)

(limited to 'indra')

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.
-- 
cgit v1.2.3