PD: 0004582: Mulit-transformation dialog cannot be cancelled

This commit is contained in:
wmayer
2021-12-08 16:23:47 +01:00
committed by wwmayer
parent d3cad74ac6
commit 208237d2e6
5 changed files with 53 additions and 11 deletions

View File

@@ -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','"<<newFeatName<<"')");
auto Feat = pcActiveBody->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','"<<newFeatName<<"')");
auto Feat = pcActiveBody->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','"<<newFeatName<<"')");
auto Feat = pcActiveBody->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','"<<newFeatName<<"')");
auto Feat = pcActiveBody->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);
}

View File

@@ -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<PartDesign::Transformed*>(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()

View File

@@ -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;

View File

@@ -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<App::DocumentObject*> ViewProviderMultiTransform::claimChildren(void) const
{
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(getObject());

View File

@@ -38,14 +38,13 @@ public:
}
std::vector<App::DocumentObject*> claimChildren(void) const;
void setupContextMenu(QMenu*, QObject*, const char*);
virtual bool onDelete(const std::vector<std::string> &);
protected:
/// Returns a newly create dialog for the part to be placed in the task view
virtual TaskDlgFeatureParameters *getEditDialog();
};