From 6ffc21e00d07a7c90d46009571556a9caec96e62 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Mon, 25 Jan 2010 12:07:23 +0200
Subject: [PATCH] fixed  EXT-3395 "Docked IM/Chat windows shouldn't hide when
 voice control panel is opened", added transient controls group 'DOCKED' for
 temporary excluded docked floaters and dock widgets;

--HG--
branch : product-engine
---
 indra/newview/lltransientdockablefloater.cpp | 24 +++++++++++++-------
 indra/newview/lltransientfloatermgr.cpp      |  4 +++-
 indra/newview/lltransientfloatermgr.h        |  2 +-
 3 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/indra/newview/lltransientdockablefloater.cpp b/indra/newview/lltransientdockablefloater.cpp
index c9bfe178ce4..9d39aa51824 100644
--- a/indra/newview/lltransientdockablefloater.cpp
+++ b/indra/newview/lltransientdockablefloater.cpp
@@ -48,6 +48,14 @@ LLTransientDockableFloater::LLTransientDockableFloater(LLDockControl* dockContro
 LLTransientDockableFloater::~LLTransientDockableFloater()
 {
 	LLTransientFloaterMgr::getInstance()->unregisterTransientFloater(this);
+	LLView* dock = getDockWidget();
+	LLTransientFloaterMgr::getInstance()->removeControlView(
+			LLTransientFloaterMgr::DOCKED, this);
+	if (dock != NULL)
+	{
+		LLTransientFloaterMgr::getInstance()->removeControlView(
+				LLTransientFloaterMgr::DOCKED, dock);
+	}
 }
 
 void LLTransientDockableFloater::setVisible(BOOL visible)
@@ -55,18 +63,18 @@ void LLTransientDockableFloater::setVisible(BOOL visible)
 	LLView* dock = getDockWidget();
 	if(visible && isDocked())
 	{
-		LLTransientFloaterMgr::getInstance()->addControlView(this);
+		LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, this);
 		if (dock != NULL)
 		{
-			LLTransientFloaterMgr::getInstance()->addControlView(dock);
+			LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, dock);
 		}
 	}
 	else
 	{
-		LLTransientFloaterMgr::getInstance()->removeControlView(this);
+		LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, this);
 		if (dock != NULL)
 		{
-			LLTransientFloaterMgr::getInstance()->removeControlView(dock);
+			LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, dock);
 		}
 	}
 
@@ -78,18 +86,18 @@ void LLTransientDockableFloater::setDocked(bool docked, bool pop_on_undock)
 	LLView* dock = getDockWidget();
 	if(docked)
 	{
-		LLTransientFloaterMgr::getInstance()->addControlView(this);
+		LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, this);
 		if (dock != NULL)
 		{
-			LLTransientFloaterMgr::getInstance()->addControlView(dock);
+			LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, dock);
 		}
 	}
 	else
 	{
-		LLTransientFloaterMgr::getInstance()->removeControlView(this);
+		LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, this);
 		if (dock != NULL)
 		{
-			LLTransientFloaterMgr::getInstance()->removeControlView(dock);
+			LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, dock);
 		}
 	}
 
diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp
index 8f1a738453f..d82403070be 100644
--- a/indra/newview/lltransientfloatermgr.cpp
+++ b/indra/newview/lltransientfloatermgr.cpp
@@ -46,6 +46,7 @@ LLTransientFloaterMgr::LLTransientFloaterMgr()
 			&LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3));
 
 	mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));
+	mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>()));
 	mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>()));
 }
 
@@ -132,7 +133,8 @@ void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
 		return;
 	}
 
-	bool hide = isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
+	bool hide = isControlClicked(mGroupControls.find(DOCKED)->second, x, y)
+			&& isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
 	if (hide)
 	{
 		hideTransientFloaters(x, y);
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
index 1f99325a7fb..9c5ae295f28 100644
--- a/indra/newview/lltransientfloatermgr.h
+++ b/indra/newview/lltransientfloatermgr.h
@@ -51,7 +51,7 @@ class LLTransientFloaterMgr: public LLSingleton<LLTransientFloaterMgr>
 public:
 	enum ETransientGroup
 	{
-		GLOBAL, IM
+		GLOBAL, DOCKED, IM
 	};
 
 	void registerTransientFloater(LLTransientFloater* floater);
-- 
GitLab