summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llpanelobject.cpp404
-rw-r--r--indra/newview/llpanelobject.h35
-rw-r--r--indra/newview/skins/default/textures/icons/Paste.pngbin0 -> 530 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml149
5 files changed, 568 insertions, 21 deletions
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 3665910c63..1e462876ee 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -33,6 +33,7 @@
#include "lleconomy.h"
#include "llerror.h"
#include "llfontgl.h"
+#include "material_codes.h" // LL_MCODE_MASK
#include "llpermissionsflags.h"
#include "llstring.h"
#include "llvolume.h"
@@ -46,6 +47,8 @@
#include "llcolorswatch.h"
#include "llcombobox.h"
#include "llfocusmgr.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
#include "llmanipscale.h"
#include "llpreviewscript.h"
#include "llresmgr.h"
@@ -150,6 +153,30 @@ BOOL LLPanelObject::postBuild()
mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z");
childSetCommitCallback("Rot Z",onCommitRotation,this);
+ // Copy/paste pos
+ mBtnCopyPos = getChild<LLButton>("copy_pos_btn");
+ mBtnCopyPos->setCommitCallback( boost::bind(&LLPanelObject::onCopyPos, this, _2 ));
+ mBtnPastePos = getChild<LLButton>("paste_pos_btn");
+ mBtnPastePos->setCommitCallback( boost::bind(&LLPanelObject::onPastePos, this, _2 ));
+
+ // Copy/paste size
+ mBtnCopySize = getChild<LLButton>("copy_size_btn");
+ mBtnCopySize->setCommitCallback( boost::bind(&LLPanelObject::onCopySize, this, _2 ));
+ mBtnPasteSize = getChild<LLButton>("paste_size_btn");
+ mBtnPasteSize->setCommitCallback( boost::bind(&LLPanelObject::onPasteSize, this, _2 ));
+
+ // Copy/paste rot
+ mBtnCopyRot = getChild<LLButton>("copy_rot_btn");
+ mBtnCopyRot->setCommitCallback( boost::bind(&LLPanelObject::onCopyRot, this, _2 ));
+ mBtnPasteRot = getChild<LLButton>("paste_rot_btn");
+ mBtnPasteRot->setCommitCallback( boost::bind(&LLPanelObject::onPasteRot, this, _2 ));;
+
+ // Copy/paste obj prams
+ mBtnCopyParams = getChild<LLButton>("copy_params_btn");
+ mBtnCopyParams->setCommitCallback( boost::bind(&LLPanelObject::onCopyParams, this, _2 ));
+ mBtnPasteParams = getChild<LLButton>("paste_params_btn");
+ mBtnPasteParams->setCommitCallback( boost::bind(&LLPanelObject::onPasteParams, this, _2 ));
+
//--------------------------------------------------------
// Base Type
@@ -286,7 +313,10 @@ LLPanelObject::LLPanelObject()
mSelectedType(MI_BOX),
mSculptTextureRevert(LLUUID::null),
mSculptTypeRevert(0),
- mSizeChanged(FALSE)
+ mSizeChanged(FALSE),
+ mHasPosClipboard(FALSE),
+ mHasSizeClipboard(FALSE),
+ mHasRotClipboard(FALSE)
{
}
@@ -379,6 +409,8 @@ void LLPanelObject::getState( )
mCtrlPosX->setEnabled(enable_move);
mCtrlPosY->setEnabled(enable_move);
mCtrlPosZ->setEnabled(enable_move);
+ mBtnCopyPos->setEnabled(enable_move);
+ mBtnPastePos->setEnabled(enable_move && mHasPosClipboard);
if (enable_scale)
{
@@ -404,6 +436,8 @@ void LLPanelObject::getState( )
mCtrlScaleX->setEnabled( enable_scale );
mCtrlScaleY->setEnabled( enable_scale );
mCtrlScaleZ->setEnabled( enable_scale );
+ mBtnCopySize->setEnabled( enable_scale );
+ mBtnPasteSize->setEnabled( enable_scale && mHasSizeClipboard );
LLQuaternion object_rot = objectp->getRotationEdit();
object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ]));
@@ -435,6 +469,11 @@ void LLPanelObject::getState( )
mCtrlRotX->setEnabled( enable_rotate );
mCtrlRotY->setEnabled( enable_rotate );
mCtrlRotZ->setEnabled( enable_rotate );
+ mBtnCopyRot->setEnabled( enable_rotate );
+ mBtnPasteRot->setEnabled( enable_rotate && mHasRotClipboard );
+
+ mBtnCopyParams->setEnabled( single_volume && enable_modify );
+ mBtnPasteParams->setEnabled( single_volume && enable_modify );
LLUUID owner_id;
std::string owner_name;
@@ -2001,3 +2040,366 @@ void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
self->sendSculpt();
}
+
+void copy_vector_to_clipboard(const LLVector3& vec)
+{
+ std::string stringVec = llformat("<%g, %g, %g>", vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
+ LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(stringVec));
+}
+
+void LLPanelObject::onCopyPos(const LLSD& data)
+{
+ mClipboardPos = LLVector3(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
+
+ copy_vector_to_clipboard(mClipboardPos);
+
+ mBtnPastePos->setToolTip(llformat("Paste Position\n<%g, %g, %g>", mClipboardPos.mV[VX], mClipboardPos.mV[VY], mClipboardPos.mV[VZ]));
+ mBtnPastePos->setEnabled(TRUE);
+
+ mHasPosClipboard = TRUE;
+}
+
+void LLPanelObject::onCopySize(const LLSD& data)
+{
+ mClipboardSize = LLVector3(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());
+
+ copy_vector_to_clipboard(mClipboardSize);
+
+ mBtnPasteSize->setToolTip(llformat("Paste Size\n<%g, %g, %g>", mClipboardSize.mV[VX], mClipboardSize.mV[VY], mClipboardSize.mV[VZ]));
+ mBtnPasteSize->setEnabled(TRUE);
+
+ mHasSizeClipboard = TRUE;
+}
+
+void LLPanelObject::onCopyRot(const LLSD& data)
+{
+ mClipboardRot = LLVector3(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get());
+
+ copy_vector_to_clipboard(mClipboardRot);
+
+ mBtnPasteRot->setToolTip(llformat("Paste Rotation\n<%g, %g, %g>", mClipboardRot.mV[VX], mClipboardRot.mV[VY], mClipboardRot.mV[VZ]));
+ mBtnPasteRot->setEnabled(TRUE);
+
+ mHasRotClipboard = TRUE;
+}
+
+void LLPanelObject::onPastePos(const LLSD& data)
+{
+ if(!mHasPosClipboard) 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
+ }
+
+ mCtrlPosX->set( mClipboardPos.mV[VX] );
+ mCtrlPosY->set( mClipboardPos.mV[VY] );
+ mCtrlPosZ->set( mClipboardPos.mV[VZ] );
+
+ sendPosition(FALSE);
+}
+
+void LLPanelObject::onPasteSize(const LLSD& data)
+{
+ 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);
+ mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], MIN_PRIM_SCALE, DEFAULT_MAX_PRIM_SCALE);
+
+ mCtrlScaleX->set( mClipboardSize.mV[VX] );
+ mCtrlScaleY->set( mClipboardSize.mV[VY] );
+ mCtrlScaleZ->set( mClipboardSize.mV[VZ] );
+
+ sendScale(FALSE);
+}
+
+void LLPanelObject::onPasteRot(const LLSD& data)
+{
+ if(!mHasRotClipboard) return;
+
+ mCtrlRotX->set( mClipboardRot.mV[VX] );
+ mCtrlRotY->set( mClipboardRot.mV[VY] );
+ mCtrlRotZ->set( mClipboardRot.mV[VZ] );
+
+ sendRotation(FALSE);
+}
+
+void LLPanelObject::onCopyParams(const LLSD& data)
+{
+ LLViewerObject* objectp = mObject;
+ if (!objectp)
+ {
+ return;
+ }
+
+ // Parametrics
+ getVolumeParams(mClipboardVolumeParams);
+ mHasParamsClipboard = TRUE;
+
+ LLVOVolume *volobjp = NULL;
+ if (objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
+ {
+ volobjp = (LLVOVolume *)objectp;
+ }
+
+ // Flexi Prim
+ if (volobjp && volobjp->isFlexible())
+ {
+ LLFlexibleObjectData *attributes = (LLFlexibleObjectData *)objectp->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE);
+ if (attributes)
+ {
+ mParamsClipboard["lod"] = attributes->getSimulateLOD();
+ mParamsClipboard["gav"] = attributes->getGravity();
+ mParamsClipboard["ten"] = attributes->getTension();
+ mParamsClipboard["fri"] = attributes->getAirFriction();
+ mParamsClipboard["sen"] = attributes->getWindSensitivity();
+ LLVector3 force = attributes->getUserForce();
+ mParamsClipboard["forx"] = force.mV[0];
+ mParamsClipboard["fory"] = force.mV[1];
+ mParamsClipboard["forz"] = force.mV[2];
+ mHasFlexiParam = TRUE;
+ }
+ }
+ else
+ {
+ mHasFlexiParam = FALSE;
+ }
+
+ // Sculpted Prim
+ // User is allowed to copy if they could otherwise recreate it manually
+ // ie. User has full perm copy of the sculpted texture in their inventory,
+ // or is a default texture or library asset.
+ if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+
+ LLUUID image_id = sculpt_params->getSculptTexture();
+ BOOL allow_texture = FALSE;
+ if (gInventory.isObjectDescendentOf(image_id, gInventory.getLibraryRootFolderID())
+ || image_id == LLUUID(gSavedSettings.getString( "DefaultObjectTexture" ))
+ || image_id == LLUUID(gSavedSettings.getString( "UIImgWhiteUUID" ))
+ || image_id == LLUUID(gSavedSettings.getString( "UIImgInvisibleUUID" ))
+ || image_id == LLUUID(SCULPT_DEFAULT_TEXTURE))
+ {
+ allow_texture = TRUE;
+ }
+ else
+ {
+ LLUUID inventory_item_id;
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLAssetIDMatches asset_id_matches(image_id);
+ gInventory.collectDescendentsIf(LLUUID::null,
+ cats,
+ items,
+ LLInventoryModel::INCLUDE_TRASH,
+ asset_id_matches);
+
+ if (items.size())
+ {
+ // search for copyable version first
+ for (S32 i = 0; i < items.size(); i++)
+ {
+ LLInventoryItem* itemp = items[i];
+ LLPermissions item_permissions = itemp->getPermissions();
+ if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
+ {
+ inventory_item_id = itemp->getUUID();
+ break;
+ }
+ }
+ }
+ if (inventory_item_id.notNull())
+ {
+ LLInventoryItem* itemp = gInventory.getItem(inventory_item_id);
+ if (itemp)
+ {
+ LLPermissions perm = itemp->getPermissions();
+ if ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
+ {
+ allow_texture = TRUE;
+ }
+ }
+ }
+ }
+ if (allow_texture)
+ {
+ mParamsClipboard["sculptid"] = image_id;
+ }
+ else
+ {
+ mParamsClipboard["sculptid"] = LLUUID(SCULPT_DEFAULT_TEXTURE);
+ }
+
+ mParamsClipboard["sculpt_type"] = sculpt_params->getSculptType();
+ mHasSculptParam = TRUE;
+ }
+ else
+ {
+ mHasSculptParam = FALSE;
+ }
+
+ // Light Source
+ // only captures basic settings
+ if (volobjp && volobjp->getIsLight())
+ {
+ mParamsClipboard["Light Intensity"] = volobjp->getLightIntensity();
+ mParamsClipboard["Light Radius"] = volobjp->getLightRadius();
+ mParamsClipboard["Light Falloff"] = volobjp->getLightFalloff();
+ LLColor3 color = volobjp->getLightColor();
+ mParamsClipboard["r"] = color.mV[0];
+ mParamsClipboard["g"] = color.mV[1];
+ mParamsClipboard["b"] = color.mV[2];
+ mHasLightParam = TRUE;
+ }
+ else
+ {
+ mHasLightParam = FALSE;
+ }
+
+ // Physics
+ {
+ mParamsClipboard["physics_shape"] = objectp->getPhysicsShapeType();
+ mParamsClipboard["physics_gravity"] = objectp->getPhysicsGravity();
+ mParamsClipboard["physics_friction"] = objectp->getPhysicsFriction();
+ mParamsClipboard["physics_density"] = objectp->getPhysicsDensity();
+ mParamsClipboard["physics_restitution"] = objectp->getPhysicsRestitution();
+
+ U8 material_code = 0;
+ struct f : public LLSelectedTEGetFunctor<U8>
+ {
+ U8 get(LLViewerObject* object, S32 te)
+ {
+ return object->getMaterial();
+ }
+ } func;
+ bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
+ // This should always be true since material should be per object.
+ if (material_same)
+ {
+ mParamsClipboard["physics_material"] = material_code;
+ }
+ }
+
+}
+
+void LLPanelObject::onPasteParams(const LLSD& data)
+{
+ LLViewerObject* objectp = mObject;
+ if (!objectp)
+ {
+ return;
+ }
+
+ // Flexi Prim
+ if (mHasFlexiParam && (objectp->getPCode() == LL_PCODE_VOLUME))
+ {
+ LLFlexibleObjectData *attributes = (LLFlexibleObjectData *)objectp->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE);
+ if (attributes)
+ {
+ LLFlexibleObjectData new_attributes;
+ new_attributes = *attributes;
+
+ new_attributes.setSimulateLOD(mParamsClipboard["lod"].asInteger());
+ new_attributes.setGravity(mParamsClipboard["gav"].asReal());
+ new_attributes.setTension(mParamsClipboard["ten"].asReal());
+ new_attributes.setAirFriction(mParamsClipboard["fri"].asReal());
+ new_attributes.setWindSensitivity(mParamsClipboard["sen"].asReal());
+ F32 fx = (F32)mParamsClipboard["forx"].asReal();
+ F32 fy = (F32)mParamsClipboard["fory"].asReal();
+ F32 fz = (F32)mParamsClipboard["forz"].asReal();
+ LLVector3 force(fx,fy,fz);
+ new_attributes.setUserForce(force);
+ objectp->setParameterEntry(LLNetworkData::PARAMS_FLEXIBLE, new_attributes, true);
+ }
+ }
+
+ // Sculpted Prim
+ if (mHasSculptParam)
+ {
+ LLSculptParams sculpt_params;
+
+ if (mParamsClipboard.has("sculptid"))
+ {
+ sculpt_params.setSculptTexture(mParamsClipboard["sculptid"].asUUID(), (U8)mParamsClipboard["sculpt_type"].asInteger());
+ }
+
+ objectp->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
+ }
+ else
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ if (sculpt_params)
+ {
+ objectp->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, TRUE);
+ }
+ }
+
+ // Light Source
+ if (objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
+ {
+ LLVOVolume *volobjp = (LLVOVolume *)objectp;
+
+ if (volobjp && mHasLightParam)
+ {
+ volobjp->setIsLight(TRUE);
+ volobjp->setLightIntensity((F32)mParamsClipboard["Light Intensity"].asReal());
+ volobjp->setLightRadius((F32)mParamsClipboard["Light Radius"].asReal());
+ volobjp->setLightFalloff((F32)mParamsClipboard["Light Falloff"].asReal());
+ F32 r = (F32)mParamsClipboard["r"].asReal();
+ F32 g = (F32)mParamsClipboard["g"].asReal();
+ F32 b = (F32)mParamsClipboard["b"].asReal();
+ volobjp->setLightColor(LLColor3(r,g,b));
+ }
+ }
+
+ // Physics
+ {
+ if (mParamsClipboard.has("physics_shape"))
+ {
+ objectp->setPhysicsShapeType((U8)mParamsClipboard["physics_shape"].asInteger());
+ }
+ if (mParamsClipboard.has("physics_material"))
+ {
+ U8 cur_material = objectp->getMaterial();
+ U8 material = (U8)mParamsClipboard["physics_material"].asInteger() | (cur_material & ~LL_MCODE_MASK);
+ objectp->setMaterial(material);
+ objectp->sendMaterialUpdate();
+ }
+ bool phys_update_flags = false;
+ if (mParamsClipboard.has("physics_gravity"))
+ {
+ objectp->setPhysicsGravity(mParamsClipboard["physics_gravity"].asReal());
+ phys_update_flags = true;
+ }
+ if (mParamsClipboard.has("physics_friction"))
+ {
+ objectp->setPhysicsFriction(mParamsClipboard["physics_friction"].asReal());
+ phys_update_flags = true;
+ }
+ if (mParamsClipboard.has("physics_density"))
+ {
+ objectp->setPhysicsDensity(mParamsClipboard["physics_density"].asReal());
+ phys_update_flags = true;
+ }
+ if (mParamsClipboard.has("physics_restitution"))
+ {
+ objectp->setPhysicsRestitution(mParamsClipboard["physics_restitution"].asReal());
+ phys_update_flags = true;
+ }
+ if (phys_update_flags)
+ {
+ objectp->updateFlags(TRUE);
+ }
+ }
+
+ // Parametrics
+ if(mHasParamsClipboard)
+ {
+ objectp->updateVolume(mClipboardVolumeParams);
+ }
+}
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index 8829f493fa..46725a80e4 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -66,6 +66,15 @@ public:
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
+ void onCopyPos(const LLSD& data);
+ void onPastePos(const LLSD& data);
+ void onCopySize(const LLSD& data);
+ void onPasteSize(const LLSD& data);
+ void onCopyRot(const LLSD& data);
+ void onPasteRot(const LLSD& data);
+ void onCopyParams(const LLSD& data);
+ void onPasteParams(const LLSD& data);
+
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
@@ -147,6 +156,15 @@ protected:
LLSpinCtrl* mCtrlRotY;
LLSpinCtrl* mCtrlRotZ;
+ LLButton *mBtnCopyPos;
+ LLButton *mBtnPastePos;
+ LLButton *mBtnCopySize;
+ LLButton *mBtnPasteSize;
+ LLButton *mBtnCopyRot;
+ LLButton *mBtnPasteRot;
+ LLButton *mBtnCopyParams;
+ LLButton *mBtnPasteParams;
+
LLCheckBoxCtrl *mCheckLock;
LLCheckBoxCtrl *mCheckPhysics;
LLCheckBoxCtrl *mCheckTemporary;
@@ -157,7 +175,7 @@ protected:
LLComboBox *mCtrlSculptType;
LLCheckBoxCtrl *mCtrlSculptMirror;
LLCheckBoxCtrl *mCtrlSculptInvert;
-
+
LLVector3 mCurEulerDegrees; // to avoid sending rotation when not changed
BOOL mIsPhysical; // to avoid sending "physical" when not changed
BOOL mIsTemporary; // to avoid sending "temporary" when not changed
@@ -167,6 +185,21 @@ protected:
LLUUID mSculptTextureRevert; // so we can revert the sculpt texture on cancel
U8 mSculptTypeRevert; // so we can revert the sculpt type on cancel
+ LLVector3 mClipboardPos;
+ LLVector3 mClipboardSize;
+ LLVector3 mClipboardRot;
+
+ BOOL mHasPosClipboard;
+ BOOL mHasSizeClipboard;
+ BOOL mHasRotClipboard;
+
+ LLSD mParamsClipboard;
+ LLVolumeParams mClipboardVolumeParams;
+ BOOL mHasParamsClipboard;
+ BOOL mHasFlexiParam;
+ BOOL mHasSculptParam;
+ BOOL mHasLightParam;
+
LLPointer<LLViewerObject> mObject;
LLPointer<LLViewerObject> mRootObject;
};
diff --git a/indra/newview/skins/default/textures/icons/Paste.png b/indra/newview/skins/default/textures/icons/Paste.png
new file mode 100644
index 0000000000..10211df427
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Paste.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 2540ee148d..c3cc4e83d0 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -187,6 +187,7 @@ with the same filename but different name
<texture name="Conv_log_inbox" file_name="icons/Conv_log_inbox.png" preload="false" />
<texture name="Copy" file_name="icons/Copy.png" preload="false" />
+ <texture name="Paste" file_name="icons/Paste.png" preload="false" />
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index d9a15fed9e..1e2846d943 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1446,6 +1446,21 @@ even though the user gets a free copy.
text_enabled_color="1 0 0.3 .7"
top_pad="5"
width="87" />
+ <button
+ top_delta="0"
+ left_pad="5"
+ height="19"
+ width="20"
+ follows="top|right"
+ layout="topleft"
+ tab_stop="false"
+ image_bottom_pad="1"
+ image_overlay="Copy"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="copy_pos_btn"
+ tool_tip="Copy Position" />
<spinner
follows="left|top"
height="19"
@@ -1454,13 +1469,28 @@ even though the user gets a free copy.
label="Y"
label_width="10"
layout="topleft"
- left_delta="0"
+ left="10"
max_val="512"
min_val="-256"
name="Pos Y"
text_enabled_color="EmphasisColor"
top_pad="3"
width="87" />
+ <button
+ top_delta="0"
+ left_pad="5"
+ height="19"
+ width="20"
+ follows="top|right"
+ layout="topleft"
+ tab_stop="false"
+ image_bottom_pad="1"
+ image_overlay="Paste"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="paste_pos_btn"
+ tool_tip="Paste Position" />
<spinner
follows="left|top"
height="19"
@@ -1469,7 +1499,7 @@ even though the user gets a free copy.
label="Z"
label_width="10"
layout="topleft"
- left_delta="0"
+ left="10"
max_val="4096"
name="Pos Z"
text_enabled_color="0 0.8 1 .65"
@@ -1502,6 +1532,21 @@ even though the user gets a free copy.
text_enabled_color="1 1 1 1"
top_pad="5"
width="87" />
+ <button
+ top_delta="0"
+ left_pad="5"
+ height="19"
+ width="20"
+ follows="top|right"
+ layout="topleft"
+ tab_stop="false"
+ image_bottom_pad="1"
+ image_overlay="Copy"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="copy_size_btn"
+ tool_tip="Copy Size" />
<spinner
follows="left|top"
height="19"
@@ -1510,13 +1555,28 @@ even though the user gets a free copy.
label="Y"
label_width="10"
layout="topleft"
- left_delta="0"
+ left="10"
max_val="64"
min_val="0.01"
name="Scale Y"
text_enabled_color="1 1 1 1"
top_pad="3"
width="87" />
+ <button
+ top_delta="0"
+ left_pad="5"
+ height="19"
+ width="20"
+ follows="top|right"
+ layout="topleft"
+ tab_stop="false"
+ image_bottom_pad="1"
+ image_overlay="Paste"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="paste_size_btn"
+ tool_tip="Paste Size" />
<spinner
follows="left|top"
height="19"
@@ -1525,7 +1585,7 @@ even though the user gets a free copy.
label="Z"
label_width="10"
layout="topleft"
- left_delta="0"
+ left="10"
max_val="64"
min_val="0.01"
name="Scale Z"
@@ -1560,6 +1620,21 @@ even though the user gets a free copy.
text_enabled_color="1 1 1 1"
top_pad="5"
width="87" />
+ <button
+ top_delta="0"
+ left_pad="5"
+ height="19"
+ width="20"
+ follows="top|right"
+ layout="topleft"
+ tab_stop="false"
+ image_bottom_pad="1"
+ image_overlay="Copy"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="copy_rot_btn"
+ tool_tip="Copy Rotation" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1569,13 +1644,28 @@ even though the user gets a free copy.
label="Y"
label_width="10"
layout="topleft"
- left_delta="0"
+ left="10"
max_val="9999"
min_val="-9999"
name="Rot Y"
text_enabled_color="1 1 1 1"
top_pad="3"
width="87" />
+ <button
+ top_delta="0"
+ left_pad="5"
+ height="19"
+ width="20"
+ follows="top|right"
+ layout="topleft"
+ tab_stop="false"
+ image_bottom_pad="1"
+ image_overlay="Paste"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="paste_rot_btn"
+ tool_tip="Paste Rotation" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1585,7 +1675,7 @@ even though the user gets a free copy.
label="Z"
label_width="10"
layout="topleft"
- left_delta="0"
+ left="10"
max_val="9999"
min_val="-9999"
name="Rot Z"
@@ -1598,18 +1688,39 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="label basetype"
top="5"
width="150">
Prim Type
</text>-->
+ <button
+ follows="top|right"
+ height="16"
+ label="Copy"
+ layout="topleft"
+ left="135"
+ name="copy_params_btn"
+ tool_tip="Copy Parameters to Clipboard"
+ top="6"
+ width="65">
+ </button>
+ <button
+ follows="top|right"
+ height="16"
+ label="Paste"
+ layout="topleft"
+ left_pad="10"
+ name="paste_params_btn"
+ tool_tip="Paste Parameters from Clipboard"
+ width="65">
+ </button>
<combo_box
height="19"
layout="topleft"
name="comboBaseType"
- top="6"
- left="125"
+ top_pad="5"
+ left="135"
width="150">
<combo_box.item
label="Box"
@@ -1688,7 +1799,7 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="text hollow"
top_pad="6"
width="68">
@@ -1712,7 +1823,7 @@ even though the user gets a free copy.
increment="5"
initial_value="0"
layout="topleft"
- left="125"
+ left="135"
max_val="95"
name="Scale 1"
top_pad="4"
@@ -1736,7 +1847,7 @@ even though the user gets a free copy.
follows="left|top"
height="15"
layout="topleft"
- left="125"
+ left="135"
name="Hollow Shape"
top_pad="4"
width="150">
@@ -1814,7 +1925,7 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="scale_taper"
top_pad="3"
width="150">
@@ -1867,7 +1978,7 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="text topshear"
top_pad="3"
width="141">
@@ -1910,7 +2021,7 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="advanced_cut"
top_pad="3"
width="150">
@@ -1974,7 +2085,7 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="text taper2"
top_pad="3"
width="150">
@@ -2017,7 +2128,7 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left="125"
+ left="135"
name="text radius delta"
top_pad="2"
width="78">
@@ -2042,7 +2153,7 @@ even though the user gets a free copy.
increment="0.05"
initial_value="0"
layout="topleft"
- left="125"
+ left="135"
min_val="-1"
name="Radius Offset"
top_pad="4"
@@ -2067,7 +2178,7 @@ even though the user gets a free copy.
height="141"
label="Sculpt Texture"
layout="topleft"
- left="125"
+ left="135"
name="sculpt texture control"
tool_tip="Click to choose a picture"
top="70"