From 94cd34cc1762fbcc88930f095fb89b9ae4292928 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Wed, 8 Jul 2020 20:29:44 +0300
Subject: [PATCH] SL-13479 Avatar menu tweaks

---
 indra/llui/llmenugl.cpp                       |   4 +-
 indra/newview/llviewermenu.cpp                |  10 +
 indra/newview/llviewermenu.h                  |   4 +
 indra/newview/llvoavatarself.cpp              |   8 +-
 .../default/xui/en/menu_attachment_self.xml   | 210 ++++++++++++++++--
 .../skins/default/xui/en/menu_avatar_self.xml |   2 +-
 .../skins/default/xui/en/menu_viewer.xml      | 186 +++++++++++++++-
 7 files changed, 404 insertions(+), 20 deletions(-)

diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 5568a844943..c2698fa6481 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -79,7 +79,7 @@ const U32 LEFT_PAD_PIXELS = 3;
 const U32 LEFT_WIDTH_PIXELS = 15;
 const U32 LEFT_PLAIN_PIXELS = LEFT_PAD_PIXELS + LEFT_WIDTH_PIXELS;
 
-const U32 RIGHT_PAD_PIXELS = 2;
+const U32 RIGHT_PAD_PIXELS = 7;
 const U32 RIGHT_WIDTH_PIXELS = 15;
 const U32 RIGHT_PLAIN_PIXELS = RIGHT_PAD_PIXELS + RIGHT_WIDTH_PIXELS;
 
@@ -95,7 +95,7 @@ const std::string SEPARATOR_NAME("separator");
 const std::string VERTICAL_SEPARATOR_LABEL( "|" );
 
 const std::string LLMenuGL::BOOLEAN_TRUE_PREFIX( "\xE2\x9C\x94" ); // U+2714 HEAVY CHECK MARK
-const std::string LLMenuGL::BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE
+const std::string LLMenuGL::BRANCH_SUFFIX( "\xe2\x96\xb8" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE
 const std::string LLMenuGL::ARROW_UP  ("^^^^^^^");
 const std::string LLMenuGL::ARROW_DOWN("vvvvvvv");
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 34b4d7f3b39..12d13a78a24 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -186,11 +186,15 @@ const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"
 LLMenuGL* gAttachSubMenu = NULL;
 LLMenuGL* gDetachSubMenu = NULL;
 LLMenuGL* gTakeOffClothes = NULL;
+LLMenuGL* gDetachAvatarMenu = NULL;
+LLMenuGL* gDetachHUDAvatarMenu = NULL;
 LLContextMenu* gAttachScreenPieMenu = NULL;
 LLContextMenu* gAttachPieMenu = NULL;
 LLContextMenu* gAttachBodyPartPieMenus[9];
 LLContextMenu* gDetachPieMenu = NULL;
 LLContextMenu* gDetachScreenPieMenu = NULL;
+LLContextMenu* gDetachAttSelfMenu = NULL;
+LLContextMenu* gDetachHUDAttSelfMenu = NULL;
 LLContextMenu* gDetachBodyPartPieMenus[9];
 
 //
@@ -445,6 +449,9 @@ void init_menus()
 	gMenuAttachmentOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
 		"menu_attachment_other.xml", gMenuHolder, registry);
 
+	gDetachHUDAttSelfMenu = gMenuHolder->getChild<LLContextMenu>("Detach Self HUD", true);
+	gDetachAttSelfMenu = gMenuHolder->getChild<LLContextMenu>("Detach Self", true);
+
 	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(
 		"menu_land.xml", gMenuHolder, registry);
 
@@ -501,6 +508,9 @@ void init_menus()
 	gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
 	gDetachSubMenu = gMenuBarView->findChildMenuByName("Detach Object", TRUE);
 
