From f363646eb71d58007fc4936a67ad9c7bde9b93ac Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 2 Jun 2020 21:53:28 +0300
Subject: [PATCH] SL-13359 #2 UI changes for panel object

todo: new icons, separator and some repositioning
---
 indra/newview/llpanelobject.cpp               | 82 +++++++++++++++++--
 indra/newview/llpanelobject.h                 |  7 ++
 .../skins/default/xui/en/floater_tools.xml    | 64 ++++++++++++---
 .../default/xui/en/menu_copy_paste_pos.xml    | 21 +++++
 .../default/xui/en/menu_copy_paste_rot.xml    | 21 +++++
 .../default/xui/en/menu_copy_paste_size.xml   | 21 +++++
 6 files changed, 197 insertions(+), 19 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/menu_copy_paste_pos.xml
 create mode 100644 indra/newview/skins/default/xui/en/menu_copy_paste_rot.xml
 create mode 100644 indra/newview/skins/default/xui/en/menu_copy_paste_size.xml

diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 5fd9655201a..e6bbac82474 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -118,8 +118,9 @@ BOOL	LLPanelObject::postBuild()
 	// Phantom checkbox
 	mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
 	childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
-       
+
 	// Position
+	mMenuPastePos = getChild<LLMenuButton>("paste_pos_btn");
 	mLabelPosition = getChild<LLTextBox>("label position");
 	mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
 	childSetCommitCallback("Pos X",onCommitPosition,this);
@@ -129,6 +130,7 @@ BOOL	LLPanelObject::postBuild()
 	childSetCommitCallback("Pos Z",onCommitPosition,this);
 
 	// Scale
+	mMenuPasteSize = getChild<LLMenuButton>("paste_size_btn");
 	mLabelSize = getChild<LLTextBox>("label size");
 	mCtrlScaleX = getChild<LLSpinCtrl>("Scale X");
 	childSetCommitCallback("Scale X",onCommitScale,this);
@@ -142,6 +144,7 @@ BOOL	LLPanelObject::postBuild()
 	childSetCommitCallback("Scale Z",onCommitScale,this);
 
 	// Rotation
+	mMenuPasteRot = getChild<LLMenuButton>("paste_rot_btn");
 	mLabelRotation = getChild<LLTextBox>("label rotation");
 	mCtrlRotX = getChild<LLSpinCtrl>("Rot X");
 	childSetCommitCallback("Rot X",onCommitRotation,this);
@@ -291,6 +294,8 @@ LLPanelObject::LLPanelObject()
     mHasRotClipboard(FALSE),
 	mSizeChanged(FALSE)
 {
+    mCommitCallbackRegistrar.add("PanelObject.menuDoToSelected", boost::bind(&LLPanelObject::menuDoToSelected, this, _2));
+    mEnableCallbackRegistrar.add("PanelObject.menuEnable", boost::bind(&LLPanelObject::menuEnableItem, this, _2));
 }
 
 
@@ -377,7 +382,7 @@ void LLPanelObject::getState( )
 		calcp->clearVar(LLCalc::Z_POS);
 	}
 
-
+	mMenuPastePos->setEnabled(enable_move);
 	mLabelPosition->setEnabled( enable_move );
 	mCtrlPosX->setEnabled(enable_move);
 	mCtrlPosY->setEnabled(enable_move);
@@ -403,6 +408,7 @@ void LLPanelObject::getState( )
 		calcp->setVar(LLCalc::Z_SCALE, 0.f);
 	}
 
+	mMenuPasteSize->setEnabled(enable_scale);
 	mLabelSize->setEnabled( enable_scale );
 	mCtrlScaleX->setEnabled( enable_scale );
 	mCtrlScaleY->setEnabled( enable_scale );
@@ -434,6 +440,7 @@ void LLPanelObject::getState( )
 		calcp->clearVar(LLCalc::Z_ROT);
 	}
 
