Build Improvements: Copy/paste obj pos, size, rot, and prams

meow-7.2.2
Kadah 2011-06-21 19:16:05 -07:00
parent 2fcf017c1f
commit a121fb750d
4 changed files with 511 additions and 9 deletions

View File

@ -11582,6 +11582,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<string>5748decc-f629-461c-9a36-a35a221fe21f</string>
</map>
<key>UIImgInvisibleUUID</key>
<map>
<key>Comment</key>
<string />
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>f54a0c32-3cd1-d49a-5b4f-7b792bebc204</string>
</map>
<key>UILineEditorCursorThickness</key>
<map>
<key>Comment</key>

View File

@ -47,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"
@ -67,6 +69,7 @@
#include "pipeline.h"
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
#include "llwindow.h" // for clipboad operations -KC
//#include "llfirstuse.h"
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
#include "rlvhandler.h"
@ -167,6 +170,36 @@ BOOL LLPanelObject::postBuild()
mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z");
childSetCommitCallback("Rot Z",onCommitRotation,this);
// Copy/paste pos
mBtnCopyPos = getChild<LLButton>("copypos");
mBtnCopyPos->setCommitCallback( boost::bind(&LLPanelObject::onCopyPos, this, _2 ));
mBtnPastePos = getChild<LLButton>("pastepos");
mBtnPastePos->setCommitCallback( boost::bind(&LLPanelObject::onPastePos, this, _2 ));
mBtnPastePosClip = getChild<LLButton>("pasteposclip");
mBtnPastePosClip->setCommitCallback( boost::bind(&LLPanelObject::onPastePosClip, this, _2 ));
// Copy/paste size
mBtnCopySize = getChild<LLButton>("copysize");
mBtnCopySize->setCommitCallback( boost::bind(&LLPanelObject::onCopySize, this, _2 ));
mBtnPasteSize = getChild<LLButton>("pastesize");
mBtnPasteSize->setCommitCallback( boost::bind(&LLPanelObject::onPasteSize, this, _2 ));
mBtnPasteSizeClip = getChild<LLButton>("pastesizeclip");
mBtnPasteSizeClip->setCommitCallback( boost::bind(&LLPanelObject::onPasteSizeClip, this, _2 ));
// Copy/paste rot
mBtnCopyRot = getChild<LLButton>("copyrot");
mBtnCopyRot->setCommitCallback( boost::bind(&LLPanelObject::onCopyRot, this, _2 ));
mBtnPasteRot = getChild<LLButton>("pasterot");
mBtnPasteRot->setCommitCallback( boost::bind(&LLPanelObject::onPasteRot, this, _2 ));
mBtnPasteRotClip = getChild<LLButton>("pasterotclip");
mBtnPasteRotClip->setCommitCallback( boost::bind(&LLPanelObject::onPasteRotClip, this, _2 ));
// Copy/paste obj prams
mBtnCopyParams = getChild<LLButton>("copyparams");
mBtnCopyParams->setCommitCallback( boost::bind(&LLPanelObject::onCopyParams, this, _2 ));
mBtnPasteParams = getChild<LLButton>("pasteparams");
mBtnPasteParams->setCommitCallback( boost::bind(&LLPanelObject::onPasteParams, this, _2 ));
//--------------------------------------------------------
// material type popup
@ -319,7 +352,11 @@ LLPanelObject::LLPanelObject()
mCastShadows(TRUE),
mSelectedType(MI_BOX),
mSculptTextureRevert(LLUUID::null),
mSculptTypeRevert(0)
mSculptTypeRevert(0),
mHasParamClipboard(FALSE),
mHasFlexiParam(FALSE),
mHasSculptParam(FALSE),
mHasLightParam(FALSE)
{
}
@ -460,6 +497,18 @@ void LLPanelObject::getState( )
mCtrlRotY->setEnabled( enable_rotate );
mCtrlRotZ->setEnabled( enable_rotate );
mBtnCopyPos->setEnabled(enable_move);
mBtnPastePos->setEnabled(enable_move);
mBtnPastePosClip->setEnabled(enable_move);
mBtnCopySize->setEnabled( enable_scale );
mBtnPasteSize->setEnabled( enable_scale );
mBtnPasteSizeClip->setEnabled( enable_scale );
mBtnCopyRot->setEnabled( enable_rotate );
mBtnPasteRot->setEnabled( enable_rotate );
mBtnPasteRotClip->setEnabled( enable_rotate );
mBtnCopyParams->setEnabled( single_volume && objectp->permModify() );
mBtnPasteParams->setEnabled( single_volume && objectp->permModify() );
BOOL owners_identical;
LLUUID owner_id;
std::string owner_name;
@ -2058,3 +2107,293 @@ 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]));
}
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]));
}
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]));
}
void LLPanelObject::onPastePos(const LLSD& data)
{
if(mClipboardPos.isNull()) return;
//clamp pos on non-attachments, just keep the prims on the sim
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(mClipboardSize.isNull()) 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(mClipboardRot.isNull()) return;
mCtrlRotX->set( mClipboardRot.mV[VX] );
mCtrlRotY->set( mClipboardRot.mV[VY] );
mCtrlRotZ->set( mClipboardRot.mV[VZ] );
sendRotation(FALSE);
}
//Paste from clip board
BOOL get_vector_from_clipboard(LLVector3* value)
{
LLWString temp_string;
LLView::getWindow()->pasteTextFromClipboard(temp_string);
const std::string stringVec = wstring_to_utf8str(temp_string);
if(stringVec.empty() || value == NULL) return FALSE;
LLVector3 vec;
S32 count = sscanf( stringVec.c_str(), "<%f, %f, %f>", vec.mV + 0, vec.mV + 1, vec.mV + 2 );
if( 3 == count )
{
value->setVec( vec );
return TRUE;
}
return FALSE;
}
void LLPanelObject::onPastePosClip(const LLSD& data)
{
if(get_vector_from_clipboard(&mClipboardPos))
onPastePos(data);
}
void LLPanelObject::onPasteSizeClip(const LLSD& data)
{
if(get_vector_from_clipboard(&mClipboardSize))
onPasteSize(data);
}
void LLPanelObject::onPasteRotClip(const LLSD& data)
{
if(get_vector_from_clipboard(&mClipboardRot))
onPasteRot(data);
}
void LLPanelObject::onCopyParams(const LLSD& data)
{
getVolumeParams(mClipboardVolumeParams);
mHasParamClipboard = TRUE;
LLViewerObject* objectp = mObject;
if (!objectp)
return;
LLVOVolume *volobjp = NULL;
if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
volobjp = (LLVOVolume *)objectp;
mHasFlexiParam = FALSE;
if(volobjp && volobjp->isFlexible())
{
LLFlexibleObjectData *attributes = (LLFlexibleObjectData *)objectp->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE);
if (attributes)
{
mPramsClipboard["lod"] = attributes->getSimulateLOD();
mPramsClipboard["gav"] = attributes->getGravity();
mPramsClipboard["ten"] = attributes->getTension();
mPramsClipboard["fri"] = attributes->getAirFriction();
mPramsClipboard["sen"] = attributes->getWindSensitivity();
LLVector3 force = attributes->getUserForce();
mPramsClipboard["forx"] = force.mV[0];
mPramsClipboard["fory"] = force.mV[1];
mPramsClipboard["forz"] = force.mV[2];
mHasFlexiParam = TRUE;
}
}
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.count())
{
// search for copyable version first
for (S32 i = 0; i < items.count(); 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)
mPramsClipboard["sculptid"] = image_id;
else
mPramsClipboard["sculptid"] = LLUUID(SCULPT_DEFAULT_TEXTURE);
mPramsClipboard["sculpt_type"] = sculpt_params->getSculptType();
mHasSculptParam = TRUE;
}
else
{
mHasSculptParam = FALSE;
}
if (volobjp && volobjp->getIsLight())
{
mPramsClipboard["Light Intensity"] = volobjp->getLightIntensity();
mPramsClipboard["Light Radius"] = volobjp->getLightRadius();
mPramsClipboard["Light Falloff"] = volobjp->getLightFalloff();
LLColor3 color = volobjp->getLightColor();
mPramsClipboard["r"] = color.mV[0];
mPramsClipboard["g"] = color.mV[1];
mPramsClipboard["b"] = color.mV[2];
mHasLightParam = TRUE;
}
else
{
mHasLightParam = FALSE;
}
}
void LLPanelObject::onPasteParams(const LLSD& data)
{
LLViewerObject* objectp = mObject;
if (!objectp)
return;
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(mPramsClipboard["lod"].asInteger());
new_attributes.setGravity(mPramsClipboard["gav"].asReal());
new_attributes.setTension(mPramsClipboard["ten"].asReal());
new_attributes.setAirFriction(mPramsClipboard["fri"].asReal());
new_attributes.setWindSensitivity(mPramsClipboard["sen"].asReal());
F32 fx = (F32)mPramsClipboard["forx"].asReal();
F32 fy = (F32)mPramsClipboard["fory"].asReal();
F32 fz = (F32)mPramsClipboard["forz"].asReal();
LLVector3 force(fx,fy,fz);
new_attributes.setUserForce(force);
objectp->setParameterEntry(LLNetworkData::PARAMS_FLEXIBLE, new_attributes, true);
}
}
if (mHasSculptParam)
{
LLSculptParams sculpt_params;
if (mPramsClipboard.has("sculptid"))
sculpt_params.setSculptTexture(mPramsClipboard["sculptid"].asUUID());
if (mPramsClipboard.has("sculptid"))
sculpt_params.setSculptType((U8)mPramsClipboard["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);
}
LLVOVolume *volobjp = NULL;
if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
volobjp = (LLVOVolume *)objectp;
if (volobjp && mHasLightParam)
{
volobjp->setIsLight(TRUE);
volobjp->setLightIntensity((F32)mPramsClipboard["Light Intensity"].asReal());
volobjp->setLightRadius((F32)mPramsClipboard["Light Radius"].asReal());
volobjp->setLightFalloff((F32)mPramsClipboard["Light Falloff"].asReal());
F32 r = (F32)mPramsClipboard["r"].asReal();
F32 g = (F32)mPramsClipboard["g"].asReal();
F32 b = (F32)mPramsClipboard["b"].asReal();
volobjp->setLightColor(LLColor3(r,g,b));
}
if(mHasParamClipboard)
objectp->updateVolume(mClipboardVolumeParams);
}

View File

@ -67,6 +67,18 @@ public:
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata);
void onCopyPos( const LLSD& data);
void onPastePos( const LLSD& data);
void onPastePosClip( const LLSD& data);
void onCopySize( const LLSD& data);
void onPasteSize( const LLSD& data);
void onPasteSizeClip( const LLSD& data);
void onCopyRot( const LLSD& data);
void onPasteRot( const LLSD& data);
void onPasteRotClip( const LLSD& data);
void onCopyParams( const LLSD& data);
void onPasteParams( const LLSD& data);
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
@ -93,6 +105,17 @@ protected:
void getVolumeParams(LLVolumeParams& volume_params);
protected:
LLVector3 mClipboardPos;
LLVector3 mClipboardSize;
LLVector3 mClipboardRot;
LLSD mPramsClipboard;
LLVolumeParams mClipboardVolumeParams;
BOOL mHasParamClipboard;
BOOL mHasFlexiParam;
BOOL mHasSculptParam;
BOOL mHasLightParam;
S32 mComboMaterialItemCount;
LLComboBox* mComboMaterial;
@ -153,6 +176,21 @@ protected:
LLSpinCtrl* mCtrlRotY;
LLSpinCtrl* mCtrlRotZ;
LLButton *mBtnCopyPos;
LLButton *mBtnPastePos;
LLButton *mBtnPastePosClip;
LLButton *mBtnCopySize;
LLButton *mBtnPasteSize;
LLButton *mBtnPasteSizeClip;
LLButton *mBtnCopyRot;
LLButton *mBtnPasteRot;
LLButton *mBtnPasteRotClip;
LLButton* mBtnCopyParams;
LLButton* mBtnPasteParams;
LLCheckBoxCtrl *mCheckLock;
LLCheckBoxCtrl *mCheckPhysics;
LLCheckBoxCtrl *mCheckTemporary;