+	gDetachAvatarMenu = gMenuHolder->getChild<LLMenuGL>("Avatar Detach", true);
+	gDetachHUDAvatarMenu = gMenuHolder->getChild<LLMenuGL>("Avatar Detach HUD", true);
+
 	// Don't display the Memory console menu if the feature is turned off
 	LLMenuItemCheckGL *memoryMenu = gMenuBarView->getChild<LLMenuItemCheckGL>("Memory", TRUE);
 	if (memoryMenu)
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 0f63c8cf583..36b6971c817 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -188,10 +188,14 @@ extern LLContextMenu		*gMenuMuteParticle;
 extern LLMenuGL* gAttachSubMenu;
 extern LLMenuGL* gDetachSubMenu;
 extern LLMenuGL* gTakeOffClothes;
+extern LLMenuGL* gDetachAvatarMenu;
+extern LLMenuGL* gDetachHUDAvatarMenu;
 extern LLContextMenu* gAttachScreenPieMenu;
 extern LLContextMenu* gDetachScreenPieMenu;
+extern LLContextMenu* gDetachHUDAttSelfMenu;
 extern LLContextMenu* gAttachPieMenu;
 extern LLContextMenu* gDetachPieMenu;
+extern LLContextMenu* gDetachAttSelfMenu;
 extern LLContextMenu* gAttachBodyPartPieMenus[9];
 extern LLContextMenu* gDetachBodyPartPieMenus[9];
 
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index aea12380e84..d2dc139d4be 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -465,6 +465,8 @@ BOOL LLVOAvatarSelf::buildMenus()
 		if (gDetachBodyPartPieMenus[i])
 		{
 			gDetachPieMenu->appendContextSubMenu( gDetachBodyPartPieMenus[i] );
+			gDetachAttSelfMenu->appendContextSubMenu(gDetachBodyPartPieMenus[i]);
+			gDetachAvatarMenu->appendContextSubMenu(gDetachBodyPartPieMenus[i]);
 		}
 		else
 		{
@@ -493,12 +495,14 @@ BOOL LLVOAvatarSelf::buildMenus()
 					LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 
 					gDetachPieMenu->addChild(item);
-						
+					gDetachAttSelfMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));
+					gDetachAvatarMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));
 					break;
 				}
 			}
 		}
 	}
+	
 
 	// add screen attachments
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
@@ -532,6 +536,8 @@ BOOL LLVOAvatarSelf::buildMenus()
 			item_params.on_enable.parameter = iter->first;
 			item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 			gDetachScreenPieMenu->addChild(item);
+			gDetachHUDAttSelfMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));
+			gDetachHUDAvatarMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));
 		}
 	}
 
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 03c05e65914..856bf4ce732 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -2,17 +2,6 @@
 <context_menu
  layout="topleft"
  name="Attachment Pie">
-    <menu_item_call
-     enabled="false"
-     label="Touch item"
-     layout="topleft"
-     name="Attachment Object Touch">
-        <menu_item_call.on_click
-         function="Object.Touch" />
-        <menu_item_call.on_enable
-         function="Object.EnableTouch"
-         name="EnableTouch"/>
-    </menu_item_call>
     <menu_item_call
      enabled="false"
      label="Edit item"
@@ -33,8 +22,19 @@
         <menu_item_call.on_enable
          function="Attachment.EnableDetach" />
     </menu_item_call>
-  <menu_item_separator
-    layout="topleft" />
+    <menu_item_call
+     enabled="false"
+     label="Touch item"
+     layout="topleft"
+     name="Attachment Object Touch">
+        <menu_item_call.on_click
+         function="Object.Touch" />
+        <menu_item_call.on_enable
+         function="Object.EnableTouch"
+         name="EnableTouch"/>
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
 
   <menu_item_call
   label="Outfits..."
@@ -44,7 +44,7 @@
     <menu_item_call.on_enable
      function="Edit.EnableCustomizeAvatar" />
   </menu_item_call>
-  <menu_item_call label="Edit current outfit..."
+  <menu_item_call label="Current outfit..."
 layout="topleft"
 name="Edit Outfit">
     <menu_item_call.on_click
@@ -68,6 +68,188 @@ name="Edit Outfit">
      <menu_item_call.on_enable
       function="Edit.EnableHoverHeight" />
   </menu_item_call>
