Gui: Add Dragger placement preview in Transform dialog

This commit is contained in:
Kacper Donat
2024-12-08 17:44:22 +01:00
parent fab235682d
commit 25cf119c60
4 changed files with 57 additions and 16 deletions

View File

@@ -115,6 +115,8 @@ TaskTransform::~TaskTransform()
Gui::Application::Instance->commandManager()
.getCommandByName("Std_PerspectiveCamera")
->setEnabled(true);
savePreferences();
}
void TaskTransform::dragStartCallback(void*, SoDragger*)
@@ -244,12 +246,29 @@ void TaskTransform::setupGui()
ui->transformOriginLayout,
ui->referencePickerLayout});
loadPreferences();
updateInputLabels();
updateDraggerLabels();
updateIncrements();
updatePositionAndRotationUi();
}
void TaskTransform::loadPreferences()
{
double lastTranslationIncrement = hGrp->GetFloat("LastTranslationIncrement", 1.0);
double lastRotationIncrement = hGrp->GetFloat("LastRotationIncrement", 5.0);
ui->translationIncrementSpinBox->setValue(lastTranslationIncrement);
ui->rotationIncrementSpinBox->setValue(lastRotationIncrement);
}
void TaskTransform::savePreferences()
{
hGrp->SetFloat("LastTranslationIncrement", ui->translationIncrementSpinBox->rawValue());
hGrp->SetFloat("LastRotationIncrement", ui->rotationIncrementSpinBox->rawValue());
}
void TaskTransform::updatePositionAndRotationUi() const
{
@@ -338,22 +357,30 @@ void TaskTransform::setSelectionMode(SelectionMode mode)
{
Gui::Selection().clearSelection();
SoPickStyle* draggerPickStyle = SO_GET_PART(dragger, "pickStyle", SoPickStyle);
ui->pickTransformOriginButton->setText(tr("Pick reference"));
ui->alignToOtherObjectButton->setText(tr("Move to other object"));
switch (mode) {
case SelectionMode::SelectTransformOrigin:
draggerPickStyle->style = SoPickStyle::UNPICKABLE;
draggerPickStyle->setOverride(true);
blockSelection(false);
ui->referenceLineEdit->setText(tr("Select face, edge or vertex..."));
ui->pickTransformOriginButton->setText(tr("Cancel"));
break;
case SelectionMode::SelectAlignTarget:
draggerPickStyle->style = SoPickStyle::UNPICKABLE;
draggerPickStyle->setOverride(true);
ui->alignToOtherObjectButton->setText(tr("Cancel"));
blockSelection(false);
break;
case SelectionMode::None:
draggerPickStyle->style = SoPickStyle::SHAPE_ON_TOP;
draggerPickStyle->setOverride(false);
blockSelection(true);
break;
}
@@ -390,7 +417,10 @@ TaskTransform::CoordinateSystem TaskTransform::currentCoordinateSystem() const
void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
{
if (msg.Type != SelectionChanges::AddSelection) {
const auto isSupportedMessage =
msg.Type == SelectionChanges::AddSelection || msg.Type == SelectionChanges::SetPreselect;
if (!isSupportedMessage) {
return;
}
@@ -416,18 +446,21 @@ void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
auto selectedObjectPlacement = rootPlacement.inverse() * globalPlacement * attachedPlacement;
switch (selectionMode) {
case SelectionMode::SelectTransformOrigin: {auto label = QStringLiteral("%1#%2.%3")
auto label = QStringLiteral("%1#%2.%3")
.arg(QLatin1String(msg.pOriginalMsg->pObjectName),
QLatin1String(msg.pObjectName),
QLatin1String(msg.pSubName));
ui->referenceLineEdit->setText(label);
customTransformOrigin = selectedObjectPlacement;
updateTransformOrigin();
switch (selectionMode) {
case SelectionMode::SelectTransformOrigin: {
if (msg.Type == SelectionChanges::AddSelection) {
ui->referenceLineEdit->setText(label);
customTransformOrigin = selectedObjectPlacement;
updateTransformOrigin();
setSelectionMode(SelectionMode::None);
} else {
vp->setTransformOrigin(selectedObjectPlacement);
}
break;
}
@@ -435,8 +468,12 @@ void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
case SelectionMode::SelectAlignTarget: {
vp->setDraggerPlacement(vp->getObjectPlacement() * selectedObjectPlacement);
vp->updateTransformFromDragger();
vp->updatePlacementFromDragger();
if (msg.Type == SelectionChanges::AddSelection) {
vp->updateTransformFromDragger();
vp->updatePlacementFromDragger();
setSelectionMode(SelectionMode::None);
}
break;
}
@@ -445,9 +482,6 @@ void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
// no-op
break;
}
setSelectionMode(SelectionMode::None);
}
void TaskTransform::onAlignRotationChanged()
@@ -508,7 +542,8 @@ void TaskTransform::updateTransformOrigin()
ui->referencePickerWidget->setVisible(placementMode == PlacementMode::Custom);
if (placementMode == PlacementMode::Custom && !customTransformOrigin.has_value()) {
onPickTransformOrigin();
setSelectionMode(SelectionMode::SelectTransformOrigin);
return;
}
auto transformOrigin = getTransformOrigin(placementMode);