From 8cbb7451e6e88bcf4dfb67f900089720c71f8f28 Mon Sep 17 00:00:00 2001 From: Armin Weatherwax Date: Mon, 23 Aug 2010 17:24:07 +0200 Subject: Emerald: copy/paste buttons for prim pos/rot/scale in panelobject --- linden/indra/newview/llpanelobject.cpp | 237 +++++++++++++++++++++ linden/indra/newview/llpanelobject.h | 30 +++ .../skins/default/xui/en-us/floater_tools.xml | 30 +++ 3 files changed, 297 insertions(+) diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp index 9ef7f91..1a9d8bf 100644 --- a/linden/indra/newview/llpanelobject.cpp +++ b/linden/indra/newview/llpanelobject.cpp @@ -106,6 +106,10 @@ enum { MI_HOLE_COUNT }; +LLVector3 LLPanelObject::mClipboardPos; +LLVector3 LLPanelObject::mClipboardSize; +LLVector3 LLPanelObject::mClipboardRot; + //*TODO:translate (depricated, so very low priority) static const std::string LEGACY_FULLBRIGHT_DESC("Fullbright (Legacy)"); @@ -167,6 +171,27 @@ BOOL LLPanelObject::postBuild() mCtrlRotZ = getChild("Rot Z"); childSetCommitCallback("Rot Z",onCommitRotation,this); + mBtnCopyPos = getChild("copypos"); + childSetAction("copypos",onCopyPos, this); + mBtnPastePos = getChild("pastepos"); + childSetAction("pastepos",onPastePos, this); + mBtnPastePosClip = getChild("pasteposclip"); + childSetAction("pasteposclip",onPastePosClip, this); + + mBtnCopySize = getChild("copysize"); + childSetAction("copysize",onCopySize, this); + mBtnPasteSize = getChild("pastesize"); + childSetAction("pastesize",onPasteSize, this); + mBtnPasteSizeClip = getChild("pastesizeclip"); + childSetAction("pastesizeclip",onPasteSizeClip, this); + + mBtnCopyRot = getChild("copyrot"); + childSetAction("copyrot",onCopyRot, this); + mBtnPasteRot = getChild("pasterot"); + childSetAction("pasterot",onPasteRot, this); + mBtnPasteRotClip = getChild("pasterotclip"); + childSetAction("pasterotclip",onPasteRotClip, this); + //-------------------------------------------------------- // material type popup @@ -427,6 +452,9 @@ void LLPanelObject::getState( ) mCtrlPosX->setEnabled(enable_move); mCtrlPosY->setEnabled(enable_move); mCtrlPosZ->setEnabled(enable_move); + mBtnCopyPos->setEnabled(enable_move); + mBtnPastePos->setEnabled(enable_move); + mBtnPastePosClip->setEnabled(enable_move); mCtrlPosZ->setMaxValue(gHippoLimits->getMaxHeight()); @@ -454,6 +482,9 @@ void LLPanelObject::getState( ) mCtrlScaleX->setEnabled( enable_scale ); mCtrlScaleY->setEnabled( enable_scale ); mCtrlScaleZ->setEnabled( enable_scale ); + mBtnCopySize->setEnabled( enable_scale ); + mBtnPasteSize->setEnabled( enable_scale ); + mBtnPasteSizeClip->setEnabled( enable_scale ); LLQuaternion object_rot = objectp->getRotationEdit(); object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ])); @@ -485,6 +516,9 @@ void LLPanelObject::getState( ) mCtrlRotX->setEnabled( enable_rotate ); mCtrlRotY->setEnabled( enable_rotate ); mCtrlRotZ->setEnabled( enable_rotate ); + mBtnCopyRot->setEnabled( enable_rotate ); + mBtnPasteRot->setEnabled( enable_rotate ); + mBtnPasteRotClip->setEnabled( enable_rotate ); BOOL owners_identical; LLUUID owner_id; @@ -2140,3 +2174,206 @@ void LLPanelObject::onClickBuildConstants(void *) { LLNotifications::instance().add("ClickBuildConstants"); } + +std::string shortfloat(F32 in) +{ + std::string out = llformat("%f", in); + int i = out.size(); + while(out[--i] == '0') out.erase(i, 1); + return out; +} + +void LLPanelObject::onCopyPos(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLVector3 newpos(self->mCtrlPosX->get(), self->mCtrlPosY->get(), self->mCtrlPosZ->get()); + self->mClipboardPos = newpos; + + std::string stringVec = "<"; + stringVec.append(shortfloat(newpos.mV[VX])); + stringVec.append(", "); + stringVec.append(shortfloat(newpos.mV[VY])); + stringVec.append(", "); + stringVec.append(shortfloat(newpos.mV[VZ])); + stringVec.append(">"); + + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(stringVec)); +} + +void LLPanelObject::onCopySize(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLVector3 newpos(self->mCtrlScaleX->get(), self->mCtrlScaleY->get(), self->mCtrlScaleZ->get()); + self->mClipboardSize = newpos; + + std::string stringVec = "<"; + stringVec.append(shortfloat(newpos.mV[VX])); + stringVec.append(", "); + stringVec.append(shortfloat(newpos.mV[VY])); + stringVec.append(", "); + stringVec.append(shortfloat(newpos.mV[VZ])); + stringVec.append(">"); + + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(stringVec)); +} + +void LLPanelObject::onCopyRot(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLVector3 newpos(self->mCtrlRotX->get(), self->mCtrlRotY->get(), self->mCtrlRotZ->get()); + self->mClipboardRot = newpos; + + std::string stringVec = "<"; + stringVec.append(shortfloat(newpos.mV[VX])); + stringVec.append(", "); + stringVec.append(shortfloat(newpos.mV[VY])); + stringVec.append(", "); + stringVec.append(shortfloat(newpos.mV[VZ])); + stringVec.append(">"); + + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(stringVec)); +} + + + +void LLPanelObject::onPastePos(void* user_data) +{ + if(mClipboardPos.isNull()) return; + + LLPanelObject* self = (LLPanelObject*) user_data; + LLCalc* calcp = LLCalc::getInstance(); + mClipboardPos.mV[VX] = llclamp( mClipboardPos.mV[VX], 0.f, 256.f); + mClipboardPos.mV[VY] = llclamp( mClipboardPos.mV[VY], 0.f, 256.f); + mClipboardPos.mV[VZ] = llclamp( mClipboardPos.mV[VZ], 0.f, 4096.f); + + self->mCtrlPosX->set( mClipboardPos.mV[VX] ); + self->mCtrlPosY->set( mClipboardPos.mV[VY] ); + self->mCtrlPosZ->set( mClipboardPos.mV[VZ] ); + + calcp->setVar(LLCalc::X_POS, mClipboardPos.mV[VX]); + calcp->setVar(LLCalc::Y_POS, mClipboardPos.mV[VY]); + calcp->setVar(LLCalc::Z_POS, mClipboardPos.mV[VZ]); + self->sendPosition(FALSE); +} + +void LLPanelObject::onPasteSize(void* user_data) +{ + if(mClipboardSize.isNull()) return; + + LLPanelObject* self = (LLPanelObject*) user_data; + LLCalc* calcp = LLCalc::getInstance(); + mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], 0.01f, 10.f); + mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], 0.01f, 10.f); + mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], 0.01f, 10.f); + + self->mCtrlScaleX->set( mClipboardSize.mV[VX] ); + self->mCtrlScaleY->set( mClipboardSize.mV[VY] ); + self->mCtrlScaleZ->set( mClipboardSize.mV[VZ] ); + + calcp->setVar(LLCalc::X_SCALE, mClipboardSize.mV[VX]); + calcp->setVar(LLCalc::Y_SCALE, mClipboardSize.mV[VY]); + calcp->setVar(LLCalc::Z_SCALE, mClipboardSize.mV[VZ]); + self->sendScale(FALSE); +} + +void LLPanelObject::onPasteRot(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLCalc* calcp = LLCalc::getInstance(); + + self->mCtrlRotX->set( mClipboardRot.mV[VX] ); + self->mCtrlRotY->set( mClipboardRot.mV[VY] ); + self->mCtrlRotZ->set( mClipboardRot.mV[VZ] ); + + calcp->setVar(LLCalc::X_ROT, mClipboardRot.mV[VX]); + calcp->setVar(LLCalc::Y_ROT, mClipboardRot.mV[VY]); + calcp->setVar(LLCalc::Z_ROT, mClipboardRot.mV[VZ]); + self->sendRotation(FALSE); +} + +BOOL getvectorfromclip(const std::string& buf, LLVector3* value) +{ + if( buf.empty() || value == NULL) + { + return FALSE; + } + + LLVector3 v; + S32 count = sscanf( buf.c_str(), "<%f, %f, %f>", v.mV + 0, v.mV + 1, v.mV + 2 ); + if( 3 == count ) + { + value->setVec( v ); + return TRUE; + } + + return FALSE; +} + + +void LLPanelObject::onPastePosClip(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLCalc* calcp = LLCalc::getInstance(); + + LLWString temp_string; + LLView::getWindow()->pasteTextFromClipboard(temp_string); + + std::string stringVec = wstring_to_utf8str(temp_string); + if(!getvectorfromclip(stringVec, &mClipboardPos)) return; + + mClipboardPos.mV[VX] = llclamp(mClipboardPos.mV[VX], 0.f, 256.f); + mClipboardPos.mV[VY] = llclamp(mClipboardPos.mV[VY], 0.f, 256.f); + mClipboardPos.mV[VZ] = llclamp(mClipboardPos.mV[VZ], 0.f, 4096.f); + + self->mCtrlPosX->set( mClipboardPos.mV[VX] ); + self->mCtrlPosY->set( mClipboardPos.mV[VY] ); + self->mCtrlPosZ->set( mClipboardPos.mV[VZ] ); + calcp->setVar(LLCalc::X_POS, mClipboardPos.mV[VX]); + calcp->setVar(LLCalc::Y_POS, mClipboardPos.mV[VY]); + calcp->setVar(LLCalc::Z_POS, mClipboardPos.mV[VZ]); + self->sendPosition(FALSE); +} + +void LLPanelObject::onPasteSizeClip(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLCalc* calcp = LLCalc::getInstance(); + + LLWString temp_string; + LLView::getWindow()->pasteTextFromClipboard(temp_string); + + std::string stringVec = wstring_to_utf8str(temp_string); + if(!getvectorfromclip(stringVec, &mClipboardSize)) return; + + mClipboardSize.mV[VX] = llclamp(mClipboardSize.mV[VX], 0.01f, 10.f); + mClipboardSize.mV[VY] = llclamp(mClipboardSize.mV[VY], 0.01f, 10.f); + mClipboardSize.mV[VZ] = llclamp(mClipboardSize.mV[VZ], 0.01f, 10.f); + + self->mCtrlScaleX->set( mClipboardSize.mV[VX] ); + self->mCtrlScaleY->set( mClipboardSize.mV[VY] ); + self->mCtrlScaleZ->set( mClipboardSize.mV[VZ] ); + calcp->setVar(LLCalc::X_SCALE, mClipboardSize.mV[VX]); + calcp->setVar(LLCalc::Y_SCALE, mClipboardSize.mV[VY]); + calcp->setVar(LLCalc::Z_SCALE, mClipboardSize.mV[VZ]); + self->sendScale(FALSE); +} + +void LLPanelObject::onPasteRotClip(void* user_data) +{ + LLPanelObject* self = (LLPanelObject*) user_data; + LLCalc* calcp = LLCalc::getInstance(); + + LLWString temp_string; + LLView::getWindow()->pasteTextFromClipboard(temp_string); + + std::string stringVec = wstring_to_utf8str(temp_string); + if(!getvectorfromclip(stringVec, &mClipboardRot)) return; + + self->mCtrlRotX->set( mClipboardRot.mV[VX] ); + self->mCtrlRotY->set( mClipboardRot.mV[VY] ); + self->mCtrlRotZ->set( mClipboardRot.mV[VZ] ); + calcp->setVar(LLCalc::X_ROT, mClipboardRot.mV[VX]); + calcp->setVar(LLCalc::Y_ROT, mClipboardRot.mV[VY]); + calcp->setVar(LLCalc::Z_ROT, mClipboardRot.mV[VZ]); + self->sendRotation(FALSE); + } diff --git a/linden/indra/newview/llpanelobject.h b/linden/indra/newview/llpanelobject.h index 2aa5ae1..f86eb46 100644 --- a/linden/indra/newview/llpanelobject.h +++ b/linden/indra/newview/llpanelobject.h @@ -74,6 +74,16 @@ public: static void onCommitPhantom( LLUICtrl* ctrl, void* userdata); static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata); + static void onCopyPos( void* user_data); + static void onPastePos( void* user_data); + static void onPastePosClip( void* user_data); + static void onCopySize( void* user_data); + static void onPasteSize( void* user_data); + static void onPasteSizeClip( void* user_data); + static void onCopyRot( void* user_data); + static void onPasteRot( void* user_data); + static void onPasteRotClip( void* user_data); + static void onCommitParametric(LLUICtrl* ctrl, void* userdata); static void onCommitMaterial( LLUICtrl* ctrl, void* userdata); @@ -101,6 +111,11 @@ protected: void getVolumeParams(LLVolumeParams& volume_params); protected: + + static LLVector3 mClipboardPos; + static LLVector3 mClipboardSize; + static LLVector3 mClipboardRot; + S32 mComboMaterialItemCount; LLTextBox* mLabelMaterial; @@ -163,6 +178,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; diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml index a82e308..58c6443 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml @@ -645,6 +645,16 @@ increment="0.01" initial_val="0" label="Z" label_width="10" left="10" max_val="4096" min_val="0" mouse_opaque="true" name="Pos Z" text_enabled_color="0, 67, 132, 255" width="96" /> +