View File

@ -1361,6 +1361,15 @@ even though the user gets a free copy.
text_enabled_color="Red"
top_pad="5"
width="87" />
<button follows="top|right"
height="18"
label="C"
left_pad="5"
mouse_opaque="true"
name="copypos"
enabled="true"
tool_tip="Copy Position"
width="20" />
<spinner
follows="left|top"
height="19"
@ -1369,13 +1378,22 @@ 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 follows="top|right"
height="18"
label="P"
left_pad="5"
mouse_opaque="true"
name="pastepos"
enabled="true"
tool_tip="Paste Position"
width="20" />
<spinner
follows="left|top"
height="19"
@ -1384,19 +1402,28 @@ 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="SL-MidBlue"
top_pad="3"
width="87" />
<button follows="top|right"
height="18"
label="p"
left_pad="5"
mouse_opaque="true"
name="pasteposclip"
enabled="true"
tool_tip="Paste Position from Clipboard"
width="20" />
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_delta="0"
left="10"
name="label size"
top_pad="6"
width="121">
@ -1417,6 +1444,15 @@ even though the user gets a free copy.
text_enabled_color="White"
top_pad="5"
width="87" />
<button follows="top|right"
height="18"
label="C"
left_pad="5"
mouse_opaque="true"
name="copysize"
enabled="true"
tool_tip="Copy Size"
width="20" />
<spinner
follows="left|top"
height="19"
@ -1425,13 +1461,22 @@ even though the user gets a free copy.
label="Y"
label_width="10"
layout="topleft"
left_delta="0"
left="10"
max_val="10"
min_val="0.01"
name="Scale Y"
text_enabled_color="White"
top_pad="3"
width="87" />
<button follows="top|right"
height="18"
label="P"
left_pad="5"
mouse_opaque="true"
name="pastesize"
enabled="true"
tool_tip="Paste Size"
width="20" />
<spinner
follows="left|top"
height="19"
@ -1440,20 +1485,29 @@ even though the user gets a free copy.
label="Z"
label_width="10"
layout="topleft"
left_delta="0"
left="10"
max_val="10"
min_val="0.01"
name="Scale Z"
text_enabled_color="White"
top_pad="3"
width="87" />
<button follows="top|right"
height="18"
label="p"
left_pad="5"
mouse_opaque="true"
name="pastesizeclip"
enabled="true"
tool_tip="Paste Size from Clipboard"
width="20" />
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_delta="0"
left="10"
name="label rotation"
top_pad="10"
width="121">
@ -1475,6 +1529,15 @@ even though the user gets a free copy.
text_enabled_color="White"
top_pad="5"
width="87" />
<button follows="top|right"
height="18"
label="C"
left_pad="5"
mouse_opaque="true"
name="copyrot"
enabled="true"
tool_tip="Copy Rotation"
width="20" />
<spinner
decimal_digits="2"
follows="left|top"
@ -1484,13 +1547,22 @@ 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="White"
top_pad="3"
width="87" />
<button follows="top|right"
height="18"
label="P"
left_pad="5"
mouse_opaque="true"
name="pasterot"
enabled="true"
tool_tip="Paste Rotation"
width="20" />
<spinner
decimal_digits="2"
follows="left|top"
@ -1500,13 +1572,22 @@ 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"
text_enabled_color="White"
top_pad="3"
width="87" />
<button follows="top|right"
height="18"
label="p"
left_pad="5"
mouse_opaque="true"
name="pasterotclip"
enabled="true"
tool_tip="Paste Rotation from Clipboard"
width="20" />
<!-- <text
type="string"
@ -1520,6 +1601,39 @@ even though the user gets a free copy.
width="150">
Prim Type
</text>-->
<text
type="string"
length="1"
follows="left|top"
height="10"
bottom="-15"
layout="topleft"
left="10"
name="edit_object"
top_pad="8"
width="121">
Object Parameters:
</text>
<button
follows="top|right"
height="16"
label="Copy"
layout="topleft"
left="5"
name="copyparams"
tool_tip="Copy Parameters to Clipboard"
width="52">
</button>
<button
follows="top|right"
height="16"
label="Paste"
layout="topleft"
left_pad="10"
name="pasteparams"
tool_tip="Paste Parameters from Clipboard"
width="52">
</button>
<combo_box
height="19"
layout="topleft"