From 5361e6826f186783c95e01804cec97be37910bec Mon Sep 17 00:00:00 2001
From: Merov Linden <merov@lindenlab.com>
Date: Wed, 25 Aug 2010 10:58:49 -0700
Subject: [PATCH] VWR-20710 : Sit anywhere, port of SG2.x SNOW-610 patch

---
 doc/contributions.txt                         |  3 +++
 indra/newview/llagent.cpp                     |  5 ++++
 indra/newview/llagent.h                       |  2 ++
 indra/newview/llviewermenu.cpp                | 23 +++++++++++++++----
 .../default/xui/en/menu_attachment_self.xml   | 13 ++++++++++-
 .../skins/default/xui/en/menu_avatar_self.xml | 12 +++++++++-
 .../default/xui/en/menu_inspect_self_gear.xml | 10 ++++++++
 7 files changed, 62 insertions(+), 6 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 9df072e937..7bdd287fb1 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -127,6 +127,8 @@ Asuka Neely
 	VWR-8179
 Balp Allen
 	VWR-4157
+Be Holder
+	SNOW-397
 Benja Kepler
 	VWR-746
 Biancaluce Robbiani
@@ -153,6 +155,7 @@ Boroondas Gupte
 	SNOW-503
 	SNOW-510
 	SNOW-527
+	SNOW-610
 	SNOW-624
 	VWR-233
 	WEB-262
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 42b78a84af..b78ebc6969 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -827,6 +827,11 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const
 	return pos_agent_d + mAgentOriginGlobal;
 }
 
+void LLAgent::sitDown()
+{
+	setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
+}
+
 
 //-----------------------------------------------------------------------------
 // resetAxes()
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 0d95683a98..c643cef78f 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -345,6 +345,8 @@ private:
 	//--------------------------------------------------------------------
 public:
 	void			standUp();
+	/// @brief ground-sit at agent's current position
+	void			sitDown();
 
 	//--------------------------------------------------------------------
 	// Busy
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 476e761c28..d02e1fdc8f 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3381,8 +3381,21 @@ class LLSelfStandUp : public view_listener_t
 
 bool enable_standup_self()
 {
-	bool new_value = isAgentAvatarValid() && gAgentAvatarp->isSitting();
-	return new_value;
+    return isAgentAvatarValid() && gAgentAvatarp->isSitting();
+}
+
+class LLSelfSitDown : public view_listener_t
+    {
+        bool handleEvent(const LLSD& userdata)
+        {
+            gAgent.sitDown();
+            return true;
+        }
+    };
+
+bool enable_sitdown_self()
+{
+    return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();
 }
 
 // Used from the login screen to aid in UI work on side tray
@@ -8037,11 +8050,13 @@ void initialize_menus()
 	// Admin top level
 	view_listener_t::addMenu(new LLAdminOnSaveState(), "Admin.OnSaveState");
 
-	// Self pie menu
+	// Self context menu
 	view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp");
+	enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
+	view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown");
+	enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));
 	view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");
 
-	enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
 	view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");
 
 	// we don't use boost::bind directly to delay side tray construction
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index e2348375d5..84e81397be 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -23,7 +23,7 @@
         <menu_item_call.on_enable
          function="Self.EnableStandUp" />
     </menu_item_call-->
-        <menu_item_call
+    <menu_item_call
      enabled="false"
      label="Edit"
      layout="topleft"
@@ -46,6 +46,17 @@
   <menu_item_separator
     layout="topleft" />
 
+    <menu_item_call
+     label="Sit Down"
+     layout="topleft"
+     name="Sit Down Here">
+        <menu_item_call.on_click
+         function="Self.SitDown"
+         parameter="" />
+        <menu_item_call.on_enable
+         function="Self.EnableSitDown" />
+    </menu_item_call>
+
   <menu_item_call
 label="Stand Up"
 layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index d5b993152a..9059745f46 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -2,7 +2,17 @@
 <context_menu
  layout="topleft"
  name="Self Pie">
-       <menu_item_call
+    <menu_item_call
+     label="Sit Down"
+     layout="topleft"
+     name="Sit Down Here">
+        <menu_item_call.on_click
+         function="Self.SitDown"
+         parameter="" />
+        <menu_item_call.on_enable
+         function="Self.EnableSitDown" />
+    </menu_item_call>
+    <menu_item_call
      label="Stand Up"
      layout="topleft"
      name="Stand Up">
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index ea18e02ca1..30c2cde552 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -5,6 +5,16 @@
          mouse_opaque="false"
          visible="false"
          name="Gear Menu">
+  <menu_item_call
+   label="Sit Down"
+   enabled="true"
+   name="sit_down_here">
+    <menu_item_call.on_click
+     function="Self.SitDown"
+     parameter="" />
+    <menu_item_call.on_visible
+     function="Self.EnableSitDown" />
+  </menu_item_call>
   <menu_item_call
    label="Stand Up"
    enabled="true"
-- 
GitLab