From b8fd5719299bd950e50f175c2819702d7f4bc665 Mon Sep 17 00:00:00 2001 From: Angeldark Raymaker Date: Tue, 12 Nov 2024 20:49:51 +0000 Subject: [PATCH] FIRE-34747: Keep scroll lists up to date --- indra/newview/app_settings/settings.xml | 11 +++ indra/newview/fsfloaterposer.cpp | 71 ++++++++++--------- indra/newview/fsfloaterposer.h | 18 ++++- .../skins/default/xui/en/floater_fs_poser.xml | 11 +++ 4 files changed, 77 insertions(+), 34 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b63da471a3..1f4aac3a2e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8056,6 +8056,17 @@ Value 0 + FSPoserResetBaseRotationOnEdit + + Comment + Whether to reset the base-rotation of a joint to zero when a user edits it. + Persist + 1 + Type + Boolean + Value + 0 + FSPoserStopPosingWhenClosed Comment diff --git a/indra/newview/fsfloaterposer.cpp b/indra/newview/fsfloaterposer.cpp index 2cd660a175..3bce7d8a8e 100644 --- a/indra/newview/fsfloaterposer.cpp +++ b/indra/newview/fsfloaterposer.cpp @@ -54,6 +54,7 @@ constexpr char XML_JOINT_TRANSFORM_STRING_PREFIX[] = "joint_transfor constexpr std::string_view POSER_ADVANCEDWINDOWSTATE_SAVE_KEY = "FSPoserAdvancedWindowState"; constexpr std::string_view POSER_TRACKPAD_SENSITIVITY_SAVE_KEY = "FSPoserTrackpadSensitivity"; constexpr std::string_view POSER_STOPPOSINGWHENCLOSED_SAVE_KEY = "FSPoserStopPosingWhenClosed"; +constexpr std::string_view POSER_RESETBASEROTONEDIT_SAVE_KEY = "FSPoserResetBaseRotationOnEdit"; } // namespace /// @@ -158,10 +159,13 @@ bool FSFloaterPoser::postBuild() if (gSavedSettings.getBOOL(POSER_ADVANCEDWINDOWSTATE_SAVE_KEY)) mToggleAdvancedPanelBtn->setValue(true); - mStopPosingOnCloseCbx = getChild("stop_posing_on_close_checkbox"); if (gSavedSettings.getBOOL(POSER_STOPPOSINGWHENCLOSED_SAVE_KEY)) - mAlsoSaveBvhCbx->set(true); + mStopPosingOnCloseCbx->set(true); + + mResetBaseRotOnEditCbx = getChild("reset_base_rotation_on_edit_checkbox"); + if (gSavedSettings.getBOOL(POSER_RESETBASEROTONEDIT_SAVE_KEY)) + mResetBaseRotOnEditCbx->set(true); mTrackpadSensitivitySlider = getChild("trackpad_sensitivity_slider"); mTrackpadSensitivitySlider->setValue(gSavedSettings.getF32(POSER_TRACKPAD_SENSITIVITY_SAVE_KEY)); @@ -235,6 +239,9 @@ void FSFloaterPoser::onClose(bool app_quitting) if (mStopPosingOnCloseCbx) gSavedSettings.setBOOL(POSER_STOPPOSINGWHENCLOSED_SAVE_KEY, mStopPosingOnCloseCbx->getValue().asBoolean()); + if (mResetBaseRotOnEditCbx) + gSavedSettings.setBOOL(POSER_RESETBASEROTONEDIT_SAVE_KEY, mResetBaseRotOnEditCbx->getValue().asBoolean()); + if (gSavedSettings.getBOOL(POSER_STOPPOSINGWHENCLOSED_SAVE_KEY)) stopPosingSelf(); @@ -424,7 +431,7 @@ void FSFloaterPoser::onClickToggleSelectedBoneEnabled() refreshRotationSliders(); refreshTrackpadCursor(); - refreshTextHighlightingOnAllScrollLists(); + refreshTextHighlightingOnJointScrollLists(); } void FSFloaterPoser::onClickFlipSelectedJoints() @@ -510,7 +517,7 @@ void FSFloaterPoser::onClickRecaptureSelectedBones() setSavePosesButtonText(true); refreshRotationSliders(); refreshTrackpadCursor(); - refreshTextHighlightingOnAllScrollLists(); + refreshTextHighlightingOnJointScrollLists(); } void FSFloaterPoser::onClickBrowsePoseCache() @@ -582,7 +589,9 @@ void FSFloaterPoser::onPoseMenuAction(const LLSD& param) return; loadPoseFromXml(avatar, poseName, loadType); + onJointTabSelect(); refreshJointScrollListMembers(); + setSavePosesButtonText(mPoserAnimator.allBaseRotationsAreZero(avatar)); } bool FSFloaterPoser::notDoubleClicked() @@ -819,8 +828,6 @@ void FSFloaterPoser::loadPoseFromXml(LLVOAvatar* avatar, const std::string& pose { LL_WARNS("Posing") << "Everything caught fire trying to load the pose: " << poseFileName << " exception: " << e.what() << LL_ENDL; } - - onJointTabSelect(); } void FSFloaterPoser::startPosingSelf() @@ -914,6 +921,7 @@ void FSFloaterPoser::poseControlsEnable(bool enable) void FSFloaterPoser::refreshJointScrollListMembers() { + mEntireAvJointScroll->clearRows(); mBodyJointsScrollList->clearRows(); mFaceJointsScrollList->clearRows(); mHandJointsScrollList->clearRows(); @@ -976,16 +984,10 @@ void FSFloaterPoser::refreshJointScrollListMembers() } if (item) - { item->setUserdata((void*) &*poserJoint_iter); - LLVOAvatar* avatar = getUiSelectedAvatar(); - - if (mPoserAnimator.isPosingAvatarJoint(avatar, *poserJoint_iter)) - ((LLScrollListText *) item->getColumn(COL_NAME))->setFontStyle(LLFontGL::BOLD); - else - ((LLScrollListText *) item->getColumn(COL_NAME))->setFontStyle(LLFontGL::NORMAL); - } } + + refreshTextHighlightingOnJointScrollLists(); } void FSFloaterPoser::addHeaderRowToScrollList(const std::string& jointName, LLScrollListCtrl* bodyJointsScrollList) @@ -1162,7 +1164,7 @@ void FSFloaterPoser::onSetAvatarToTpose() setSavePosesButtonText(false); mPoserAnimator.setAllAvatarStartingRotationsToZero(avatar); - refreshTextHighlightingOnAllScrollLists(); + refreshTextHighlightingOnJointScrollLists(); } void FSFloaterPoser::onResetPosition() @@ -1724,10 +1726,10 @@ void FSFloaterPoser::setSelectedJointsRotation(F32 yawInRadians, F32 pitchInRadi if (!mPoserAnimator.isPosingAvatar(avatar)) return; - E_BoneDeflectionStyles defl = getUiSelectedBoneDeflectionStyle(); - LLVector3 vec3 = LLVector3(yawInRadians, pitchInRadians, rollInRadians); - auto selectedJoints = getUiSelectedPoserJoints(); - bool savingToBvh = getSavingToBvh(); + E_BoneDeflectionStyles defl = getUiSelectedBoneDeflectionStyle(); + LLVector3 vec3 = LLVector3(yawInRadians, pitchInRadians, rollInRadians); + auto selectedJoints = getUiSelectedPoserJoints(); + bool savingToExternal = getWhetherToResetBaseRotationOnEdit(); for (auto item : selectedJoints) { @@ -1746,11 +1748,11 @@ void FSFloaterPoser::setSelectedJointsRotation(F32 yawInRadians, F32 pitchInRadi } mPoserAnimator.setJointRotation(avatar, item, vec3, defl, getJointTranslation(item->jointName()), - getJointNegation(item->jointName()), savingToBvh); + getJointNegation(item->jointName()), savingToExternal); } - if (savingToBvh) - refreshTextHighlightingOnAllScrollLists(); + if (savingToExternal) + refreshTextHighlightingOnJointScrollLists(); } void FSFloaterPoser::setSelectedJointsScale(F32 x, F32 y, F32 z) @@ -1908,7 +1910,8 @@ void FSFloaterPoser::onAvatarSelect() mStartStopPosingBtn->setValue(arePosingSelected); mSetToTposeButton->setEnabled(arePosingSelected); poseControlsEnable(arePosingSelected); - refreshTextHighlightingOnAllScrollLists(); + refreshTextHighlightingOnAvatarScrollList(); + refreshTextHighlightingOnJointScrollLists(); onJointTabSelect(); setPoseSaveFileTextBoxToUiSelectedAvatarSaveFileName(); } @@ -2043,10 +2046,10 @@ void FSFloaterPoser::onAvatarsRefresh() } mAvatarSelectionScrollList->updateLayout(); - refreshTextHighlightingOnAllScrollLists(); + refreshTextHighlightingOnAvatarScrollList(); } -void FSFloaterPoser::refreshTextHighlightingOnAllScrollLists() +void FSFloaterPoser::refreshTextHighlightingOnAvatarScrollList() { for (auto listItem : mAvatarSelectionScrollList->getAllData()) { @@ -2062,8 +2065,12 @@ void FSFloaterPoser::refreshTextHighlightingOnAllScrollLists() else ((LLScrollListText *) listItem->getColumn(COL_NAME))->setFontStyle(LLFontGL::NORMAL); } +} +void FSFloaterPoser::refreshTextHighlightingOnJointScrollLists() +{ LLVOAvatar *avatar = getUiSelectedAvatar(); + addBoldToScrollList(mBodyJointsScrollList, avatar); addBoldToScrollList(mFaceJointsScrollList, avatar); addBoldToScrollList(mHandJointsScrollList, avatar); @@ -2103,10 +2110,10 @@ void FSFloaterPoser::addBoldToScrollList(LLScrollListCtrl* list, LLVOAvatar* ava return; std::string iconValue = ""; - bool considerBvh = getSavingToBvh(); + bool considerExternalFormatSaving = getWhetherToResetBaseRotationOnEdit(); - if (considerBvh && hasString("icon_will_save_to_bvh")) - iconValue = getString("icon_will_save_to_bvh"); + if (considerExternalFormatSaving && hasString("icon_rotation_is_own_work")) + iconValue = getString("icon_rotation_is_own_work"); for (auto listItem : list->getAllData()) { @@ -2114,7 +2121,7 @@ void FSFloaterPoser::addBoldToScrollList(LLScrollListCtrl* list, LLVOAvatar* ava if (!userData) continue; - if (considerBvh) + if (considerExternalFormatSaving) { if (mPoserAnimator.baseRotationIsZero(avatar, *userData)) ((LLScrollListText*) listItem->getColumn(COL_ICON))->setValue(iconValue); @@ -2129,10 +2136,10 @@ void FSFloaterPoser::addBoldToScrollList(LLScrollListCtrl* list, LLVOAvatar* ava } } -bool FSFloaterPoser::getSavingToBvh() +bool FSFloaterPoser::getWhetherToResetBaseRotationOnEdit() { - if (!mAlsoSaveBvhCbx) + if (!mResetBaseRotOnEditCbx) return false; - return mAlsoSaveBvhCbx->getValue().asBoolean(); + return mResetBaseRotOnEditCbx->getValue().asBoolean(); } diff --git a/indra/newview/fsfloaterposer.h b/indra/newview/fsfloaterposer.h index 54f79b117c..e2b0f43ccd 100644 --- a/indra/newview/fsfloaterposer.h +++ b/indra/newview/fsfloaterposer.h @@ -292,9 +292,14 @@ class FSFloaterPoser : public LLFloater S32 getJointNegation(const std::string& jointName) const; /// - /// Refreshes the text on all scroll lists based on their state. + /// Refreshes the text on the avatars scroll list based on their state. /// - void refreshTextHighlightingOnAllScrollLists(); + void refreshTextHighlightingOnAvatarScrollList(); + + /// + /// Refreshes the text on all joints scroll lists based on their state. + /// + void refreshTextHighlightingOnJointScrollLists(); /// /// Sets the text of the save pose button. @@ -320,6 +325,14 @@ class FSFloaterPoser : public LLFloater /// true if this method has executed since mDoubleClickInterval seconds ago, otherwise false. bool notDoubleClicked(); + /// + /// Gets whether the user wishes to reset the base-rotation to zero when they start editing a joint. + /// + /// + /// If a joint has a base-rotation of zero, the rotation then appears to be the user's work and qualifies to save to a re-importable format. + /// + bool getWhetherToResetBaseRotationOnEdit(); + /// /// The time when the last click of a button was made. /// Utilized for controls needing a 'double click do' function. @@ -400,6 +413,7 @@ class FSFloaterPoser : public LLFloater LLPanel* mCollisionVolumesPnl{ nullptr }; LLPanel* mPosesLoadSavePnl{ nullptr }; LLCheckBoxCtrl* mStopPosingOnCloseCbx{ nullptr }; + LLCheckBoxCtrl* mResetBaseRotOnEditCbx{ nullptr }; }; #endif diff --git a/indra/newview/skins/default/xui/en/floater_fs_poser.xml b/indra/newview/skins/default/xui/en/floater_fs_poser.xml index 11cc0a6fac..ad93e2e620 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_poser.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_poser.xml @@ -9,6 +9,7 @@ width="403"> Inv_BodyShape Inv_Object + Check_Mark