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.
This commit is contained in:
André Althaus
2024-02-17 11:16:34 +01:00
parent 5139182dbe
commit 24c138373c
12 changed files with 249 additions and 653 deletions

View File

@@ -24,7 +24,6 @@
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QAction>
# include <QMessageBox>
# include <QTimer>
#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<int>(&QComboBox::activated),
this, &TaskLinearPatternParameters::onDirectionChanged);
connect(ui->checkReverse, &QCheckBox::toggled,
this, &TaskLinearPatternParameters::onCheckReverse);
connect(ui->comboMode, qOverload<int>(&QComboBox::activated),
this, &TaskLinearPatternParameters::onModeChanged);
connect(ui->spinLength, qOverload<double>(&Gui::QuantitySpinBox::valueChanged),
this, &TaskLinearPatternParameters::onLength);
connect(ui->spinOffset, qOverload<double>(&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<PartDesign::LinearPattern*>(getObject());
std::vector<App::DocumentObject*> 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<int>(&QComboBox::activated),
this, &TaskLinearPatternParameters::onDirectionChanged);
connect(ui->checkReverse, &QCheckBox::toggled,
this, &TaskLinearPatternParameters::onCheckReverse);
connect(ui->comboMode, qOverload<int>(&QComboBox::activated),
this, &TaskLinearPatternParameters::onModeChanged);
connect(ui->spinLength, qOverload<double>(&Gui::QuantitySpinBox::valueChanged),
this, &TaskLinearPatternParameters::onLength);
connect(ui->spinOffset, qOverload<double>(&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<App::DocumentObject*> 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<std::string>& 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()

View File

@@ -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<std::string>& 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;

View File

@@ -24,7 +24,6 @@
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QAction>
# include <QMessageBox>
#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<int>(&QComboBox::activated),
this, &TaskMirroredParameters::onPlaneChanged);
connect(ui->checkBoxUpdateView, &QCheckBox::toggled,
this, &TaskMirroredParameters::onUpdateView);
// Get the feature data
PartDesign::Mirrored* pcMirrored = static_cast<PartDesign::Mirrored*>(getObject());
std::vector<App::DocumentObject*> 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<App::DocumentObject*> 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<std::string> &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);
}
}
//**************************************************************************

View File

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

View File

@@ -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<PartDesign::MultiTransform*>(TransformedView->getObject());
std::vector<App::DocumentObject*> 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<App::DocumentObject*> 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<App::DocumentObject*> 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<QWidget*>(QString(), Qt::FindDirectChildrenOnly));
qDeleteAll(ui->subFeatureWidget->findChildren<QLayout*>(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<App::DocumentObject*> transformFeatures = pcMultiTransform->Transformations.getValues();
subFeature = static_cast<PartDesign::Transformed*>(transformFeatures[row]);
if (transformFeatures[row]->is<PartDesign::Mirrored>())
subTask = new TaskMirroredParameters(this, ui->verticalLayout);
else if (transformFeatures[row]->is<PartDesign::LinearPattern>())
subTask = new TaskLinearPatternParameters(this, ui->verticalLayout);
else if (transformFeatures[row]->is<PartDesign::PolarPattern>())
subTask = new TaskPolarPatternParameters(this, ui->verticalLayout);
else if (transformFeatures[row]->is<PartDesign::Scaled>())
subTask = new TaskScaledParameters(this, ui->verticalLayout);
if (subFeature->is<PartDesign::Mirrored>())
subTask = new TaskMirroredParameters(this, ui->subFeatureWidget);
else if (subFeature->is<PartDesign::LinearPattern>())
subTask = new TaskLinearPatternParameters(this, ui->subFeatureWidget);
else if (subFeature->is<PartDesign::PolarPattern>())
subTask = new TaskPolarPatternParameters(this, ui->subFeatureWidget);
else if (subFeature->is<PartDesign::Scaled>())
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);
}
}
//**************************************************************************

View File

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

View File

@@ -25,7 +25,6 @@
#ifndef _PreComp_
# include <QMessageBox>
# include <QAction>
# include <QTimer>
#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<int>(&QComboBox::activated),
this, &TaskPolarPatternParameters::onAxisChanged);
connect(ui->comboMode, qOverload<int>(&QComboBox::activated),
this, &TaskPolarPatternParameters::onModeChanged);
connect(ui->checkReverse, &QCheckBox::toggled,
this, &TaskPolarPatternParameters::onCheckReverse);
connect(ui->polarAngle, qOverload<double>(&Gui::QuantitySpinBox::valueChanged),
this, &TaskPolarPatternParameters::onAngle);
connect(ui->angleOffset, qOverload<double>(&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<PartDesign::PolarPattern*>(getObject());
std::vector<App::DocumentObject*> 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<int>(&QComboBox::activated),
this, &TaskPolarPatternParameters::onAxisChanged);
connect(ui->comboMode, qOverload<int>(&QComboBox::activated),
this, &TaskPolarPatternParameters::onModeChanged);
connect(ui->checkReverse, &QCheckBox::toggled,
this, &TaskPolarPatternParameters::onCheckReverse);
connect(ui->polarAngle, qOverload<double>(&Gui::QuantitySpinBox::valueChanged),
this, &TaskPolarPatternParameters::onAngle);
connect(ui->angleOffset, qOverload<double>(&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<App::DocumentObject*> 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<std::string>& 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()

View File

@@ -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<std::string>& 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();

View File

@@ -24,7 +24,6 @@
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QAction>
#endif
#include <App/DocumentObject.h>
@@ -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<double>(&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<PartDesign::Scaled*>(getObject());
std::vector<App::DocumentObject*> 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<App::DocumentObject*> 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()

View File

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

View File

@@ -23,6 +23,7 @@
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QAction>
# include <QListWidget>
#endif
@@ -40,6 +41,7 @@
#include <Mod/PartDesign/App/FeatureAddSub.h>
#include <Mod/PartDesign/App/FeatureTransformed.h>
#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<PartDesign::Transformed*>(getObject());
std::vector<App::DocumentObject*> 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<App::DocumentObject*> 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)

View File

@@ -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_TaskTransformedParameters> ui;
};
/// simulation dialog for the TaskView