From 2b5f45c1aabb87c23695e85d8b26cde55c94ba3f Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Fri, 15 Jan 2010 20:57:42 +0200
Subject: [PATCH] Fixed normal bug EXT-4309 (Gesture button is too wide in the
 mouse look mode): added hack that avoid usage of the LLLayoutStack resizing
 logic on mouse look mode switching.

--HG--
branch : product-engine
---
 indra/llui/lllayoutstack.h     |  2 +
 indra/newview/llagent.cpp      |  2 +
 indra/newview/llbottomtray.cpp | 88 +++++++++++++++++++++++++---------
 indra/newview/llbottomtray.h   | 17 ++++++-
 4 files changed, 85 insertions(+), 24 deletions(-)

diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index aba35773eea..c4f10038f86 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -93,6 +93,8 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 	void updateLayout(BOOL force_resize = FALSE);
 	
 	S32 getPanelSpacing() const { return mPanelSpacing; }
+	BOOL getAnimate () const { return mAnimate; }
+	void setAnimate (BOOL animate) { mAnimate = animate; }
 	
 	static void updateClass();
 
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 5ea253709cf..749296d8a59 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2806,6 +2806,7 @@ void LLAgent::endAnimationUpdateUI()
 		gStatusBar->setVisibleForMouselook(true);
 
 		LLBottomTray::getInstance()->setVisible(TRUE);
+		LLBottomTray::getInstance()->onMouselookModeOut();
 
 		LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE);
 		LLSideTray::getInstance()->updateSidetrayVisibility();
@@ -2904,6 +2905,7 @@ void LLAgent::endAnimationUpdateUI()
 		LLNavigationBar::getInstance()->setVisible(FALSE);
 		gStatusBar->setVisibleForMouselook(false);
 
+		LLBottomTray::getInstance()->onMouselookModeIn();
 		LLBottomTray::getInstance()->setVisible(FALSE);
 
 		LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE);
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index beccefa4301..8a7ed23b59c 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -52,6 +52,15 @@
 // Build time optimization, generate extern template once in .cpp file
 template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
 
+namespace
+{
+	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel";
+	const std::string& PANEL_CHATBAR_NAME	= "chat_bar";
+	const std::string& PANEL_MOVEMENT_NAME	= "movement_panel";
+	const std::string& PANEL_CAMERA_NAME	= "cam_panel";
+	const std::string& PANEL_GESTURE_NAME	= "gesture_panel";
+}
+
 LLBottomTray::LLBottomTray(const LLSD&)
 :	mChicletPanel(NULL),
 	mSpeakPanel(NULL),
@@ -236,6 +245,57 @@ void LLBottomTray::onFocusLost()
 	}
 }
 
