FIRE-34943: Add spinners to sliders

and add callback
master
Angeldark Raymaker 2025-01-11 11:48:28 +00:00
parent b909b05745
commit e293a99d94
3 changed files with 409 additions and 86 deletions

View File

@ -105,6 +105,8 @@ FSFloaterPoser::FSFloaterPoser(const LLSD& key) : LLFloater(key)
mCommitCallbackRegistrar.add("Poser.RecaptureSelectedBones", [this](LLUICtrl*, const LLSD&) { onClickRecaptureSelectedBones(); });
mCommitCallbackRegistrar.add("Poser.TogglePosingSelectedBones", [this](LLUICtrl*, const LLSD&) { onClickToggleSelectedBoneEnabled(); });
mCommitCallbackRegistrar.add("Poser.PoseJointsReset", [this](LLUICtrl*, const LLSD&) { onPoseJointsReset(); });
mCommitCallbackRegistrar.add("Poser.CommitSpinner", [this](LLUICtrl* spinnerControl, const LLSD&) { onCommitSpinner(spinnerControl); });
}
bool FSFloaterPoser::postBuild()
@ -216,6 +218,20 @@ bool FSFloaterPoser::postBuild()
mResetBaseRotCbx = getChild<LLCheckBoxCtrl>("reset_base_rotation_on_edit_checkbox");
mResetBaseRotCbx->setCommitCallback([this](LLUICtrl*, const LLSD&) { onClickSetBaseRotZero(); });
mTrackpadSensitivitySpnr = getChild<LLUICtrl>("trackpad_sensitivity_spinner");
mYawSpnr = getChild<LLUICtrl>("limb_yaw_spinner");
mPitchSpnr = getChild<LLUICtrl>("limb_pitch_spinner");
mRollSpnr = getChild<LLUICtrl>("limb_roll_spinner");
mUpDownSpnr = getChild<LLUICtrl>("av_position_updown_spinner");
mLeftRightSpnr = getChild<LLUICtrl>("av_position_leftright_spinner");
mInOutSpnr = getChild<LLUICtrl>("av_position_inout_spinner");
mAdvPosXSpnr = getChild<LLUICtrl>("adv_posx_spinner");
mAdvPosYSpnr = getChild<LLUICtrl>("adv_posy_spinner");
mAdvPosZSpnr = getChild<LLUICtrl>("adv_posz_spinner");
mScaleXSpnr = getChild<LLUICtrl>("adv_scalex_spinner");
mScaleYSpnr = getChild<LLUICtrl>("adv_scaley_spinner");
mScaleZSpnr = getChild<LLUICtrl>("adv_scalez_spinner");
return true;
}
@ -566,6 +582,84 @@ void FSFloaterPoser::onClickBrowsePoseCache()
gViewerWindow->getWindow()->openFile(pathname);
}
void FSFloaterPoser::onCommitSpinner(LLUICtrl* spinner)
{
if (!spinner)
return;
F32 value = (F32)spinner->getValue().asReal();
if (spinner == mTrackpadSensitivitySpnr)
{
mTrackpadSensitivitySlider->setValue(value);
onAdjustTrackpadSensitivity();
return;
}
if (spinner == mInOutSpnr || spinner == mAdvPosXSpnr)
{
mPosXSlider->setValue(value);
onAvatarPositionSet();
return;
}
if (spinner == mLeftRightSpnr || spinner == mAdvPosYSpnr)
{
mPosYSlider->setValue(value);
onAvatarPositionSet();
return;
}
if (spinner == mUpDownSpnr || spinner == mAdvPosZSpnr)
{
mPosZSlider->setValue(value);
onAvatarPositionSet();
return;
}
if (spinner == mScaleXSpnr)
{
mAdvScaleXSlider->setValue(value);
onAdvancedScaleSet();
return;
}
if (spinner == mScaleYSpnr)
{
mAdvScaleYSlider->setValue(value);
onAdvancedScaleSet();
return;
}
if (spinner == mScaleZSpnr)
{
mAdvScaleZSlider->setValue(value);
onAdvancedScaleSet();
return;
}
if (spinner == mYawSpnr)
{
mLimbYawSlider->setValue(value);
onYawPitchRollSliderChanged();
return;
}
if (spinner == mPitchSpnr)
{
mLimbPitchSlider->setValue(value);
onYawPitchRollSliderChanged();
return;
}
if (spinner == mRollSpnr)
{
mLimbRollSlider->setValue(value);
onYawPitchRollSliderChanged();
return;
}
}
void FSFloaterPoser::onPoseJointsReset()
{
if (notDoubleClicked())
@ -1569,6 +1663,13 @@ void FSFloaterPoser::onAdvancedPositionSet()
F32 posY = mAdvPosYSlider->getValueF32();
F32 posZ = mAdvPosZSlider->getValueF32();
mAdvPosXSpnr->setValue(posX);
mInOutSpnr->setValue(posX);
mAdvPosYSpnr->setValue(posY);
mLeftRightSpnr->setValue(posY);
mAdvPosZSpnr->setValue(posZ);
mUpDownSpnr->setValue(posZ);
setSelectedJointsPosition(posX, posY, posZ);
refreshAvatarPositionSliders();
}
@ -1579,6 +1680,10 @@ void FSFloaterPoser::onAdvancedScaleSet()
F32 scY = mAdvScaleYSlider->getValueF32();
F32 scZ = mAdvScaleZSlider->getValueF32();
mScaleXSpnr->setValue(scX);
mScaleYSpnr->setValue(scY);
mScaleZSpnr->setValue(scZ);
setSelectedJointsScale(scX, scY, scZ);
}
@ -1588,6 +1693,13 @@ void FSFloaterPoser::onAvatarPositionSet()
F32 posY = mPosYSlider->getValueF32();
F32 posZ = mPosZSlider->getValueF32();
mAdvPosXSpnr->setValue(posX);
mInOutSpnr->setValue(posX);
mAdvPosYSpnr->setValue(posY);
mLeftRightSpnr->setValue(posY);
mAdvPosZSpnr->setValue(posZ);
mUpDownSpnr->setValue(posZ);
setSelectedJointsPosition(posX, posY, posZ);
refreshAdvancedPositionSliders();
}
@ -1628,6 +1740,10 @@ void FSFloaterPoser::onLimbTrackballChanged()
mLimbYawSlider->setValue(trackPadPos.mV[VX] *= RAD_TO_DEG);
mLimbPitchSlider->setValue(trackPadPos.mV[VY] *= RAD_TO_DEG);
mLimbRollSlider->setValue(trackPadPos.mV[VZ] *= RAD_TO_DEG);
mYawSpnr->setValue(mLimbYawSlider->getValueF32());
mPitchSpnr->setValue(mLimbPitchSlider->getValueF32());
mRollSpnr->setValue(mLimbRollSlider->getValueF32());
}
F32 FSFloaterPoser::unWrapScale(F32 scale)
@ -1669,6 +1785,10 @@ void FSFloaterPoser::onYawPitchRollSliderChanged()
absoluteRotation.mV[VZ] /= NormalTrackpadRangeInRads;
mAvatarTrackball->setValue(absoluteRotation.getValue());
mYawSpnr->setValue(mLimbYawSlider->getValueF32());
mPitchSpnr->setValue(mLimbPitchSlider->getValueF32());
mRollSpnr->setValue(mLimbRollSlider->getValueF32());
}
void FSFloaterPoser::onAdjustTrackpadSensitivity()