+	mMenuPasteRot->setEnabled(enable_rotate);
 	mLabelRotation->setEnabled( enable_rotate );
 	mCtrlRotX->setEnabled( enable_rotate );
 	mCtrlRotY->setEnabled( enable_rotate );
@@ -1648,6 +1655,8 @@ void LLPanelObject::sendPosition(BOOL btn_down)
 	LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
 	LLViewerRegion* regionp = mObject->getRegion();
 
+	if (!regionp) return;
+
 	// Clamp the Z height
 	const F32 height = newpos.mV[VZ];
 	const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal());
@@ -2005,6 +2014,57 @@ void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
 	self->sendSculpt();
 }
 
+void LLPanelObject::menuDoToSelected(const LLSD& userdata)
+{
+    std::string command = userdata.asString();
+
+    // paste
+    if (command == "pos_paste")
+    {
+        onPastePos();
+    }
+    else if (command == "size_paste")
+    {
+        onPasteSize();
+    }
+    else if (command == "rot_paste")
+    {
+        onPasteRot();
+    }
+    // copy
+    else if (command == "pos_copy")
+    {
+        onCopyPos();
+    }
+    else if (command == "size_copy")
+    {
+        onCopySize();
+    }
+    else if (command == "rot_copy")
+    {
+        onCopyRot();
+    }
+}
+
+bool LLPanelObject::menuEnableItem(const LLSD& userdata)
+{
+    std::string command = userdata.asString();
+
+    if (command == "pos_paste")
+    {
+        return mHasPosClipboard;
+    }
+    else if (command == "size_paste")
+    {
+        return mHasSizeClipboard;
+    }
+    else if (command == "rot_paste")
+    {
+        return mHasRotClipboard;
+    }
+    return false;
+}
+
 void LLPanelObject::onCopyPos()
 {
     mClipboardPos = LLVector3(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
@@ -2037,14 +2097,20 @@ void LLPanelObject::onCopyRot()
 
 void LLPanelObject::onPastePos()
 {
-    if(!mHasPosClipboard) return;
+    if (!mHasPosClipboard) return;
+    if (mObject.isNull()) return;
+
+    LLViewerRegion* regionp = mObject->getRegion();
+    if (!regionp) return;
+
 
     // Clamp pos on non-attachments, just keep the prims within the region
     if (!mObject->isAttachment())
     {
-        mClipboardPos.mV[VX] = llclamp( mClipboardPos.mV[VX], 0.f, 256.f);
-        mClipboardPos.mV[VY] = llclamp( mClipboardPos.mV[VY], 0.f, 256.f);
-        //height will get properly clammed by sendPosition
+        F32 max_width = regionp->getWidth(); // meters
+        mClipboardPos.mV[VX] = llclamp(mClipboardPos.mV[VX], 0.f, max_width);
+        mClipboardPos.mV[VY] = llclamp(mClipboardPos.mV[VY], 0.f, max_width);
+        //height will get properly clamped by sendPosition
     }
 
     mCtrlPosX->set( mClipboardPos.mV[VX] );
@@ -2056,7 +2122,7 @@ void LLPanelObject::onPastePos()
 
 void LLPanelObject::onPasteSize()
 {
-    if(!mHasSizeClipboard) return;
+    if (!mHasSizeClipboard) return;
 
     mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], MIN_PRIM_SCALE, DEFAULT_MAX_PRIM_SCALE);
     mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], MIN_PRIM_SCALE, DEFAULT_MAX_PRIM_SCALE);
