From 24c138373c28674d90f18507bb95ebd91b07f048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Althaus?= Date: Sat, 17 Feb 2024 11:16:34 +0100 Subject: [PATCH] Move duplicated code to the base class All pattern sublcasses contain the same code for handling the feature list. This code is now moved into the base class that handles the common ui. The subclasses now only need to call the setupUI/setupParameterUI function in their constructors and implement the setupParameterUI function to create their parameter ui into the specified widget. The MultiTransform also handles it's common ui and the subclasses can reuse setupParameterUI without code duplication. --- .../Gui/TaskLinearPatternParameters.cpp | 172 ++++-------------- .../Gui/TaskLinearPatternParameters.h | 10 +- .../PartDesign/Gui/TaskMirroredParameters.cpp | 126 +------------ .../PartDesign/Gui/TaskMirroredParameters.h | 10 +- .../Gui/TaskMultiTransformParameters.cpp | 136 ++++---------- .../Gui/TaskMultiTransformParameters.h | 10 +- .../Gui/TaskPolarPatternParameters.cpp | 170 +++-------------- .../Gui/TaskPolarPatternParameters.h | 10 +- .../PartDesign/Gui/TaskScaledParameters.cpp | 121 +----------- src/Mod/PartDesign/Gui/TaskScaledParameters.h | 9 +- .../Gui/TaskTransformedParameters.cpp | 109 ++++++++++- .../Gui/TaskTransformedParameters.h | 19 +- 12 files changed, 249 insertions(+), 653 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index b0e6c13d64..e9bb9b2358 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -24,7 +24,6 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include # include # include #endif @@ -57,104 +56,22 @@ TaskLinearPatternParameters::TaskLinearPatternParameters(ViewProviderTransformed : TaskTransformedParameters(TransformedView, parent) , ui(new Ui_TaskLinearPatternParameters) { - // we need a separate container widget to add all controls to - proxy = new QWidget(this); - ui->setupUi(proxy); - QMetaObject::connectSlotsByName(this); - - this->groupLayout()->addWidget(proxy); - - ui->buttonOK->hide(); - ui->checkBoxUpdateView->setEnabled(true); - - selectionMode = none; - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } -TaskLinearPatternParameters::TaskLinearPatternParameters(TaskMultiTransformParameters *parentTask, QLayout *layout) +TaskLinearPatternParameters::TaskLinearPatternParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget) : TaskTransformedParameters(parentTask), ui(new Ui_TaskLinearPatternParameters) { - proxy = new QWidget(parentTask); - ui->setupUi(proxy); - connect(ui->buttonOK, &QToolButton::pressed, - parentTask, &TaskLinearPatternParameters::onSubTaskButtonOK); + setupParameterUI(parameterWidget); +} + +void TaskLinearPatternParameters::setupParameterUI(QWidget *widget) +{ + ui->setupUi(widget); QMetaObject::connectSlotsByName(this); - layout->addWidget(proxy); - - ui->buttonOK->setEnabled(true); - ui->buttonAddFeature->hide(); - ui->buttonRemoveFeature->hide(); - ui->listWidgetFeatures->hide(); - ui->checkBoxUpdateView->hide(); - - selectionMode = none; - - // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! - blockUpdate = false; - setupUI(); -} - -void TaskLinearPatternParameters::connectSignals() -{ - connect(ui->buttonAddFeature, &QToolButton::toggled, - this, &TaskLinearPatternParameters::onButtonAddFeature); - connect(ui->buttonRemoveFeature, &QToolButton::toggled, - this, &TaskLinearPatternParameters::onButtonRemoveFeature); - - // Create context menu - QAction* action = new QAction(tr("Remove"), this); - action->setShortcut(QKeySequence::Delete); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - // display shortcut behind the context menu entry - action->setShortcutVisibleInContextMenu(true); -#endif - ui->listWidgetFeatures->addAction(action); - connect(action, &QAction::triggered, this, &TaskLinearPatternParameters::onFeatureDeleted); - ui->listWidgetFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(ui->listWidgetFeatures->model(), &QAbstractListModel::rowsMoved, - this, &TaskLinearPatternParameters::indexesMoved); - - updateViewTimer = new QTimer(this); - updateViewTimer->setSingleShot(true); - updateViewTimer->setInterval(getUpdateViewTimeout()); - connect(updateViewTimer, &QTimer::timeout, - this, &TaskLinearPatternParameters::onUpdateViewTimer); - - connect(ui->comboDirection, qOverload(&QComboBox::activated), - this, &TaskLinearPatternParameters::onDirectionChanged); - connect(ui->checkReverse, &QCheckBox::toggled, - this, &TaskLinearPatternParameters::onCheckReverse); - connect(ui->comboMode, qOverload(&QComboBox::activated), - this, &TaskLinearPatternParameters::onModeChanged); - connect(ui->spinLength, qOverload(&Gui::QuantitySpinBox::valueChanged), - this, &TaskLinearPatternParameters::onLength); - connect(ui->spinOffset, qOverload(&Gui::QuantitySpinBox::valueChanged), - this, &TaskLinearPatternParameters::onOffset); - connect(ui->spinOccurrences, &Gui::UIntSpinBox::unsignedChanged, - this, &TaskLinearPatternParameters::onOccurrences); - connect(ui->checkBoxUpdateView, &QCheckBox::toggled, - this, &TaskLinearPatternParameters::onUpdateView); -} - -void TaskLinearPatternParameters::setupUI() -{ // Get the feature data PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); - std::vector originals = pcLinearPattern->Originals.getValues(); - - // Fill data into dialog elements - for (auto obj : originals) { - if (obj) { - QListWidgetItem* item = new QListWidgetItem(); - item->setText(QString::fromUtf8(obj->Label.getValue())); - item->setData(Qt::UserRole, QString::fromLatin1(obj->getNameInDocument())); - ui->listWidgetFeatures->addItem(item); - } - } - // --------------------- ui->spinLength->bind(pcLinearPattern->Length); ui->spinOffset->bind(pcLinearPattern->Offset); @@ -198,7 +115,30 @@ void TaskLinearPatternParameters::setupUI() } adaptVisibilityToMode(); - connectSignals(); + + updateViewTimer = new QTimer(this); + updateViewTimer->setSingleShot(true); + updateViewTimer->setInterval(getUpdateViewTimeout()); + connect(updateViewTimer, &QTimer::timeout, + this, &TaskLinearPatternParameters::onUpdateViewTimer); + + connect(ui->comboDirection, qOverload(&QComboBox::activated), + this, &TaskLinearPatternParameters::onDirectionChanged); + connect(ui->checkReverse, &QCheckBox::toggled, + this, &TaskLinearPatternParameters::onCheckReverse); + connect(ui->comboMode, qOverload(&QComboBox::activated), + this, &TaskLinearPatternParameters::onModeChanged); + connect(ui->spinLength, qOverload(&Gui::QuantitySpinBox::valueChanged), + this, &TaskLinearPatternParameters::onLength); + connect(ui->spinOffset, qOverload(&Gui::QuantitySpinBox::valueChanged), + this, &TaskLinearPatternParameters::onOffset); + connect(ui->spinOccurrences, &Gui::UIntSpinBox::unsignedChanged, + this, &TaskLinearPatternParameters::onOccurrences); +} + +void TaskLinearPatternParameters::retranslateParameterUI(QWidget* widget) +{ + ui->retranslateUi(widget); } void TaskLinearPatternParameters::updateUI() @@ -255,23 +195,6 @@ void TaskLinearPatternParameters::kickUpdateViewTimer() const updateViewTimer->start(); } -void TaskLinearPatternParameters::addObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - QString objectName = QString::fromLatin1(obj->getNameInDocument()); - - QListWidgetItem* item = new QListWidgetItem(); - item->setText(label); - item->setData(Qt::UserRole, objectName); - ui->listWidgetFeatures->addItem(item); -} - -void TaskLinearPatternParameters::removeObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - removeItemFromListWidget(ui->listWidgetFeatures, label); -} - void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { if (selectionMode != none && msg.Type == Gui::SelectionChanges::AddSelection) { @@ -303,12 +226,6 @@ void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges } } -void TaskLinearPatternParameters::clearButtons() -{ - ui->buttonAddFeature->setChecked(false); - ui->buttonRemoveFeature->setChecked(false); -} - void TaskLinearPatternParameters::onCheckReverse(const bool on) { if (blockUpdate) return; @@ -406,22 +323,6 @@ void TaskLinearPatternParameters::onUpdateView(bool on) } } -void TaskLinearPatternParameters::onFeatureDeleted() -{ - PartDesign::Transformed* pcTransformed = getObject(); - std::vector originals = pcTransformed->Originals.getValues(); - int currentRow = ui->listWidgetFeatures->currentRow(); - if (currentRow < 0) { - Base::Console().Error("PartDesign LinearPattern: No feature selected for removing.\n"); - return; //no current row selected - } - originals.erase(originals.begin() + currentRow); - setupTransaction(); - pcTransformed->Originals.setValues(originals); - ui->listWidgetFeatures->model()->removeRow(currentRow); - recomputeFeature(); -} - void TaskLinearPatternParameters::getDirection(App::DocumentObject*& obj, std::vector& sub) const { const App::PropertyLinkSub &lnk = dirLinks.getCurrentLink(); @@ -469,17 +370,6 @@ TaskLinearPatternParameters::~TaskLinearPatternParameters() catch (const Base::Exception &ex) { Base::Console().Error ("%s\n", ex.what () ); } - - if (proxy) - delete proxy; -} - -void TaskLinearPatternParameters::changeEvent(QEvent *e) -{ - TaskBox::changeEvent(e); - if (e->type() == QEvent::LanguageChange) { - ui->retranslateUi(proxy); - } } void TaskLinearPatternParameters::apply() diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h index 41cb67733e..cce38910e3 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h @@ -50,7 +50,7 @@ public: /// Constructor for task with ViewProvider explicit TaskLinearPatternParameters(ViewProviderTransformed *TransformedView, QWidget *parent = nullptr); /// Constructor for task with parent task (MultiTransform mode) - TaskLinearPatternParameters(TaskMultiTransformParameters *parentTask, QLayout *layout); + TaskLinearPatternParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget); ~TaskLinearPatternParameters() override; void apply() override; @@ -64,14 +64,9 @@ private Q_SLOTS: void onOffset(const double o); void onOccurrences(const uint n); void onUpdateView(bool) override; - void onFeatureDeleted() override; protected: - void addObject(App::DocumentObject*) override; - void removeObject(App::DocumentObject*) override; - void changeEvent(QEvent *e) override; void onSelectionChanged(const Gui::SelectionChanges& msg) override; - void clearButtons() override; void getDirection(App::DocumentObject*& obj, std::vector& sub) const; bool getReverse() const; int getMode() const; @@ -80,8 +75,9 @@ protected: unsigned getOccurrences() const; private: + void setupParameterUI(QWidget* widget) override; + void retranslateParameterUI(QWidget* widget) override; void connectSignals(); - void setupUI(); void updateUI(); void adaptVisibilityToMode(); void kickUpdateViewTimer() const; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index 9e14d0d4d5..e34e14babb 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -24,7 +24,6 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include # include #endif @@ -53,82 +52,22 @@ TaskMirroredParameters::TaskMirroredParameters(ViewProviderTransformed *Transfor : TaskTransformedParameters(TransformedView, parent) , ui(new Ui_TaskMirroredParameters) { - // we need a separate container widget to add all controls to - proxy = new QWidget(this); - ui->setupUi(proxy); - QMetaObject::connectSlotsByName(this); - - this->groupLayout()->addWidget(proxy); - - ui->buttonOK->hide(); - ui->checkBoxUpdateView->setEnabled(true); - - selectionMode = none; - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } -TaskMirroredParameters::TaskMirroredParameters(TaskMultiTransformParameters *parentTask, QLayout *layout) +TaskMirroredParameters::TaskMirroredParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget) : TaskTransformedParameters(parentTask), ui(new Ui_TaskMirroredParameters) { - proxy = new QWidget(parentTask); - ui->setupUi(proxy); - connect(ui->buttonOK, &QToolButton::pressed, - parentTask, &TaskMirroredParameters::onSubTaskButtonOK); - QMetaObject::connectSlotsByName(this); - - layout->addWidget(proxy); - - ui->buttonOK->setEnabled(true); - ui->buttonAddFeature->hide(); - ui->buttonRemoveFeature->hide(); - ui->listWidgetFeatures->hide(); - ui->checkBoxUpdateView->hide(); - - selectionMode = none; - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! - setupUI(); + setupParameterUI(parameterWidget); } -void TaskMirroredParameters::setupUI() +void TaskMirroredParameters::setupParameterUI(QWidget *widget) { - connect(ui->buttonAddFeature, &QToolButton::toggled, this, &TaskMirroredParameters::onButtonAddFeature); - connect(ui->buttonRemoveFeature, &QToolButton::toggled, this, &TaskMirroredParameters::onButtonRemoveFeature); - - // Create context menu - QAction* action = new QAction(tr("Remove"), this); - action->setShortcut(QKeySequence::Delete); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - // display shortcut behind the context menu entry - action->setShortcutVisibleInContextMenu(true); -#endif - ui->listWidgetFeatures->addAction(action); - connect(action, &QAction::triggered, this, &TaskMirroredParameters::onFeatureDeleted); - ui->listWidgetFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(ui->listWidgetFeatures->model(), &QAbstractListModel::rowsMoved, - this, &TaskMirroredParameters::indexesMoved); + ui->setupUi(widget); + QMetaObject::connectSlotsByName(this); connect(ui->comboPlane, qOverload(&QComboBox::activated), this, &TaskMirroredParameters::onPlaneChanged); - connect(ui->checkBoxUpdateView, &QCheckBox::toggled, - this, &TaskMirroredParameters::onUpdateView); - - // Get the feature data - PartDesign::Mirrored* pcMirrored = static_cast(getObject()); - std::vector originals = pcMirrored->Originals.getValues(); - - // Fill data into dialog elements - for (auto obj : originals) { - if (obj) { - QListWidgetItem* item = new QListWidgetItem(); - item->setText(QString::fromUtf8(obj->Label.getValue())); - item->setData(Qt::UserRole, QString::fromLatin1(obj->getNameInDocument())); - ui->listWidgetFeatures->addItem(item); - } - } - // --------------------- this->planeLinks.setCombo(*(ui->comboPlane)); ui->comboPlane->setEnabled(true); @@ -157,6 +96,11 @@ void TaskMirroredParameters::setupUI() updateUI(); } +void TaskMirroredParameters::retranslateParameterUI(QWidget* widget) +{ + ui->retranslateUi(widget); +} + void TaskMirroredParameters::updateUI() { if (blockUpdate) @@ -174,23 +118,6 @@ void TaskMirroredParameters::updateUI() blockUpdate = false; } -void TaskMirroredParameters::addObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - QString objectName = QString::fromLatin1(obj->getNameInDocument()); - - QListWidgetItem* item = new QListWidgetItem(); - item->setText(label); - item->setData(Qt::UserRole, objectName); - ui->listWidgetFeatures->addItem(item); -} - -void TaskMirroredParameters::removeObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - removeItemFromListWidget(ui->listWidgetFeatures, label); -} - void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { if (selectionMode!=none && msg.Type == Gui::SelectionChanges::AddSelection) { @@ -216,12 +143,6 @@ void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg } } -void TaskMirroredParameters::clearButtons() -{ - ui->buttonAddFeature->setChecked(false); - ui->buttonRemoveFeature->setChecked(false); -} - void TaskMirroredParameters::onPlaneChanged(int /*num*/) { if (blockUpdate) @@ -264,22 +185,6 @@ void TaskMirroredParameters::onUpdateView(bool on) } } -void TaskMirroredParameters::onFeatureDeleted() -{ - PartDesign::Transformed* pcTransformed = getObject(); - std::vector originals = pcTransformed->Originals.getValues(); - int currentRow = ui->listWidgetFeatures->currentRow(); - if (currentRow < 0) { - Base::Console().Error("PartDesign MirroredPattern: No feature selected for removing.\n"); - return; //no current row selected - } - originals.erase(originals.begin() + currentRow); - setupTransaction(); - pcTransformed->Originals.setValues(originals); - ui->listWidgetFeatures->model()->removeRow(currentRow); - recomputeFeature(); -} - void TaskMirroredParameters::getMirrorPlane(App::DocumentObject*& obj, std::vector &sub) const { const App::PropertyLinkSub &lnk = planeLinks.getCurrentLink(); @@ -305,17 +210,6 @@ TaskMirroredParameters::~TaskMirroredParameters() } catch (const Base::Exception &ex) { Base::Console().Error ("%s\n", ex.what () ); } - - if (proxy) - delete proxy; -} - -void TaskMirroredParameters::changeEvent(QEvent *e) -{ - TaskBox::changeEvent(e); - if (e->type() == QEvent::LanguageChange) { - ui->retranslateUi(proxy); - } } //************************************************************************** diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h index c7d6d60264..51b920050e 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h @@ -49,7 +49,7 @@ public: /// Constructor for task with ViewProvider explicit TaskMirroredParameters(ViewProviderTransformed *TransformedView, QWidget *parent = nullptr); /// Constructor for task with parent task (MultiTransform mode) - TaskMirroredParameters(TaskMultiTransformParameters *parentTask, QLayout *layout); + TaskMirroredParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget); ~TaskMirroredParameters() override; @@ -60,17 +60,13 @@ public: private Q_SLOTS: void onPlaneChanged(int num); void onUpdateView(bool) override; - void onFeatureDeleted() override; protected: - void addObject(App::DocumentObject*) override; - void removeObject(App::DocumentObject*) override; - void changeEvent(QEvent *e) override; void onSelectionChanged(const Gui::SelectionChanges& msg) override; - void clearButtons() override; private: - void setupUI(); + void setupParameterUI(QWidget* widget) override; + void retranslateParameterUI(QWidget* widget) override; void updateUI(); ComboLinks planeLinks; diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index 4728070c15..c8f3c1622d 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -60,33 +60,16 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform , subTask(nullptr) , subFeature(nullptr) { - // we need a separate container widget to add all controls to - proxy = new QWidget(this); - ui->setupUi(proxy); + setupUI(); +} + +void TaskMultiTransformParameters::setupParameterUI(QWidget *widget) +{ + ui->setupUi(widget); QMetaObject::connectSlotsByName(this); - this->groupLayout()->addWidget(proxy); - - connect(ui->buttonAddFeature, &QToolButton::toggled, - this, &TaskMultiTransformParameters::onButtonAddFeature); - connect(ui->buttonRemoveFeature, &QToolButton::toggled, - this, &TaskMultiTransformParameters::onButtonRemoveFeature); - - // Create context menu - QAction* action = new QAction(tr("Remove"), this); - action->setShortcut(QKeySequence::Delete); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - // display shortcut behind the context menu entry - action->setShortcutVisibleInContextMenu(true); -#endif - ui->listWidgetFeatures->addAction(action); - connect(action, &QAction::triggered, - this, &TaskMultiTransformParameters::onFeatureDeleted); - ui->listWidgetFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(ui->listWidgetFeatures->model(), &QAbstractListModel::rowsMoved, - this, &TaskMultiTransformParameters::indexesMoved); // Create a context menu for the listview of transformation features - action = new QAction(tr("Edit"), ui->listTransformFeatures); + QAction* action = new QAction(tr("Edit"), ui->listTransformFeatures); action->connect(action, &QAction::triggered, this, &TaskMultiTransformParameters::onTransformEdit); ui->listTransformFeatures->addAction(action); @@ -119,12 +102,14 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform this, &TaskMultiTransformParameters::onMoveDown); ui->listTransformFeatures->addAction(action); ui->listTransformFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(ui->checkBoxUpdateView, &QCheckBox::toggled, - this, &TaskMultiTransformParameters::onUpdateView); connect(ui->listTransformFeatures, &QListWidget::activated, this, &TaskMultiTransformParameters::onTransformActivated); + connect(ui->buttonOK, &QToolButton::pressed, + this, &TaskMultiTransformParameters::onSubTaskButtonOK); + ui->buttonOK->hide(); + // Get the transformFeatures data PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); @@ -144,66 +129,11 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform ui->listTransformFeatures->addItem(tr("Right-click to add")); editHint = true; } - - // Get the Originals data - std::vector originals = pcMultiTransform->Originals.getValues(); - - // Fill data into dialog elements - for (auto obj : originals) { - if (obj) { - QListWidgetItem* item = new QListWidgetItem(); - item->setText(QString::fromUtf8(obj->Label.getValue())); - item->setData(Qt::UserRole, QString::fromLatin1(obj->getNameInDocument())); - ui->listWidgetFeatures->addItem(item); - } - } - // --------------------- } -void TaskMultiTransformParameters::addObject(App::DocumentObject* obj) +void TaskMultiTransformParameters::retranslateParameterUI(QWidget* widget) { - QString label = QString::fromUtf8(obj->Label.getValue()); - QString objectName = QString::fromLatin1(obj->getNameInDocument()); - - QListWidgetItem* item = new QListWidgetItem(); - item->setText(label); - item->setData(Qt::UserRole, objectName); - ui->listWidgetFeatures->addItem(item); -} - -void TaskMultiTransformParameters::removeObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - removeItemFromListWidget(ui->listWidgetFeatures, label); -} - -void TaskMultiTransformParameters::onSelectionChanged(const Gui::SelectionChanges& msg) -{ - if (originalSelected(msg)) { - exitSelectionMode(); - } -} - -void TaskMultiTransformParameters::clearButtons() -{ - ui->buttonAddFeature->setChecked(false); - ui->buttonRemoveFeature->setChecked(false); -} - -void TaskMultiTransformParameters::onFeatureDeleted() -{ - PartDesign::Transformed* pcTransformed = getObject(); - std::vector originals = pcTransformed->Originals.getValues(); - int currentRow = ui->listWidgetFeatures->currentRow(); - if (currentRow < 0){ - Base::Console().Error("PartDesign Multitransform: No feature selected for removing.\n"); - return; //no current row selected - } - originals.erase(originals.begin() + currentRow); - setupTransaction(); - pcTransformed->Originals.setValues(originals); - ui->listWidgetFeatures->model()->removeRow(currentRow); - recomputeFeature(); + ui->retranslateUi(widget); } void TaskMultiTransformParameters::slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) @@ -216,8 +146,16 @@ void TaskMultiTransformParameters::slotDeletedObject(const Gui::ViewProviderDocu void TaskMultiTransformParameters::closeSubTask() { if (subTask) { + ui->buttonOK->hide(); + + // Remove all parameter ui widgets and layout + ui->subFeatureWidget->setUpdatesEnabled(false); + qDeleteAll(ui->subFeatureWidget->findChildren(QString(), Qt::FindDirectChildrenOnly)); + qDeleteAll(ui->subFeatureWidget->findChildren(QString(), Qt::FindDirectChildrenOnly)); + ui->subFeatureWidget->setUpdatesEnabled(true); + + exitSelectionMode(); - disconnect(ui->checkBoxUpdateView, nullptr, subTask, nullptr); delete subTask; subTask = nullptr; } @@ -260,20 +198,20 @@ void TaskMultiTransformParameters::onTransformEdit() std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); subFeature = static_cast(transformFeatures[row]); - if (transformFeatures[row]->is()) - subTask = new TaskMirroredParameters(this, ui->verticalLayout); - else if (transformFeatures[row]->is()) - subTask = new TaskLinearPatternParameters(this, ui->verticalLayout); - else if (transformFeatures[row]->is()) - subTask = new TaskPolarPatternParameters(this, ui->verticalLayout); - else if (transformFeatures[row]->is()) - subTask = new TaskScaledParameters(this, ui->verticalLayout); + if (subFeature->is()) + subTask = new TaskMirroredParameters(this, ui->subFeatureWidget); + else if (subFeature->is()) + subTask = new TaskLinearPatternParameters(this, ui->subFeatureWidget); + else if (subFeature->is()) + subTask = new TaskPolarPatternParameters(this, ui->subFeatureWidget); + else if (subFeature->is()) + subTask = new TaskScaledParameters(this, ui->subFeatureWidget); else return; // TODO: Show an error? + ui->buttonOK->show(); + subTask->setEnabledTransaction(isEnabledTransaction()); - connect(ui->checkBoxUpdateView, &QCheckBox::toggled, - subTask, &TaskTransformedParameters::onUpdateView); } void TaskMultiTransformParameters::onTransformActivated(const QModelIndex& index) @@ -533,16 +471,6 @@ TaskMultiTransformParameters::~TaskMultiTransformParameters() Base::PyException e; // extract the Python error text e.ReportException(); } - if (proxy) - delete proxy; -} - -void TaskMultiTransformParameters::changeEvent(QEvent *e) -{ - TaskBox::changeEvent(e); - if (e->type() == QEvent::LanguageChange) { - ui->retranslateUi(proxy); - } } //************************************************************************** diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h index a6491dc059..d61a0bb949 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h @@ -80,18 +80,12 @@ private Q_SLOTS: // Note: There is no Cancel button because I couldn't work out how to save the state of // a subFeature so as to revert the changes of an edit operation void onUpdateView(bool) override; - void onFeatureDeleted() override; /** Notifies when the object is about to be removed. */ void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) override; -protected: - void addObject(App::DocumentObject*) override; - void removeObject(App::DocumentObject*) override; - void changeEvent(QEvent *e) override; - void onSelectionChanged(const Gui::SelectionChanges& msg) override; - void clearButtons() override; - private: + void setupParameterUI(QWidget* widget) override; + void retranslateParameterUI(QWidget* widget) override; void updateUI(); void closeSubTask(); void moveTransformFeature(const int increment); diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index 92bdb55912..0a46247c13 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -25,7 +25,6 @@ #ifndef _PreComp_ # include -# include # include #endif @@ -64,103 +63,22 @@ TaskPolarPatternParameters::TaskPolarPatternParameters(ViewProviderTransformed * : TaskTransformedParameters(TransformedView, parent) , ui(new Ui_TaskPolarPatternParameters) { - // we need a separate container widget to add all controls to - proxy = new QWidget(this); - ui->setupUi(proxy); - QMetaObject::connectSlotsByName(this); - - this->groupLayout()->addWidget(proxy); - - ui->buttonOK->hide(); - ui->checkBoxUpdateView->setEnabled(true); - - selectionMode = none; - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } -TaskPolarPatternParameters::TaskPolarPatternParameters(TaskMultiTransformParameters *parentTask, QLayout *layout) +TaskPolarPatternParameters::TaskPolarPatternParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget) : TaskTransformedParameters(parentTask), ui(new Ui_TaskPolarPatternParameters) { - proxy = new QWidget(parentTask); - ui->setupUi(proxy); - connect(ui->buttonOK, &QToolButton::pressed, - parentTask, &TaskMultiTransformParameters::onSubTaskButtonOK); + setupParameterUI(parameterWidget); +} + +void TaskPolarPatternParameters::setupParameterUI(QWidget *widget) +{ + ui->setupUi(widget); QMetaObject::connectSlotsByName(this); - layout->addWidget(proxy); - - ui->buttonOK->setEnabled(true); - ui->buttonAddFeature->hide(); - ui->buttonRemoveFeature->hide(); - ui->listWidgetFeatures->hide(); - ui->checkBoxUpdateView->hide(); - - selectionMode = none; - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! - setupUI(); -} - -void TaskPolarPatternParameters::connectSignals() -{ - connect(ui->buttonAddFeature, &QToolButton::toggled, - this, &TaskPolarPatternParameters::onButtonAddFeature); - connect(ui->buttonRemoveFeature, &QToolButton::toggled, - this, &TaskPolarPatternParameters::onButtonRemoveFeature); - - // Create context menu - QAction* action = new QAction(tr("Remove"), this); - action->setShortcut(QKeySequence::Delete); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - // display shortcut behind the context menu entry - action->setShortcutVisibleInContextMenu(true); -#endif - ui->listWidgetFeatures->addAction(action); - connect(action, &QAction::triggered, - this, &TaskPolarPatternParameters::onFeatureDeleted); - ui->listWidgetFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(ui->listWidgetFeatures->model(), &QAbstractListModel::rowsMoved, - this, &TaskPolarPatternParameters::indexesMoved); - - updateViewTimer = new QTimer(this); - updateViewTimer->setSingleShot(true); - updateViewTimer->setInterval(getUpdateViewTimeout()); - connect(updateViewTimer, &QTimer::timeout, - this, &TaskPolarPatternParameters::onUpdateViewTimer); - connect(ui->comboAxis, qOverload(&QComboBox::activated), - this, &TaskPolarPatternParameters::onAxisChanged); - connect(ui->comboMode, qOverload(&QComboBox::activated), - this, &TaskPolarPatternParameters::onModeChanged); - connect(ui->checkReverse, &QCheckBox::toggled, - this, &TaskPolarPatternParameters::onCheckReverse); - connect(ui->polarAngle, qOverload(&Gui::QuantitySpinBox::valueChanged), - this, &TaskPolarPatternParameters::onAngle); - connect(ui->angleOffset, qOverload(&Gui::QuantitySpinBox::valueChanged), - this, &TaskPolarPatternParameters::onOffset); - connect(ui->spinOccurrences, &Gui::UIntSpinBox::unsignedChanged, - this, &TaskPolarPatternParameters::onOccurrences); - connect(ui->checkBoxUpdateView, &QCheckBox::toggled, - this, &TaskPolarPatternParameters::onUpdateView); -} - -void TaskPolarPatternParameters::setupUI() -{ // Get the feature data PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); - std::vector originals = pcPolarPattern->Originals.getValues(); - - // Fill data into dialog elements - for (auto obj : originals) { - if (obj) { - QListWidgetItem* item = new QListWidgetItem(); - item->setText(QString::fromUtf8(obj->Label.getValue())); - item->setData(Qt::UserRole, QString::fromLatin1(obj->getNameInDocument())); - ui->listWidgetFeatures->addItem(item); - } - } - // --------------------- ui->polarAngle->bind(pcPolarPattern->Angle); ui->angleOffset->bind(pcPolarPattern->Offset); @@ -200,7 +118,29 @@ void TaskPolarPatternParameters::setupUI() adaptVisibilityToMode(); updateUI(); - connectSignals(); + + updateViewTimer = new QTimer(this); + updateViewTimer->setSingleShot(true); + updateViewTimer->setInterval(getUpdateViewTimeout()); + connect(updateViewTimer, &QTimer::timeout, + this, &TaskPolarPatternParameters::onUpdateViewTimer); + connect(ui->comboAxis, qOverload(&QComboBox::activated), + this, &TaskPolarPatternParameters::onAxisChanged); + connect(ui->comboMode, qOverload(&QComboBox::activated), + this, &TaskPolarPatternParameters::onModeChanged); + connect(ui->checkReverse, &QCheckBox::toggled, + this, &TaskPolarPatternParameters::onCheckReverse); + connect(ui->polarAngle, qOverload(&Gui::QuantitySpinBox::valueChanged), + this, &TaskPolarPatternParameters::onAngle); + connect(ui->angleOffset, qOverload(&Gui::QuantitySpinBox::valueChanged), + this, &TaskPolarPatternParameters::onOffset); + connect(ui->spinOccurrences, &Gui::UIntSpinBox::unsignedChanged, + this, &TaskPolarPatternParameters::onOccurrences); +} + +void TaskPolarPatternParameters::retranslateParameterUI(QWidget* widget) +{ + ui->retranslateUi(widget); } void TaskPolarPatternParameters::updateUI() @@ -254,23 +194,6 @@ void TaskPolarPatternParameters::adaptVisibilityToMode() ui->angleOffsetWrapper->setVisible(mode == PartDesign::PolarPatternMode::offset); } -void TaskPolarPatternParameters::addObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - QString objectName = QString::fromLatin1(obj->getNameInDocument()); - - QListWidgetItem* item = new QListWidgetItem(); - item->setText(label); - item->setData(Qt::UserRole, objectName); - ui->listWidgetFeatures->addItem(item); -} - -void TaskPolarPatternParameters::removeObject(App::DocumentObject* obj) -{ - QString label = QString::fromUtf8(obj->Label.getValue()); - removeItemFromListWidget(ui->listWidgetFeatures, label); -} - void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { if (selectionMode!=none && msg.Type == Gui::SelectionChanges::AddSelection) { @@ -297,12 +220,6 @@ void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges& } } -void TaskPolarPatternParameters::clearButtons() -{ - ui->buttonAddFeature->setChecked(false); - ui->buttonRemoveFeature->setChecked(false); -} - void TaskPolarPatternParameters::onCheckReverse(const bool on) { if (blockUpdate) return; @@ -400,22 +317,6 @@ void TaskPolarPatternParameters::onUpdateView(bool on) } } -void TaskPolarPatternParameters::onFeatureDeleted() -{ - PartDesign::Transformed* pcTransformed = getObject(); - std::vector originals = pcTransformed->Originals.getValues(); - int currentRow = ui->listWidgetFeatures->currentRow(); - if (currentRow < 0) { - Base::Console().Error("PartDesign PolarPattern: No feature selected for removing.\n"); - return; //no current row selected - } - originals.erase(originals.begin() + currentRow); - setupTransaction(); - pcTransformed->Originals.setValues(originals); - ui->listWidgetFeatures->model()->removeRow(currentRow); - recomputeFeature(); -} - void TaskPolarPatternParameters::getAxis(App::DocumentObject*& obj, std::vector& sub) const { const App::PropertyLinkSub &lnk = axesLinks.getCurrentLink(); @@ -453,17 +354,6 @@ TaskPolarPatternParameters::~TaskPolarPatternParameters() } catch (const Base::Exception &ex) { Base::Console().Error ("%s\n", ex.what () ); } - - if (proxy) - delete proxy; -} - -void TaskPolarPatternParameters::changeEvent(QEvent *e) -{ - TaskBox::changeEvent(e); - if (e->type() == QEvent::LanguageChange) { - ui->retranslateUi(proxy); - } } void TaskPolarPatternParameters::apply() diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h index b01121c23c..520eb614fd 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h @@ -50,7 +50,7 @@ public: /// Constructor for task with ViewProvider explicit TaskPolarPatternParameters(ViewProviderTransformed *TransformedView, QWidget *parent = nullptr); /// Constructor for task with parent task (MultiTransform mode) - TaskPolarPatternParameters(TaskMultiTransformParameters *parentTask, QLayout *layout); + TaskPolarPatternParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget); ~TaskPolarPatternParameters() override; void apply() override; @@ -64,14 +64,9 @@ private Q_SLOTS: void onOffset(const double a); void onOccurrences(const uint n); void onUpdateView(bool) override; - void onFeatureDeleted() override; protected: - void addObject(App::DocumentObject*) override; - void removeObject(App::DocumentObject*) override; - void changeEvent(QEvent *e) override; void onSelectionChanged(const Gui::SelectionChanges& msg) override; - void clearButtons() override; void getAxis(App::DocumentObject*& obj, std::vector& sub) const; const std::string getStdAxis() const; const std::string getAxis() const; @@ -80,8 +75,9 @@ protected: unsigned getOccurrences() const; private: + void setupParameterUI(QWidget* widget) override; + void retranslateParameterUI(QWidget* widget) override; void connectSignals(); - void setupUI(); void updateUI(); void kickUpdateViewTimer() const; void adaptVisibilityToMode(); diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp b/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp index 8a63c37e61..b791c98b70 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp @@ -24,7 +24,6 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include #endif #include @@ -48,78 +47,27 @@ TaskScaledParameters::TaskScaledParameters(ViewProviderTransformed *TransformedV : TaskTransformedParameters(TransformedView, parent) , ui(new Ui_TaskScaledParameters) { - // we need a separate container widget to add all controls to - proxy = new QWidget(this); - ui->setupUi(proxy); - QMetaObject::connectSlotsByName(this); - - this->groupLayout()->addWidget(proxy); - - ui->buttonOK->hide(); - ui->checkBoxUpdateView->setEnabled(true); - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } -TaskScaledParameters::TaskScaledParameters(TaskMultiTransformParameters *parentTask, QLayout *layout) +TaskScaledParameters::TaskScaledParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget) : TaskTransformedParameters(parentTask), ui(new Ui_TaskScaledParameters) { - proxy = new QWidget(parentTask); - ui->setupUi(proxy); - connect(ui->buttonOK, &QPushButton::pressed, - parentTask, &TaskScaledParameters::onSubTaskButtonOK); - QMetaObject::connectSlotsByName(this); - - layout->addWidget(proxy); - - ui->buttonOK->setEnabled(true); - ui->buttonAddFeature->hide(); - ui->buttonRemoveFeature->hide(); - ui->listWidgetFeatures->hide(); - ui->checkBoxUpdateView->hide(); - - blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! - setupUI(); + setupParameterUI(parameterWidget); } -void TaskScaledParameters::setupUI() +void TaskScaledParameters::setupParameterUI(QWidget *widget) { - connect(ui->buttonAddFeature, &QPushButton::toggled, this, &TaskScaledParameters::onButtonAddFeature); - connect(ui->buttonRemoveFeature, &QPushButton::toggled, this, &TaskScaledParameters::onButtonRemoveFeature); - - // Create context menu - QAction* action = new QAction(tr("Remove"), this); - action->setShortcut(QKeySequence::Delete); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - // display shortcut behind the context menu entry - action->setShortcutVisibleInContextMenu(true); -#endif - ui->listWidgetFeatures->addAction(action); - connect(action, &QAction::triggered, this, &TaskScaledParameters::onFeatureDeleted); - ui->listWidgetFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); + ui->setupUi(widget); + QMetaObject::connectSlotsByName(this); connect(ui->spinFactor, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &TaskScaledParameters::onFactor); connect(ui->spinOccurrences, &Gui::UIntSpinBox::unsignedChanged, this, &TaskScaledParameters::onOccurrences); - connect(ui->checkBoxUpdateView, &QCheckBox::toggled, - this, &TaskScaledParameters::onUpdateView); // Get the feature data PartDesign::Scaled* pcScaled = static_cast(getObject()); - std::vector originals = pcScaled->Originals.getValues(); - - // Fill data into dialog elements - for (auto obj : originals) { - if (obj) { - QListWidgetItem* item = new QListWidgetItem(); - item->setText(QString::fromUtf8(obj->Label.getValue())); - item->setData(Qt::UserRole, QString::fromLatin1(obj->getNameInDocument())); - ui->listWidgetFeatures->addItem(item); - } - } - // --------------------- ui->spinFactor->bind(pcScaled->Factor); ui->spinOccurrences->setMaximum(INT_MAX); @@ -131,6 +79,11 @@ void TaskScaledParameters::setupUI() updateUI(); } +void TaskScaledParameters::retranslateParameterUI(QWidget* widget) +{ + ui->retranslateUi(widget); +} + void TaskScaledParameters::updateUI() { if (blockUpdate) @@ -148,35 +101,6 @@ void TaskScaledParameters::updateUI() blockUpdate = false; } -void TaskScaledParameters::onSelectionChanged(const Gui::SelectionChanges& msg) -{ - if (originalSelected(msg)) { - Gui::SelectionObject selObj(msg); - App::DocumentObject* obj = selObj.getObject(); - Q_ASSERT(obj); - - QString label = QString::fromUtf8(obj->Label.getValue()); - QString objectName = QString::fromLatin1(msg.pObjectName); - - if (selectionMode == addFeature) { - QListWidgetItem* item = new QListWidgetItem(); - item->setText(label); - item->setData(Qt::UserRole, objectName); - ui->listWidgetFeatures->addItem(item); - } - else { - removeItemFromListWidget(ui->listWidgetFeatures, label); - } - exitSelectionMode(); - } -} - -void TaskScaledParameters::clearButtons() -{ - ui->buttonAddFeature->setChecked(false); - ui->buttonRemoveFeature->setChecked(false); -} - void TaskScaledParameters::onFactor(const double f) { if (blockUpdate) @@ -207,21 +131,6 @@ void TaskScaledParameters::onUpdateView(bool on) } } -void TaskScaledParameters::onFeatureDeleted() -{ - PartDesign::Transformed* pcTransformed = getObject(); - std::vector originals = pcTransformed->Originals.getValues(); - int currentRow = ui->listWidgetFeatures->currentRow(); - if (currentRow < 0) { - Base::Console().Error("PartDesign ScaledPattern: No feature selected for removing.\n"); - return; //no current row selected - } - originals.erase(originals.begin() + currentRow); - pcTransformed->Originals.setValues(originals); - ui->listWidgetFeatures->model()->removeRow(currentRow); - recomputeFeature(); -} - double TaskScaledParameters::getFactor() const { return ui->spinFactor->value().getValue(); @@ -234,16 +143,6 @@ unsigned TaskScaledParameters::getOccurrences() const TaskScaledParameters::~TaskScaledParameters() { - if (proxy) - delete proxy; -} - -void TaskScaledParameters::changeEvent(QEvent *e) -{ - TaskBox::changeEvent(e); - if (e->type() == QEvent::LanguageChange) { - ui->retranslateUi(proxy); - } } void TaskScaledParameters::apply() diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.h b/src/Mod/PartDesign/Gui/TaskScaledParameters.h index 3675482930..e663ff8cfa 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.h +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.h @@ -49,7 +49,7 @@ public: /// Constructor for task with ViewProvider explicit TaskScaledParameters(ViewProviderTransformed *TransformedView, QWidget *parent = nullptr); /// Constructor for task with parent task (MultiTransform mode) - TaskScaledParameters(TaskMultiTransformParameters *parentTask, QLayout *layout); + TaskScaledParameters(TaskMultiTransformParameters *parentTask, QWidget* parameterWidget); ~TaskScaledParameters() override; void apply() override; @@ -58,17 +58,14 @@ private Q_SLOTS: void onFactor(const double f); void onOccurrences(const uint n); void onUpdateView(bool) override; - void onFeatureDeleted() override; protected: - void changeEvent(QEvent *e) override; - void onSelectionChanged(const Gui::SelectionChanges& msg) override; - void clearButtons() override; double getFactor() const; unsigned getOccurrences() const; private: - void setupUI(); + void setupParameterUI(QWidget* widget) override; + void retranslateParameterUI(QWidget* widget) override; void updateUI(); private: diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 23d6f238fc..dbdc46a6a8 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -23,6 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +# include # include #endif @@ -40,6 +41,7 @@ #include #include +#include "ui_TaskTransformedParameters.h" #include "TaskTransformedParameters.h" #include "TaskMultiTransformParameters.h" #include "ReferenceSelection.h" @@ -60,6 +62,7 @@ TaskTransformedParameters::TaskTransformedParameters(ViewProviderTransformed *Tr , parentTask(nullptr) , insideMultiTransform(false) , blockUpdate(false) + , ui(new Ui_TaskTransformedParameters) { Gui::Document* doc = TransformedView->getDocument(); this->attachDocument(doc); @@ -82,6 +85,53 @@ TaskTransformedParameters::~TaskTransformedParameters() { // make sure to remove selection gate in all cases Gui::Selection().rmvSelectionGate(); + + if (proxy) + delete proxy; +} + +void TaskTransformedParameters::setupUI() +{ + // we need a separate container widget to add all controls to + proxy = new QWidget(this); + ui->setupUi(proxy); + QMetaObject::connectSlotsByName(this); + + connect(ui->buttonAddFeature, &QToolButton::toggled, this, &TaskTransformedParameters::onButtonAddFeature); + connect(ui->buttonRemoveFeature, &QToolButton::toggled, this, &TaskTransformedParameters::onButtonRemoveFeature); + + // Create context menu + QAction* action = new QAction(tr("Remove"), this); + action->setShortcut(QKeySequence::Delete); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + // display shortcut behind the context menu entry + action->setShortcutVisibleInContextMenu(true); +#endif + ui->listWidgetFeatures->addAction(action); + connect(action, &QAction::triggered, this, &TaskTransformedParameters::onFeatureDeleted); + ui->listWidgetFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); + connect(ui->listWidgetFeatures->model(), &QAbstractListModel::rowsMoved, + this, &TaskTransformedParameters::indexesMoved); + + connect(ui->checkBoxUpdateView, &QCheckBox::toggled, + this, &TaskTransformedParameters::onUpdateView); + + // Get the feature data + PartDesign::Transformed* pcTransformed = static_cast(getObject()); + std::vector originals = pcTransformed->Originals.getValues(); + + // Fill data into dialog elements + for (auto obj : originals) { + if (obj) { + QListWidgetItem* item = new QListWidgetItem(); + item->setText(QString::fromUtf8(obj->Label.getValue())); + item->setData(Qt::UserRole, QString::fromLatin1(obj->getNameInDocument())); + ui->listWidgetFeatures->addItem(item); + } + } + + setupParameterUI(ui->featureUI); // create parameter UI widgets + this->groupLayout()->addWidget(proxy); } void TaskTransformedParameters::slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) @@ -90,6 +140,32 @@ void TaskTransformedParameters::slotDeletedObject(const Gui::ViewProviderDocumen TransformedView = nullptr; } +void TaskTransformedParameters::changeEvent(QEvent *e) +{ + TaskBox::changeEvent(e); + if (e->type() == QEvent::LanguageChange && proxy) { + ui->retranslateUi(proxy); + retranslateParameterUI(ui->featureUI); + } +} + +void TaskTransformedParameters::onSelectionChanged(const Gui::SelectionChanges& msg) +{ + if (originalSelected(msg)) { + exitSelectionMode(); + } +} + +void TaskTransformedParameters::clearButtons() +{ + if (insideMultiTransform) { + parentTask->clearButtons(); + } else { + ui->buttonAddFeature->setChecked(false); + ui->buttonRemoveFeature->setChecked(false); + } +} + bool TaskTransformedParameters::isViewUpdated() const { return (blockUpdate == false); @@ -100,12 +176,21 @@ int TaskTransformedParameters::getUpdateViewTimeout() const return 500; } -void TaskTransformedParameters::addObject(App::DocumentObject*) +void TaskTransformedParameters::addObject(App::DocumentObject* obj) { + QString label = QString::fromUtf8(obj->Label.getValue()); + QString objectName = QString::fromLatin1(obj->getNameInDocument()); + + QListWidgetItem* item = new QListWidgetItem(); + item->setText(label); + item->setData(Qt::UserRole, objectName); + ui->listWidgetFeatures->addItem(item); } -void TaskTransformedParameters::removeObject(App::DocumentObject*) +void TaskTransformedParameters::removeObject(App::DocumentObject* obj) { + QString label = QString::fromUtf8(obj->Label.getValue()); + removeItemFromListWidget(ui->listWidgetFeatures, label); } bool TaskTransformedParameters::originalSelected(const Gui::SelectionChanges& msg) @@ -191,6 +276,8 @@ void TaskTransformedParameters::onButtonAddFeature(bool checked) } else { exitSelectionMode(); } + + ui->buttonRemoveFeature->setDisabled(checked); } // Make sure only some feature before the given one is visible @@ -221,6 +308,24 @@ void TaskTransformedParameters::onButtonRemoveFeature(bool checked) } else { exitSelectionMode(); } + + ui->buttonAddFeature->setDisabled(checked); +} + +void TaskTransformedParameters::onFeatureDeleted() +{ + PartDesign::Transformed* pcTransformed = getObject(); + std::vector originals = pcTransformed->Originals.getValues(); + int currentRow = ui->listWidgetFeatures->currentRow(); + if (currentRow < 0) { + Base::Console().Error("PartDesign Pattern: No feature selected for removing.\n"); + return; //no current row selected + } + originals.erase(originals.begin() + currentRow); + setupTransaction(); + pcTransformed->Originals.setValues(originals); + ui->listWidgetFeatures->model()->removeRow(currentRow); + recomputeFeature(); } void TaskTransformedParameters::removeItemFromListWidget(QListWidget* widget, const QString& itemstr) diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index cc09a7b832..0e76ab97bd 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -38,6 +38,8 @@ class QListWidget; +class Ui_TaskTransformedParameters; + namespace Part { class Feature; } @@ -177,10 +179,12 @@ protected Q_SLOTS: virtual void onSubTaskButtonOK() {} void onButtonAddFeature(const bool checked); void onButtonRemoveFeature(const bool checked); - virtual void onFeatureDeleted() = 0; + void onFeatureDeleted(); void indexesMoved(); protected: + void setupUI(); + /** * Returns the base transformation * For stand alone features it will be objects associated with the view provider @@ -205,14 +209,18 @@ protected: void checkVisibility(); +private: + virtual void setupParameterUI(QWidget* widget) = 0; + virtual void retranslateParameterUI(QWidget* widget) = 0; + protected: virtual void addObject(App::DocumentObject*); virtual void removeObject(App::DocumentObject*); /** Notifies when the object is about to be removed. */ void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) override; - void changeEvent(QEvent *e) override = 0; - void onSelectionChanged(const Gui::SelectionChanges& msg) override = 0; - virtual void clearButtons()=0; + void changeEvent(QEvent *e) override; + void onSelectionChanged(const Gui::SelectionChanges& msg) override; + void clearButtons(); static void removeItemFromListWidget(QListWidget* widget, const QString& itemstr); void fillAxisCombo(ComboLinks &combolinks, Part::Part2DObject *sketch); @@ -233,6 +241,9 @@ protected: bool insideMultiTransform; /// Lock updateUI(), applying changes to the underlying feature and calling recomputeFeature() bool blockUpdate; + +private: + std::unique_ptr ui; }; /// simulation dialog for the TaskView