From 2b92341813b0b53d306683d6fc97428c40618fce Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Fri, 27 Nov 2009 17:27:39 +0200
Subject: [PATCH] Fixed normal bug EXT-2727 (View tool should remember state)

--HG--
branch : product-engine
---
 indra/newview/llfloatercamera.cpp             | 25 +++++++++++++++++--
 indra/newview/llfloatercamera.h               |  1 +
 .../skins/default/xui/en/floater_camera.xml   |  1 +
 3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 92e958b32de..764aff68c91 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -215,17 +215,38 @@ void LLFloaterCamera::onOpen(const LLSD& key)
 		getDockTongue(), LLDockControl::TOP));
 
 	mZoom->onOpen(key);
+
+	// Returns to previous mode, see EXT-2727(View tool should remember state).
+	// In case floater was just hidden and it isn't reset the mode
+	// just update state to current one. Else go to previous.
+	if ( !mClosed )
+		updateState();
+	else
+		toPrevMode();
+	mClosed = FALSE;
 }
 
 void LLFloaterCamera::onClose(bool app_quitting)
 {
 	//We don't care of camera mode if app is quitting
-	if(!app_quitting)
-		switchMode(CAMERA_CTRL_MODE_ORBIT);
+	if(app_quitting)
+		return;
+	// When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
+	// switchMode won't modify mPrevMode, so force it here.
+	// It is needed to correctly return to previous mode on open, see EXT-2727.
+	if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
+		mPrevMode = CAMERA_CTRL_MODE_ORBIT;
+
+	// HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
+	if ( !isDocked() )
+		setDocked(true);
+	switchMode(CAMERA_CTRL_MODE_ORBIT);
+	mClosed = TRUE;
 }
 
 LLFloaterCamera::LLFloaterCamera(const LLSD& val)
 :	LLTransientDockableFloater(NULL, true, val),
+	mClosed(FALSE),
 	mCurrMode(CAMERA_CTRL_MODE_ORBIT),
 	mPrevMode(CAMERA_CTRL_MODE_ORBIT)
 {
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 4873a34e00b..5d44b4944d0 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -109,6 +109,7 @@ class LLFloaterCamera
 	void assignButton2Mode(ECameraControlMode mode, const std::string& button_name);
 	
 
+	BOOL mClosed;
 	ECameraControlMode mPrevMode;
 	ECameraControlMode mCurrMode;
 	std::map<ECameraControlMode, LLButton*> mMode2Button;
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 69f9f6a2f87..d378b427f13 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -12,6 +12,7 @@
  help_topic="camera_floater"
  save_rect="true"
  save_visibility="true"
+ single_instance="true"
  width="150">
     <floater.string
      name="rotate_tooltip">
-- 
GitLab