+void LLBottomTray::savePanelsShape()
+{
+	mSavedShapeList.clear();
+	for (child_list_const_iter_t
+			 child_it = mToolbarStack->beginChild(),
+			 child_it_end = mToolbarStack->endChild();
+		 child_it != child_it_end; ++child_it)
+	{
+		mSavedShapeList.push_back( (*child_it)->getRect() );
+	}
+}
+
+void LLBottomTray::restorePanelsShape()
+{
+	if (mSavedShapeList.size() != mToolbarStack->getChildCount())
+		return;
+	int i = 0;
+	for (child_list_const_iter_t
+			 child_it = mToolbarStack->beginChild(),
+			 child_it_end = mToolbarStack->endChild();
+		 child_it != child_it_end; ++child_it)
+	{
+		(*child_it)->setShape(mSavedShapeList[i++]);
+	}
+}
+
+void LLBottomTray::onMouselookModeOut()
+{
+	// Apply the saved settings when we are not in mouselook mode, see EXT-3988.
+	{
+		setTrayButtonVisibleIfPossible (RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"), false);
+		setTrayButtonVisibleIfPossible (RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"),    false);
+		setTrayButtonVisibleIfPossible (RS_BUTTON_CAMERA,   gSavedSettings.getBOOL("ShowCameraButton"),  false);
+		setTrayButtonVisibleIfPossible (RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"),false);
+	}
+	// HACK: To avoid usage the LLLayoutStack logic of resizing, we force the updateLayout
+	// and then restore children saved shapes. See EXT-4309.
+	BOOL saved_anim = mToolbarStack->getAnimate();
+	mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
+	mToolbarStack->setAnimate(FALSE);
+	mToolbarStack->updateLayout();
+	mToolbarStack->setAnimate(saved_anim);
+	restorePanelsShape();
+}
+
+void LLBottomTray::onMouselookModeIn()
+{
+	savePanelsShape();
+	mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE);
+}
+
 //virtual
 // setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode.
 // If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true),
@@ -255,23 +315,15 @@ void LLBottomTray::setVisible(BOOL visible)
 			LLView* viewp = *child_it;
 			std::string name = viewp->getName();
 
-			// Chat bar and gesture button are shown even in mouselook mode. But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988.
-			if ("chat_bar" == name || "gesture_panel" == name || (visibility && ("movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name)))
+			// Chat bar and gesture button are shown even in mouselook mode.
+			// But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988.
+			if ("chat_bar" == name || "gesture_panel" == name)
 				continue;
 			else 
 			{
 				viewp->setVisible(visibility);
 			}
 		}
-
-		// Apply the saved settings when we are not in mouselook mode, see EXT-3988.
-		if (visibility)
-		{
-			showCameraButton(gSavedSettings.getBOOL("ShowCameraButton"));
-			showSnapshotButton(gSavedSettings.getBOOL("ShowSnapshotButton"));
-			showMoveButton(gSavedSettings.getBOOL("ShowMoveButton"));
-			showGestureButton(gSavedSettings.getBOOL("ShowGestureButton"));
-		}
 	}
 }
 
@@ -337,15 +389,6 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
 	setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
 }
 
-namespace
-{
-	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel";
-	const std::string& PANEL_CHATBAR_NAME	= "chat_bar";
-	const std::string& PANEL_MOVEMENT_NAME	= "movement_panel";
-	const std::string& PANEL_CAMERA_NAME	= "cam_panel";
-	const std::string& PANEL_GESTURE_NAME	= "gesture_panel";
-}
-
 BOOL LLBottomTray::postBuild()
 {
 
@@ -1018,7 +1061,7 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis
 	panel->setVisible(visible);
 }
 
-void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible)
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
 {
 	bool can_be_set = true;
 
@@ -1058,7 +1101,8 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type
 	{
 		// mark this button to show it while future bottom tray extending
 		mResizeState |= shown_object_type;
-		LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown");
+		if ( raise_notification )
+			LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown");
 	}
 }
 
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 9be0e5810f0..562ee569125 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -92,7 +92,10 @@ class LLBottomTray
 	void showMoveButton(BOOL visible);
 	void showCameraButton(BOOL visible);
 	void showSnapshotButton(BOOL visible);
-	
+
+	void onMouselookModeIn();
+	void onMouselookModeOut();
+
 	/**
 	 * Creates IM Chiclet based on session type (IM chat or Group chat)
 	 */
@@ -167,7 +170,14 @@ class LLBottomTray
 	 *  - if hidden via context menu button should be shown but there is no enough room for now
 	 *    it will be shown while extending.
 	 */
-	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible);
+	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true);
+
+	/**
+	 * Save and restore children shapes.
+	 * Used to avoid the LLLayoutStack resizing logic between mouse look mode switching.
+	 */
+	void savePanelsShape();
+	void restorePanelsShape();
 
 	MASK mResizeState;
 
@@ -177,6 +187,9 @@ class LLBottomTray
 	typedef std::map<EResizeState, S32> state_object_width_map_t;
 	state_object_width_map_t mObjectDefaultWidthMap;
 
+	typedef std::vector<LLRect> shape_list_t;
+	shape_list_t mSavedShapeList;
+
 protected:
 
 	LLBottomTray(const LLSD& key = LLSD());
-- 
GitLab