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