From 25cf119c60db7398391dc8fad96513d8d4acbf22 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sun, 8 Dec 2024 17:44:22 +0100 Subject: [PATCH] Gui: Add Dragger placement preview in Transform dialog --- src/Gui/SoFCCSysDragger.cpp | 5 ++- src/Gui/SoFCCSysDragger.h | 1 + src/Gui/TaskCSysDragger.cpp | 65 ++++++++++++++++++++++++++++--------- src/Gui/TaskCSysDragger.h | 2 ++ 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/Gui/SoFCCSysDragger.cpp b/src/Gui/SoFCCSysDragger.cpp index a395b968b1..3d4ad6b650 100644 --- a/src/Gui/SoFCCSysDragger.cpp +++ b/src/Gui/SoFCCSysDragger.cpp @@ -1044,7 +1044,7 @@ SoFCCSysDragger::SoFCCSysDragger() SO_KIT_ADD_CATALOG_ENTRY(annotation, So3DAnnotation, TRUE, geomSeparator, "", TRUE); SO_KIT_ADD_CATALOG_ENTRY(scaleNode, SoScale, TRUE, annotation, "", TRUE); - + SO_KIT_ADD_CATALOG_ENTRY(pickStyle, SoPickStyle, TRUE, annotation, "", TRUE); // Translator SO_KIT_ADD_CATALOG_ENTRY(xTranslatorSwitch, SoSwitch, TRUE, annotation, "", TRUE); @@ -1309,6 +1309,9 @@ SoFCCSysDragger::SoFCCSysDragger() localScaleNode->scaleFactor.connectFrom(&scaleEngine->vector); autoScaleResult.connectFrom(&draggerSize); + SoPickStyle* localPickStyle = SO_GET_ANY_PART(this, "pickStyle", SoPickStyle); + localPickStyle->style = SoPickStyle::SHAPE_ON_TOP; + addValueChangedCallback(&SoFCCSysDragger::valueChangedCB); translationSensor.setFunction(&SoFCCSysDragger::translationSensorCB); diff --git a/src/Gui/SoFCCSysDragger.h b/src/Gui/SoFCCSysDragger.h index b759bcf70a..99c7a77ac6 100644 --- a/src/Gui/SoFCCSysDragger.h +++ b/src/Gui/SoFCCSysDragger.h @@ -217,6 +217,7 @@ class GuiExport SoFCCSysDragger : public SoDragger SO_KIT_HEADER(SoFCCSysDragger); SO_KIT_CATALOG_ENTRY_HEADER(annotation); SO_KIT_CATALOG_ENTRY_HEADER(scaleNode); + SO_KIT_CATALOG_ENTRY_HEADER(pickStyle); // Translator SO_KIT_CATALOG_ENTRY_HEADER(xTranslatorSwitch); SO_KIT_CATALOG_ENTRY_HEADER(yTranslatorSwitch); diff --git a/src/Gui/TaskCSysDragger.cpp b/src/Gui/TaskCSysDragger.cpp index ad9d8e61cf..6c9a90d734 100644 --- a/src/Gui/TaskCSysDragger.cpp +++ b/src/Gui/TaskCSysDragger.cpp @@ -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); diff --git a/src/Gui/TaskCSysDragger.h b/src/Gui/TaskCSysDragger.h index aac80bf0b9..c7f7ed1d35 100644 --- a/src/Gui/TaskCSysDragger.h +++ b/src/Gui/TaskCSysDragger.h @@ -134,6 +134,8 @@ private: std::optional customTransformOrigin {}; Base::Placement originalPlacement {}; + + ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/History/Dragger"); }; class TaskCSysDragger: public Gui::TaskView::TaskDialog