View File

@ -253,6 +253,7 @@ class FSFloaterPoser : public LLFloater
void onClickLoadRightHandPose();
void onClickLoadHandPose(bool isRightHand);
void onClickSetBaseRotZero();
void onCommitSpinner(LLUICtrl* spinner);
// UI Refreshments
void refreshRotationSliders();
@ -496,6 +497,20 @@ class FSFloaterPoser : public LLFloater
LLCheckBoxCtrl* mResetBaseRotCbx{ nullptr };
LLCheckBoxCtrl* mAlsoSaveBvhCbx{ nullptr };
LLUICtrl* mTrackpadSensitivitySpnr{ nullptr };
LLUICtrl* mYawSpnr{ nullptr };
LLUICtrl* mPitchSpnr{ nullptr };
LLUICtrl* mRollSpnr{ nullptr };
LLUICtrl* mUpDownSpnr{ nullptr };
LLUICtrl* mLeftRightSpnr{ nullptr };
LLUICtrl* mInOutSpnr{ nullptr };
LLUICtrl* mAdvPosXSpnr{ nullptr };
LLUICtrl* mAdvPosYSpnr{ nullptr };
LLUICtrl* mAdvPosZSpnr{ nullptr };
LLUICtrl* mScaleXSpnr{ nullptr };
LLUICtrl* mScaleYSpnr{ nullptr };
LLUICtrl* mScaleZSpnr{ nullptr };
};
#endif

