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:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user