diff options
-rw-r--r-- | indra/newview/llpanelobject.cpp | 404 | ||||
-rw-r--r-- | indra/newview/llpanelobject.h | 35 | ||||
-rw-r--r-- | indra/newview/skins/default/textures/icons/Paste.png | bin | 0 -> 530 bytes | |||
-rw-r--r-- | indra/newview/skins/default/textures/textures.xml | 1 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_tools.xml | 149 |
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 Binary files differnew file mode 100644 index 0000000000..10211df427 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Paste.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 5aba0546f3..a3f5515d6f 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -186,6 +186,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 0abee2ff80..bbb978a631 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1456,6 +1456,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" @@ -1464,13 +1479,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" @@ -1479,7 +1509,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" @@ -1512,6 +1542,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" @@ -1520,13 +1565,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" @@ -1535,7 +1595,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" @@ -1570,6 +1630,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" @@ -1579,13 +1654,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" @@ -1595,7 +1685,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" @@ -1608,18 +1698,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" @@ -1698,7 +1809,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"> @@ -1722,7 +1833,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" @@ -1746,7 +1857,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"> @@ -1824,7 +1935,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"> @@ -1877,7 +1988,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"> @@ -1920,7 +2031,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"> @@ -1984,7 +2095,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"> @@ -2027,7 +2138,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"> @@ -2052,7 +2163,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" @@ -2077,7 +2188,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" |