diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index b0b1d87ee2..7afbb77309 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -275,6 +275,7 @@ void TaskMultiTransformParameters::onTransformEdit() else return; // TODO: Show an error? + subTask->setEnabledTransaction(isEnabledTransaction()); connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), subTask, SLOT(onUpdateView(bool))); } @@ -293,7 +294,9 @@ void TaskMultiTransformParameters::onTransformAddMirrored() if (!pcActiveBody) return; - Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Mirrored")); + if (isEnabledTransaction()) + Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Mirrored")); + FCMD_OBJ_CMD(pcActiveBody, "newObject('PartDesign::Mirrored','"<getDocument()->getObject(newFeatName.c_str()); if (!Feat) @@ -319,7 +322,9 @@ void TaskMultiTransformParameters::onTransformAddLinearPattern() if (!pcActiveBody) return; - Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Make LinearPattern")); + if (isEnabledTransaction()) + Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Make LinearPattern")); + FCMD_OBJ_CMD(pcActiveBody, "newObject('PartDesign::LinearPattern','"<getDocument()->getObject(newFeatName.c_str()); if (!Feat) @@ -355,7 +360,9 @@ void TaskMultiTransformParameters::onTransformAddPolarPattern() if (!pcActiveBody) return; - Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "PolarPattern")); + if (isEnabledTransaction()) + Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "PolarPattern")); + FCMD_OBJ_CMD(pcActiveBody, "newObject('PartDesign::PolarPattern','"<getDocument()->getObject(newFeatName.c_str()); if (!Feat) @@ -381,7 +388,9 @@ void TaskMultiTransformParameters::onTransformAddScaled() if (!pcActiveBody) return; - Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Scaled")); + if (isEnabledTransaction()) + Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Scaled")); + FCMD_OBJ_CMD(pcActiveBody, "newObject('PartDesign::Scaled','"<getDocument()->getObject(newFeatName.c_str()); if (!Feat) @@ -494,7 +503,6 @@ void TaskMultiTransformParameters::onUpdateView(bool on) { blockUpdate = !on; if (on) { - setupTransaction(); recomputeFeature(); } } @@ -539,6 +547,7 @@ TaskDlgMultiTransformParameters::TaskDlgMultiTransformParameters(ViewProviderMul : TaskDlgTransformedParameters(MultiTransformView) { parameter = new TaskMultiTransformParameters(MultiTransformView); + parameter->setEnabledTransaction(false); Content.push_back(parameter); } diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 87deeaa282..595af78a66 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -170,6 +170,9 @@ bool TaskTransformedParameters::originalSelected(const Gui::SelectionChanges& ms void TaskTransformedParameters::setupTransaction() { + if (!isEnabledTransaction()) + return; + auto obj = getObject(); if (!obj) return; @@ -185,6 +188,16 @@ void TaskTransformedParameters::setupTransaction() transactionID = App::GetApplication().setActiveTransaction(n.c_str()); } +void TaskTransformedParameters::setEnabledTransaction(bool on) +{ + enableTransaction = on; +} + +bool TaskTransformedParameters::isEnabledTransaction() const +{ + return enableTransaction; +} + void TaskTransformedParameters::onButtonAddFeature(bool checked) { if (checked) { @@ -322,13 +335,15 @@ PartDesignGui::ViewProviderTransformed *TaskTransformedParameters::getTopTransfo } else { rv = TransformedView; } - assert (rv); - return rv; } PartDesign::Transformed *TaskTransformedParameters::getTopTransformedObject() const { - App::DocumentObject *transform = getTopTransformedView()->getObject(); + ViewProviderTransformed* vp = getTopTransformedView(); + if (!vp) + return nullptr; + + App::DocumentObject *transform = vp->getObject(); assert (transform->isDerivedFrom(PartDesign::Transformed::getClassTypeId())); return static_cast(transform); } @@ -344,6 +359,9 @@ PartDesign::Transformed *TaskTransformedParameters::getObject() const { App::DocumentObject *TaskTransformedParameters::getBaseObject() const { PartDesign::Feature* feature = getTopTransformedObject (); + if (!feature) + return nullptr; + // NOTE: getBaseObject() throws if there is no base; shouldn't happen here. App::DocumentObject *base = feature->getBaseObject(true); if(!base) { @@ -355,7 +373,8 @@ App::DocumentObject *TaskTransformedParameters::getBaseObject() const { } App::DocumentObject* TaskTransformedParameters::getSketchObject() const { - return getTopTransformedObject()->getSketchObject(); + PartDesign::Transformed* feature = getTopTransformedObject(); + return feature ? feature->getSketchObject() : nullptr; } void TaskTransformedParameters::hideObject() diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index dd22971828..0acb02b31c 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -143,6 +143,14 @@ public: virtual void apply() = 0; + /*! + * \brief setEnabledTransaction + * The transaction handling of this panel can be disabled if there is another + * instance that does it already, e.g. TaskDlgMultiTransformParameters. + * By default, transactions are enabled. + */ + void setEnabledTransaction(bool); + bool isEnabledTransaction() const; void setupTransaction(); int getTransactionID() const { @@ -213,6 +221,7 @@ protected: QWidget* proxy; ViewProviderTransformed *TransformedView; int transactionID = 0; + bool enableTransaction = true; enum selectionModes { none, addFeature, removeFeature, reference }; selectionModes selectionMode; diff --git a/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.cpp b/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.cpp index 42317452c4..cbd6f4641f 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.cpp @@ -39,6 +39,12 @@ TaskDlgFeatureParameters *ViewProviderMultiTransform::getEditDialog() { return new TaskDlgMultiTransformParameters (this); } +void ViewProviderMultiTransform::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) +{ + this->addDefaultAction(menu, QObject::tr("Edit %1").arg(QString::fromStdString(featureName))); + PartDesignGui::ViewProvider::setupContextMenu(menu, receiver, member); +} + std::vector ViewProviderMultiTransform::claimChildren(void) const { PartDesign::MultiTransform* pcMultiTransform = static_cast(getObject()); diff --git a/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.h b/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.h index 66c7040272..6fa8dc087b 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.h +++ b/src/Mod/PartDesign/Gui/ViewProviderMultiTransform.h @@ -38,14 +38,13 @@ public: } std::vector claimChildren(void) const; + void setupContextMenu(QMenu*, QObject*, const char*); virtual bool onDelete(const std::vector &); protected: /// Returns a newly create dialog for the part to be placed in the task view virtual TaskDlgFeatureParameters *getEditDialog(); - - };