@@ -2071,7 +2137,7 @@ void LLPanelObject::onPasteSize()
 
 void LLPanelObject::onPasteRot()
 {
-    if(!mHasRotClipboard) return;
+    if (!mHasRotClipboard) return;
 
     mCtrlRotX->set( mClipboardRot.mV[VX] );
     mCtrlRotY->set( mClipboardRot.mV[VY] );
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index e9b9254a782..e8f8d0eb9ae 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -37,6 +37,7 @@ class LLCheckBoxCtrl;
 class LLTextBox;
 class LLUICtrl;
 class LLButton;
+class LLMenuButton;
 class LLViewerObject;
 class LLComboBox;
 class LLColorSwatchCtrl;
@@ -81,6 +82,9 @@ class LLPanelObject : public LLPanel
 	BOOL     		onDropSculpt(LLInventoryItem* item);
 	static void     onCommitSculptType(    LLUICtrl *ctrl, void* userdata);
 
+    void            menuDoToSelected(const LLSD& userdata);
+    bool            menuEnableItem(const LLSD& userdata);
+
 protected:
 	void			getState();
 
@@ -137,17 +141,20 @@ class LLPanelObject : public LLPanel
 	LLTextBox*		mLabelRevolutions;
 	LLSpinCtrl*		mSpinRevolutions;
 
+    LLMenuButton*   mMenuPastePos;
 	LLTextBox*		mLabelPosition;
 	LLSpinCtrl*		mCtrlPosX;
 	LLSpinCtrl*		mCtrlPosY;
 	LLSpinCtrl*		mCtrlPosZ;
 
+    LLMenuButton*   mMenuPasteSize;
 	LLTextBox*		mLabelSize;
 	LLSpinCtrl*		mCtrlScaleX;
 	LLSpinCtrl*		mCtrlScaleY;
 	LLSpinCtrl*		mCtrlScaleZ;
 	BOOL			mSizeChanged;
 
+    LLMenuButton*   mMenuPasteRot;
 	LLTextBox*		mLabelRotation;
 	LLSpinCtrl*		mCtrlRotX;
 	LLSpinCtrl*		mCtrlRotY;
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 0abee2ff807..2397be6b610 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1430,6 +1430,18 @@ even though the user gets a free copy.
              tool_tip="Causes object to not collide with other objects or avatars"
              top_pad="0"
              width="123" />
+            <menu_button
+             menu_filename="menu_copy_paste_pos.xml"
+             follows="top|left"
+             height="11"
+             image_disabled="OptionsMenu_Disabled"
+             image_selected="OptionsMenu_Press"
+             image_unselected="OptionsMenu_Off"
+             layout="topleft"
+             top_pad="10"
+             name="paste_pos_btn"
+             tool_tip="Paste options"
+             width="19"/>
         <text
              type="string"
              length="1"
@@ -1437,9 +1449,11 @@ even though the user gets a free copy.
              height="10"
              layout="topleft"
              name="label position"
-             top_pad="10"
+             tool_tip="Position (meters)"
+             left_pad="3"
+             top_delta="0"
              width="121">
-                Position (meters)
+                Position
             </text>
             <spinner
              follows="left|top"
@@ -1449,7 +1463,7 @@ even though the user gets a free copy.
              label="X"
              label_width="10"
              layout="topleft"
-             left_delta="0"
+             left_delta="-22"
              max_val="512"
              min_val="-256"
              name="Pos X"
@@ -1485,17 +1499,31 @@ even though the user gets a free copy.
              text_enabled_color="0 0.8 1 .65"
              top_pad="3"
              width="87" />
+            <menu_button
+             menu_filename="menu_copy_paste_size.xml"
+             follows="top|left"
+             height="11"
+             image_disabled="OptionsMenu_Disabled"
+             image_selected="OptionsMenu_Press"
+             image_unselected="OptionsMenu_Off"
+             layout="topleft"
+             left_delta="0"
+             top_pad="10"
+             name="paste_size_btn"
+             tool_tip="Paste options"
+             width="19"/>
             <text
              type="string"
              length="1"
              follows="left|top"
              height="10"
              layout="topleft"
-             left_delta="0"
+             left_pad="3"
+             top_delta="0"
              name="label size"
-             top_pad="6"
+             tool_tip="Size (meters)"
              width="121">
-                Size (meters)
+                Size
             </text>
             <spinner
              follows="left|top"
@@ -1505,7 +1533,7 @@ even though the user gets a free copy.
              label="X"
              label_width="10"
              layout="topleft"
-             left_delta="0"
+             left_delta="-22"
              max_val="64"
              min_val="0.01"
              name="Scale X"
@@ -1542,17 +1570,31 @@ even though the user gets a free copy.
              text_enabled_color="1 1 1 1"
              top_pad="3"
              width="87" />
+            <menu_button
+             menu_filename="menu_copy_paste_rot.xml"
+             follows="top|left"
+             height="11"
+             image_disabled="OptionsMenu_Disabled"
+             image_selected="OptionsMenu_Press"
+             image_unselected="OptionsMenu_Off"
+             layout="topleft"
+             left_delta="0"
+             top_pad="10"
+             name="paste_rot_btn"
+             tool_tip="Paste options"
+             width="19"/>
             <text
              type="string"
              length="1"
              follows="left|top"
              height="10"
              layout="topleft"
-             left_delta="0"
+             left_pad="3"
+             top_delta="0"
              name="label rotation"
-             top_pad="10"
+             tool_tip="Rotation (degrees)"
              width="121">
-                Rotation (degrees)
+                Rotation
             </text>
             <spinner
              decimal_digits="2"
@@ -1563,7 +1605,7 @@ even though the user gets a free copy.
              label="X"
              label_width="10"
              layout="topleft"
-             left_delta="0"
+             left_delta="-22"
              max_val="9999"
              min_val="-9999"
              name="Rot X"
diff --git a/indra/newview/skins/default/xui/en/menu_copy_paste_pos.xml b/indra/newview/skins/default/xui/en/menu_copy_paste_pos.xml
new file mode 100644
index 00000000000..c2763af603e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_copy_paste_pos.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="Copy Paste Position Menu">
+    <menu_item_call
+     label="Copy Position"
+     layout="topleft"
+     name="pos_copy"
+     visible="true">
+        <on_click function="PanelObject.menuDoToSelected" parameter="pos_copy" />
+    </menu_item_call>
+    <menu_item_call
+     label="Paste Position"
+     layout="topleft"
+     name="pos_paste"
+     visible="true">
+      <on_click function="PanelObject.menuDoToSelected" parameter="pos_paste" />
+      <on_enable function="PanelObject.menuEnable" parameter="pos_paste" />
+    </menu_item_call>
+</toggleable_menu>
+
diff --git a/indra/newview/skins/default/xui/en/menu_copy_paste_rot.xml b/indra/newview/skins/default/xui/en/menu_copy_paste_rot.xml
new file mode 100644
index 00000000000..dcfb3faeca5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_copy_paste_rot.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="Copy Paste Rotation Menu">
+    <menu_item_call
+     label="Copy Rotation"
+     layout="topleft"
+     name="rot_copy"
+     visible="true">
+        <on_click function="PanelObject.menuDoToSelected" parameter="rot_copy" />
+    </menu_item_call>
+    <menu_item_call
+     label="Paste Rotation"
+     layout="topleft"
+     name="rot_paste"
+     visible="true">
+      <on_click function="PanelObject.menuDoToSelected" parameter="rot_paste" />
+      <on_enable function="PanelObject.menuEnable" parameter="rot_paste" />
+    </menu_item_call>
+</toggleable_menu>
+
diff --git a/indra/newview/skins/default/xui/en/menu_copy_paste_size.xml b/indra/newview/skins/default/xui/en/menu_copy_paste_size.xml
new file mode 100644
index 00000000000..58d71b12d54
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_copy_paste_size.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="Copy Paste Size Menu">
+    <menu_item_call
+     label="Copy Size"
+     layout="topleft"
+     name="size_copy"
+     visible="true">
+        <on_click function="PanelObject.menuDoToSelected" parameter="size_copy" />
+    </menu_item_call>
+    <menu_item_call
+     label="Paste Size"
+     layout="topleft"
+     name="size_paste"
+     visible="true">
+      <on_click function="PanelObject.menuDoToSelected" parameter="size_paste" />
+      <on_enable function="PanelObject.menuEnable" parameter="size_paste" />
+    </menu_item_call>
+</toggleable_menu>
+
-- 
GitLab