+  <context_menu
+  label="Take Off"
+  layout="topleft"
+  name="Take Off &gt;">
+    <context_menu
+     label="Clothes"
+     layout="topleft"
+     name="Clothes &gt;">
+      <menu_item_call
+       enabled="false"
+       label="Shirt"
+       layout="topleft"
+       name="Shirt">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="shirt" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="shirt" />
+      </menu_item_call>
+      <menu_item_call
+       enabled="false"
+       label="Pants"
+       layout="topleft"
+       name="Pants">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="pants" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="pants" />
+      </menu_item_call>
+      <menu_item_call
+       enabled="false"
+       label="Skirt"
+       layout="topleft"
+       name="Skirt">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="skirt" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="skirt" />
+      </menu_item_call>
+      <menu_item_call
+       enabled="false"
+       label="Shoes"
+       layout="topleft"
+       name="Shoes">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="shoes" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="shoes" />
+      </menu_item_call>
+      <menu_item_call
+       enabled="false"
+       label="Socks"
+       layout="topleft"
+       name="Socks">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="socks" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="socks" />
+      </menu_item_call>
+      <menu_item_call
+       enabled="false"
+       label="Jacket"
+       layout="topleft"
+       name="Jacket">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="jacket" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="jacket" />
+      </menu_item_call>
+      <menu_item_call
+       enabled="false"
+       label="Gloves"
+       layout="topleft"
+       name="Gloves">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="gloves" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="gloves" />
+      </menu_item_call>
+      <menu_item_call
+            enabled="false"
+            label="Undershirt"
+            layout="topleft"
+            name="Self Undershirt">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="undershirt" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="undershirt" />
+      </menu_item_call>
+      <menu_item_call
+        enabled="false"
+        label="Underpants"
+        layout="topleft"
+        name="Self Underpants">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="underpants" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="underpants" />
+      </menu_item_call>
+      <menu_item_call
+        enabled="false"
+        label="Tattoo"
+        layout="topleft"
+        name="Self Tattoo">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="tattoo" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="tattoo" />
+      </menu_item_call>
+      <menu_item_call
+        enabled="false"
+        label="Physics"
+        layout="topleft"
+        name="Self Physics">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="physics" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="physics" />
+      </menu_item_call>
+      <menu_item_call
+        enabled="false"
+        label="Alpha"
+        layout="topleft"
+        name="Self Alpha">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="alpha" />
+        <menu_item_call.on_enable
+         function="Edit.EnableTakeOff"
+         parameter="alpha" />
+      </menu_item_call>
+      <menu_item_separator
+       layout="topleft" />
+      <menu_item_call
+       label="All Clothes"
+       layout="topleft"
+       name="All Clothes">
+        <menu_item_call.on_click
+         function="Edit.TakeOff"
+         parameter="all" />
+      </menu_item_call>
+    </context_menu>
+    <context_menu
+     label="HUD"
+     layout="topleft"
+     name="Detach Self HUD" />
+    <context_menu
+     label="Detach"
+     layout="topleft"
+     name="Detach Self" />
+    <menu_item_call
+     label="Detach All"
+     layout="topleft"
+     name="Detach All">
+      <menu_item_call.on_click
+       function="Self.RemoveAllAttachments"
+       parameter="" />
+      <menu_item_call.on_enable
+       function="Self.EnableRemoveAllAttachments" />
+    </menu_item_call>
+  </context_menu>
   <menu_item_separator/>
   <menu_item_call
     label="Sit / stand"
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 3dcafb13efd..a46d9aed55f 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -11,7 +11,7 @@
         <menu_item_call.on_enable
          function="Edit.EnableCustomizeAvatar" />
     </menu_item_call>
-    <menu_item_call label="Edit current outfit..." 
+    <menu_item_call label="Current outfit..." 
     layout="topleft"
     name="Edit Outfit">
        <menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index c70d8097ae1..0d456ffe5db 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -207,6 +207,188 @@
             <menu_item_call.on_enable
              function="Edit.EnableHoverHeight" />
       </menu_item_call>
