From 2646ec7aa134eb4914439247688c092cd579ec58 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 19 May 2010 15:32:25 +0300
Subject: EXT-7104 WIP Implemented reaction on Sidebar button click

Implementation details:
* Added new setting SidebarWithButtonsVisibility
* Sidebar bottom tray button changes its value on click (toggle state - value is TRUE)
* SideTray listens changes of this setting's value and change its and its buttons visibility
* expand/collapse Sidebar state is stored between changes of the setting.

Reviewed by Yuri Chebotarev at https://codereview.productengine.com/secondlife/r/403/

--HG--
branch : product-engine
---
 indra/newview/app_settings/settings.xml            | 11 ++++
 indra/newview/llsidetray.cpp                       | 59 ++++++++++++++++++++--
 indra/newview/llsidetray.h                         | 10 ++++
 .../skins/default/xui/en/panel_bottomtray.xml      |  5 +-
 4 files changed, 76 insertions(+), 9 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index cae4a14eed..7156af57ec 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8682,6 +8682,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>SidebarWithButtonsVisibility</key>
+    <map>
+      <key>Comment</key>
+      <string>Sets visibility of sidebar with its tabs' buttons</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>SkinCurrent</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 3ec1855484..9159f42968 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -66,6 +66,21 @@ static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title";
 
 LLSideTray* LLSideTray::sInstance = 0;
 
+/**
+ * Updates visibility of sidetray tabs buttons according to "SidebarWithButtonsVisibility" setting
+ *
+ * @param force_set_visible if true method ignores setting value and set buttons visible.
+ */
+static void update_tabs_buttons_visibility(bool force_set_visible = false)
+{
+	LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
+	if (side_bar_tabs)
+	{
+		BOOL visible = LLUI::sSettingGroups["config"]->getBOOL("SidebarWithButtonsVisibility");
+		side_bar_tabs->setVisible(force_set_visible || visible);
+	}
+}
+
 LLSideTray* LLSideTray::getInstance()
 {
 	if (!sInstance)
@@ -258,6 +273,8 @@ LLSideTray::LLSideTray(Params& params)
 	p.name = "buttons_panel";
 	p.mouse_opaque = false;
 	mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p);
+
+	initControlSettings();
 }
 
 
@@ -547,6 +564,7 @@ void LLSideTray::collapseSideBar()
 	reflectCollapseChange();
 	setFocus( FALSE );
 
+	update_tabs_buttons_visibility();
 }
 
 void LLSideTray::expandSideBar()
@@ -572,6 +590,7 @@ void LLSideTray::expandSideBar()
 		btn->setImageOverlay( mActiveTab->mImageSelected  );
 	}
 
+	update_tabs_buttons_visibility(true);
 }
 
 void LLSideTray::highlightFocused()
@@ -638,6 +657,9 @@ LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& para
 			{
 				panel->onOpen(params);
 			}
+
+			update_tabs_buttons_visibility(true);
+
 			return panel;
 		}
 	}
@@ -720,11 +742,6 @@ bool		LLSideTray::isPanelActive(const std::string& panel_name)
 	return (panel->getName() == panel_name);
 }
 
-
-// *TODO: Eliminate magic constants.
-static const S32	fake_offset = 132;
-static const S32	fake_top_offset = 18;
-
 void	LLSideTray::updateSidetrayVisibility()
 {
 	// set visibility of parent container based on collapsed state
@@ -734,3 +751,35 @@ void	LLSideTray::updateSidetrayVisibility()
 	}
 }
 
+void LLSideTray::initControlSettings()
+{
+	// set listeners to process runtime setting changes
+	LLUI::sSettingGroups["config"]->getControl("SidebarWithButtonsVisibility")->getSignal()->connect(boost::bind(&LLSideTray::toggleSidetrayAndTabButtonsVisibility, this, _2));
+
+	// update visibility according to current value
+	toggleSidetrayAndTabButtonsVisibility(LLUI::sSettingGroups["config"]->getBOOL("SidebarWithButtonsVisibility"));
+}
+
+// sidebar visibility is implemented via its expanding/collapsing
+void LLSideTray::toggleSidetrayAndTabButtonsVisibility(const LLSD::Boolean& new_visibility)
+{
+	// If new_visibility==FALSE it gets invisible but still can be expanded in other ways (Ctrl+I to see My Inventory)
+
+	// store collapsed state to restore it properly on next call
+	static bool was_collapsed = false;
+
+	if (!new_visibility && !mCollapsed)
+	{
+		collapseSideBar();
+		was_collapsed = true;
+	}
+	// should be visible: expand only if it was expanded when has been collapsed on previous call
+	else if (new_visibility && was_collapsed)
+	{
+		if (mCollapsed) expandSideBar();
+		was_collapsed = false;
+	}
+
+	update_tabs_buttons_visibility(new_visibility);
+}
+
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index e8fdee9430..ed6b376d5c 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -179,6 +179,16 @@ private:
 			LLSideTray::getInstance()->setEnabled(FALSE);
 	}
 	
+	/**
+	 * Initializes listener of SidebarWithButtonsVisibility setting and updates state according to it.
+	 */
+	void initControlSettings();
+
+	/**
+	 * Updates Sidebar and its Tab Buttons visibility according to passed value.
+	 */
+	void toggleSidetrayAndTabButtonsVisibility(const LLSD::Boolean& new_visibility);
+
 private:
 
 	LLPanel*						mButtonsPanel;
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index dd813f5813..2ba7bef502 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -228,7 +228,7 @@
 Disabled for now.
 -->
             <button
-enabled="false"
+             control_name="SidebarWithButtonsVisibility"
              follows="left|right"
              height="23"
              image_pressed="PushButton_Press"
@@ -243,9 +243,6 @@ enabled="false"
              top="5"
              use_ellipses="true"
              width="80">
-                <init_callback
-                 function=""
-                 parameter="" />
             </button>
         </layout_panel>
         <layout_panel
-- 
cgit v1.2.3