View File

@ -351,6 +351,7 @@ width="403">
</text>
<slider
decimal_digits="2"
show_text="false"
follows="left|top"
height="16"
increment="0.01"
@ -361,18 +362,32 @@ width="403">
max_val="1.5"
name="av_position_updown"
top_pad="5"
width="172"
width="122"
tool_tip="Move the selected avatar up or down"
can_edit_text="true">
<slider.commit_callback
function="Poser.PositionSet"/>
</slider>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="av_position_updown_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<text
follows="left|top"
name="av_position_leftright_label"
height="10"
layout="topleft"
left_delta="-5"
left="0"
top_pad="5"
width="172">
Left/Right:
@ -380,6 +395,7 @@ width="403">
<slider
decimal_digits="2"
follows="left|top"
show_text="false"
height="16"
increment="0.01"
initial_value="0"
@ -389,18 +405,32 @@ width="403">
max_val="1.5"
name="av_position_leftright"
top_pad="5"
width="172"
width="122"
tool_tip="Move the selected avatar left or right"
can_edit_text="true">
<slider.commit_callback
function="Poser.PositionSet"/>
</slider>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="av_position_leftright_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<text
follows="left|top"
name="av_position_inout_label"
height="10"
layout="topleft"
left_delta="-5"
left="0"
top_pad="5"
width="172">
In/Out:
@ -408,6 +438,7 @@ width="403">
<slider
decimal_digits="2"
follows="left|top"
show_text="false"
height="16"
increment="0.01"
initial_value="0"
@ -417,13 +448,27 @@ width="403">
max_val="1.5"
name="av_position_inout"
top_pad="5"
width="172"
width="122"
tool_tip="Move the selected avatar in or out"
can_edit_text="true">
<slider.commit_callback
function="Poser.PositionSet"/>
</slider>
<!-- so this panel behaves like the others in the code behind, it has an invisible list... -->
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="av_position_inout_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<!-- to make this panel behaves like the others in code-behind, it has an invisible list -->
<scroll_list
visible="false"
column_padding="2"
@ -805,13 +850,28 @@ width="403">
left_delta="0"
max_val="2"
min_val="0.01"
show_text="false"
name="trackpad_sensitivity_slider"
tool_tip="Adjusts the sensitivity of the trackball"
top_pad="3"
width="170" >
width="120" >
<slider.commit_callback
function="Poser.AdjustTrackPadSensitivity"/>
</slider>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="trackpad_sensitivity_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<check_box
control_name="FSPoserStopPosingWhenClosed"
name="stop_posing_on_close_checkbox"
@ -820,7 +880,7 @@ width="403">
follows="left|top"
left="5"
tool_tip="Not stopping your pose can be helpful if you do a lot of work, and don't want to accidentally lose it."
top_pad="5"
top_pad="10"
width="134" />
<check_box
control_name="FSPoserResetBaseRotationOnEdit"
@ -992,7 +1052,7 @@ width="403">
name="limb_pitch_label"
height="10"
layout="topleft"
left_delta="0"
left="0"
top_pad="2"
width="200">
Up/Down:
@ -1008,16 +1068,30 @@ width="403">
min_val="-180"
max_val="180"
name="limb_pitch"
show_text="false"
top_pad="2"
width="150"
can_edit_text="true"/>
width="98"/>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.1"
top_pad="-19"
left_pad="0"
name="limb_pitch_spinner"
min_val="-180"
max_val="180"
width="57">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<text
follows="left|top"
name="limb_yaw_label"
height="10"
layout="topleft"
left_delta="-5"
top_pad="0"
left="0"
top_pad="2"
width="200">
Left/Right:
</text>
@ -1032,16 +1106,31 @@ width="403">
min_val="-180"
max_val="180"
name="limb_yaw"
show_text="false"
top_pad="0"
width="150"
width="98"
can_edit_text="true"/>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.1"
top_pad="-19"
left_pad="0"
name="limb_yaw_spinner"
min_val="-180"
max_val="180"
width="57">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<text
follows="left|top"
name="limb_roll_label"
height="10"
layout="topleft"
left_delta="-5"
top_pad="-1"
left="0"
top_pad="2"
width="200">
Roll:
</text>
@ -1052,13 +1141,28 @@ width="403">
increment="0.1"
initial_value="0"
layout="topleft"
show_text="false"
left_delta="5"
min_val="-180"
max_val="180"
name="limb_roll"
top_pad="-1"
width="150"
width="98"
can_edit_text="true"/>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.1"
top_pad="-18"
left_pad="0"
name="limb_roll_spinner"
min_val="-180"
max_val="180"
width="57">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
</panel>
<panel
follows="top|left|bottom"
@ -1300,13 +1404,13 @@ width="403">
<layout_panel
follows="top|left|right"
layout="topleft"
height="97"
height="99"
auto_resize="false"
name="advanced_controls_layout"
width="600">
<panel
follows="top|left|right"
height="97"
height="99"
left="0"
layout="all"
enabled="false"
@ -1318,7 +1422,7 @@ width="403">
<tab_container
follows="all"
halign="center"
height="97"
height="99"
layout="topleft"
name="modifier_tabs"
tab_height="20"
@ -1329,7 +1433,7 @@ width="403">
<panel
follows="all"
background_visible="false"
height="97"
height="99"
layout="topleft"
left="0"
title="Body Part Position"
@ -1337,75 +1441,114 @@ width="403">
top="0"
width="555">
<slider
decimal_digits="3"
can_edit_text="true"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
label="Position X:"
label_width="70"
label_width="60"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
layout="topleft"
left="10"
max_val="0.5"
min_val="-0.5"
show_text="false"
left="3"
max_val="1.5"
min_val="-1.5"
name="Advanced_Position_X"
top_pad="6"
width="380" >
top_pad="2"
width="342" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<slider
decimal_digits="3"
can_edit_text="true"
<spinner
height="0"
decimal_digits="2"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
increment="0.01"
top_pad="-19"
left_pad="2"
name="adv_posx_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<slider
label="Position Y:"
label_width="70"
layout="topleft"
left_delta="0"
max_val="0.5"
min_val="-0.5"
name="Advanced_Position_Y"
top_pad="1"
width="380" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<slider
decimal_digits="3"
can_edit_text="true"
label_width="60"
follows="left|top"
height="14"
top_pad="24"
increment="0.001"
initial_value="0"
label="Position Z:"
label_width="70"
show_text="false"
layout="topleft"
left_delta="0"
max_val="0.5"
min_val="-0.5"
name="Advanced_Position_Z"
top_pad="1"
width="380" >
max_val="1.5"
min_val="-1.5"
name="Advanced_Position_Y"
left="3"
width="342" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<spinner
height="0"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-17"
left_pad="2"
name="adv_posy_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<slider
label="Position Z:"
label_width="60"
show_text="false"
follows="left|top"
height="14"
top_pad="22"
increment="0.001"
initial_value="0"
layout="topleft"
max_val="1.5"
min_val="-1.5"
name="Advanced_Position_Z"
left="3"
width="342" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<spinner
height="12"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-15"
left_pad="2"
name="adv_posz_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<button
height="21"
follows="left|top"
layout="topleft"
label="Undo Position Change"
label="Undo Position"
image_overlay="Script_Undo"
image_overlay_alignment="left"
image_unselected="Toolbar_Middle_Off"
name="undo_position_change"
tool_tip="Undo the last position change"
width="150"
top_pad="2"
left_delta="0">
width="109"
left="3"
top_pad="5">
<button.commit_callback
function="Poser.UndoLastPosition"/>
</button>
@ -1419,7 +1562,7 @@ width="403">
image_unselected="Toolbar_Middle_Off"
name="redo_position_change"
tool_tip="Redo the last position change"
width="110"
width="108"
top_delta="0"
left_pad="4">
<button.commit_callback
@ -1435,7 +1578,7 @@ width="403">
image_unselected="Toolbar_Middle_Off"
name="reset_positions"
tool_tip="Double click to reset position back to original"
width="110"
width="109"
top_delta="0"
left_pad="4">
<button.commit_callback
@ -1445,7 +1588,7 @@ width="403">
<panel
follows="all"
background_visible="false"
height="97"
height="99"
layout="topleft"
left="0"
title="Body Part Scale"
@ -1455,73 +1598,118 @@ width="403">
<slider
decimal_digits="3"
can_edit_text="true"
show_text="false"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
label="Scale X:"
label_width="70"
label_width="43"
layout="topleft"
left="10"
left="3"
max_val="2"
min_val="-2"
name="Advanced_Scale_X"
top_pad="6"
width="380" >
top_pad="2"
width="342" >
<slider.commit_callback
function="Poser.Advanced.ScaleSet"/>
</slider>
<spinner
height="0"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="2"
name="adv_scalex_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<slider
decimal_digits="3"
can_edit_text="true"
show_text="false"
follows="left|top"
height="14"
top_pad="24"
increment="0.001"
initial_value="0"
label="Scale Y:"
label_width="70"
label_width="43"
layout="topleft"
left_delta="0"
left="3"
max_val="2"
min_val="-2"
name="Advanced_Scale_Y"
top_pad="1"
width="380" >
width="342" >
<slider.commit_callback
function="Poser.Advanced.ScaleSet"/>
</slider>
<spinner
height="0"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-17"
left_pad="2"
name="adv_scaley_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<slider
decimal_digits="3"
can_edit_text="true"
show_text="false"
follows="left|top"
height="14"
top_pad="22"
increment="0.001"
initial_value="0"
label="Scale Z:"
label_width="70"
label_width="43"
layout="topleft"
left_delta="0"
left="3"
max_val="2"
min_val="-2"
name="Advanced_Scale_Z"
top_pad="1"
width="380" >
width="342" >
<slider.commit_callback
function="Poser.Advanced.ScaleSet"/>
</slider>
<spinner
height="12"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-15"
left_pad="2"
name="adv_scalez_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner" />
</spinner>
<button
height="21"
follows="left|top"
layout="topleft"
label="Undo Scale Change"
label="Undo Scale"
image_overlay="Script_Undo"
image_overlay_alignment="left"
image_unselected="Toolbar_Middle_Off"
name="undo_scale_change"
tool_tip="Undo the last scale change"
width="150"
top_pad="2"
left_delta="0">
width="109"
left="3"
top_pad="5">
<button.commit_callback
function="Poser.UndoLastScale"/>
</button>
@ -1535,7 +1723,7 @@ width="403">
image_unselected="Toolbar_Middle_Off"
name="redo_scale_change"
tool_tip="Redo the last scale change"
width="110"
width="108"
top_delta="0"
left_pad="4">
<button.commit_callback
@ -1551,7 +1739,7 @@ width="403">
image_unselected="Toolbar_Middle_Off"
name="reset_scales"
tool_tip="Double click to reset scale back to original"
width="110"
width="109"
top_delta="0"
left_pad="4">
<button.commit_callback