+      <menu
+        label="Take Off"
+        layout="topleft"
+        name="Take Off &gt;">
+        <menu
+         label="Clothes"
+         layout="topleft"
+         name="Clothes &gt;">
+          <menu_item_call
+           enabled="false"
+           label="Shirt"
+           layout="topleft"
+           name="Shirt">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="shirt" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="shirt" />
+          </menu_item_call>
+          <menu_item_call
+           enabled="false"
+           label="Pants"
+           layout="topleft"
+           name="Pants">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="pants" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="pants" />
+          </menu_item_call>
+          <menu_item_call
+           enabled="false"
+           label="Skirt"
+           layout="topleft"
+           name="Skirt">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="skirt" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="skirt" />
+          </menu_item_call>
+          <menu_item_call
+           enabled="false"
+           label="Shoes"
+           layout="topleft"
+           name="Shoes">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="shoes" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="shoes" />
+          </menu_item_call>
+          <menu_item_call
+           enabled="false"
+           label="Socks"
+           layout="topleft"
+           name="Socks">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="socks" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="socks" />
+          </menu_item_call>
+          <menu_item_call
+           enabled="false"
+           label="Jacket"
+           layout="topleft"
+           name="Jacket">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="jacket" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="jacket" />
+          </menu_item_call>
+          <menu_item_call
+           enabled="false"
+           label="Gloves"
+           layout="topleft"
+           name="Gloves">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="gloves" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="gloves" />
+          </menu_item_call>
+          <menu_item_call
+                enabled="false"
+                label="Undershirt"
+                layout="topleft"
+                name="Self Undershirt">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="undershirt" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="undershirt" />
+          </menu_item_call>
+          <menu_item_call
+            enabled="false"
+            label="Underpants"
+            layout="topleft"
+            name="Self Underpants">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="underpants" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="underpants" />
+          </menu_item_call>
+          <menu_item_call
+            enabled="false"
+            label="Tattoo"
+            layout="topleft"
+            name="Self Tattoo">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="tattoo" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="tattoo" />
+          </menu_item_call>
+          <menu_item_call
+            enabled="false"
+            label="Physics"
+            layout="topleft"
+            name="Self Physics">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="physics" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="physics" />
+          </menu_item_call>
+          <menu_item_call
+            enabled="false"
+            label="Alpha"
+            layout="topleft"
+            name="Self Alpha">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="alpha" />
+            <menu_item_call.on_enable
+             function="Edit.EnableTakeOff"
+             parameter="alpha" />
+          </menu_item_call>
+          <menu_item_separator
+           layout="topleft" />
+          <menu_item_call
+           label="All Clothes"
+           layout="topleft"
+           name="All Clothes">
+            <menu_item_call.on_click
+             function="Edit.TakeOff"
+             parameter="all" />
+          </menu_item_call>
+        </menu>
+        <menu
+         label="HUD"
+         layout="topleft"
+         name="Avatar Detach HUD" />
+        <menu
+         label="Detach"
+         layout="topleft"
+         name="Avatar Detach" />
+        <menu_item_call
+         label="Detach All"
+         layout="topleft"
+         name="Detach All">
+          <menu_item_call.on_click
+           function="Self.RemoveAllAttachments"
+           parameter="" />
+          <menu_item_call.on_enable
+           function="Self.EnableRemoveAllAttachments" />
+        </menu_item_call>
+      </menu>
       <menu_item_separator/>
 
        <menu_item_call
@@ -229,7 +411,7 @@
            function="Agent.enableFlyLand" />
         </menu_item_call>       
         <menu_item_call
-         label="Stop animation"
+         label="Stop animations"
          name="Stop Animating My Avatar">
           <menu_item_call.on_click
            function="Tools.StopAllAnimations" />
@@ -293,7 +475,7 @@
      name="Help with avatars">
         <menu_item_call.on_click
             function="Advanced.ShowURL"
-            parameter="https://community.secondlife.com/search/?q=avatar"/>
+            parameter="https://community.secondlife.com/search/?type=cms_records3&amp;tags=avatar&amp;nodes=30&amp;search_and_or=or"/>
       </menu_item_call>
     </menu>
     <menu
-- 
GitLab