From a930d4ebac8d8036db03de4d74606b32f344eff5 Mon Sep 17 00:00:00 2001 From: mwganson Date: Fri, 17 Dec 2021 21:40:28 -0600 Subject: [PATCH] [PartDesign] for chamfer and fillet, add SelectAllEdges option in the context menu while in add or remove mode --- .../PartDesign/Gui/TaskChamferParameters.cpp | 9 +++ .../PartDesign/Gui/TaskChamferParameters.h | 1 + .../PartDesign/Gui/TaskDressUpParameters.cpp | 61 ++++++++++++++++++- .../PartDesign/Gui/TaskDressUpParameters.h | 4 +- .../PartDesign/Gui/TaskFilletParameters.cpp | 9 +++ src/Mod/PartDesign/Gui/TaskFilletParameters.h | 1 + 6 files changed, 83 insertions(+), 2 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp index 267fc9953f..996501b7a9 100644 --- a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp @@ -96,6 +96,9 @@ TaskChamferParameters::TaskChamferParameters(ViewProviderDressUp *DressUpView, Q createDeleteAction(ui->listWidgetReferences, ui->buttonRefRemove); connect(deleteAction, SIGNAL(triggered()), this, SLOT(onRefDeleted())); + createAddAllEdgesAction(ui->listWidgetReferences); + connect(addAllEdgesAction, &QAction::triggered, this, &TaskChamferParameters::onAddAllEdges); + connect(ui->listWidgetReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(setSelection(QListWidgetItem*))); connect(ui->listWidgetReferences, SIGNAL(itemClicked(QListWidgetItem*)), @@ -246,6 +249,12 @@ void TaskChamferParameters::onRefDeleted(void) } } +void TaskChamferParameters::onAddAllEdges(void) +{ + TaskDressUpParameters::addAllEdges(ui->listWidgetReferences); + ui->buttonRefRemove->setEnabled(true); +} + void TaskChamferParameters::onTypeChanged(int index) { PartDesign::Chamfer* pcChamfer = static_cast(DressUpView->getObject()); diff --git a/src/Mod/PartDesign/Gui/TaskChamferParameters.h b/src/Mod/PartDesign/Gui/TaskChamferParameters.h index 436c879c0c..965da94e76 100644 --- a/src/Mod/PartDesign/Gui/TaskChamferParameters.h +++ b/src/Mod/PartDesign/Gui/TaskChamferParameters.h @@ -51,6 +51,7 @@ private Q_SLOTS: void onAngleChanged(double); void onFlipDirection(bool); void onRefDeleted(void); + void onAddAllEdges(void); protected: virtual void clearButtons(const selectionModes notThis); diff --git a/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp b/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp index 880393589f..3bbd58e3c3 100644 --- a/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp @@ -65,6 +65,7 @@ TaskDressUpParameters::TaskDressUpParameters(ViewProviderDressUp *DressUpView, b , proxy(0) , DressUpView(DressUpView) , deleteAction(nullptr) + , addAllEdgesAction(nullptr) , allowFaces(selectFaces) , allowEdges(selectEdges) { @@ -139,12 +140,43 @@ bool TaskDressUpParameters::referenceSelected(const Gui::SelectionChanges& msg) return false; } +void TaskDressUpParameters::addAllEdges(QListWidget* widget) +{ + PartDesign::DressUp* pcDressUp = static_cast(DressUpView->getObject()); + if (pcDressUp) { + App::DocumentObject* base = pcDressUp->Base.getValue(); + if (base) { + Gui::WaitCursor wait; + int count = pcDressUp->getBaseTopoShape().countSubElements("Edge"); + std::vector edgeNames; + for (int ii = 0; ii < count; ii++){ + std::ostringstream edgeName; + edgeName << "Edge" << ii+1; + edgeNames.push_back(edgeName.str()); + } + + for (std::vector::const_iterator it = edgeNames.begin(); it != edgeNames.end(); ++it){ + if (widget->findItems(QLatin1String(it->c_str()), Qt::MatchExactly).isEmpty()){ + widget->addItem(QLatin1String(it->c_str())); + } + } + + pcDressUp->Base.setValue(base, edgeNames); + pcDressUp->getDocument()->recomputeFeature(pcDressUp); + hideObject(); + DressUpView->highlightReferences(true); + onButtonRefAdd(true); + } + } +} + void TaskDressUpParameters::onButtonRefAdd(bool checked) { if (checked) { clearButtons(refAdd); hideObject(); selectionMode = refAdd; + addAllEdgesAction->setEnabled(true); AllowSelectionFlags allow; allow.setFlag(AllowSelection::EDGE, allowEdges); allow.setFlag(AllowSelection::FACE, allowFaces); @@ -152,6 +184,7 @@ void TaskDressUpParameters::onButtonRefAdd(bool checked) Gui::Selection().addSelectionGate(new ReferenceSelection(this->getBase(), allow)); DressUpView->highlightReferences(true); } else { + addAllEdgesAction->setEnabled(false); exitSelectionMode(); DressUpView->highlightReferences(false); } @@ -232,9 +265,26 @@ void TaskDressUpParameters::itemClickedTimeout() { wasDoubleClicked = false; } +void TaskDressUpParameters::createAddAllEdgesAction(QListWidget* parentList) +{ + // creates a context menu, a shortcut for it and connects it to e slot function + + addAllEdgesAction = new QAction(tr("Add all edges"), this); + addAllEdgesAction->setShortcut(QKeySequence(QString::fromLatin1("Ctrl+Shift+A"))); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + // display shortcut behind the context menu entry + addAllEdgesAction->setShortcutVisibleInContextMenu(true); +#endif + parentList->addAction(addAllEdgesAction); + addAllEdgesAction->setEnabled(false); + addAllEdgesAction->setStatusTip(tr("Adds all edges to the list box (active only when in add selection mode).")); + parentList->setContextMenuPolicy(Qt::ActionsContextMenu); +} + + void TaskDressUpParameters::createDeleteAction(QListWidget* parentList, QWidget* parentButton) { - // creates a context menu, a shortcutt for it and connects it to e slot function + // creates a context menu, a shortcut for it and connects it to e slot function deleteAction = new QAction(tr("Remove"), this); deleteAction->setShortcut(QKeySequence::Delete); @@ -263,6 +313,10 @@ bool TaskDressUpParameters::KeyEvent(QEvent *e) kevent->accept(); return true; } + if (addAllEdgesAction && kevent->key() == Qt::Key_A && kevent->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)){ + kevent->accept(); + return true; + } } } // if we have a Del key, trigger the deleteAction @@ -273,6 +327,11 @@ bool TaskDressUpParameters::KeyEvent(QEvent *e) deleteAction->trigger(); return true; } + if (kevent->key() == Qt::Key_A && kevent->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { + if (addAllEdgesAction && addAllEdgesAction->isEnabled()) + addAllEdgesAction->trigger(); + return true; + } } return TaskDressUpParameters::event(e); diff --git a/src/Mod/PartDesign/Gui/TaskDressUpParameters.h b/src/Mod/PartDesign/Gui/TaskDressUpParameters.h index e90883f525..82089fd882 100644 --- a/src/Mod/PartDesign/Gui/TaskDressUpParameters.h +++ b/src/Mod/PartDesign/Gui/TaskDressUpParameters.h @@ -71,6 +71,7 @@ protected Q_SLOTS: void itemClickedTimeout(); virtual void onRefDeleted(void) = 0; void createDeleteAction(QListWidget* parentList, QWidget* parentButton); + void createAddAllEdgesAction(QListWidget* parentList); protected: void exitSelectionMode(); @@ -78,7 +79,7 @@ protected: bool wasDoubleClicked = false; bool KeyEvent(QEvent *e); void hideOnError(); - + void addAllEdges(QListWidget* listWidget); protected: enum selectionModes { none, refAdd, refRemove, plane, line }; virtual void clearButtons(const selectionModes notThis) = 0; @@ -91,6 +92,7 @@ protected: QWidget* proxy; ViewProviderDressUp *DressUpView; QAction* deleteAction; + QAction* addAllEdgesAction; bool allowFaces, allowEdges; selectionModes selectionMode; diff --git a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp index 9de54576aa..768bd3bca2 100644 --- a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp @@ -90,6 +90,9 @@ TaskFilletParameters::TaskFilletParameters(ViewProviderDressUp *DressUpView, QWi createDeleteAction(ui->listWidgetReferences, ui->buttonRefRemove); connect(deleteAction, SIGNAL(triggered()), this, SLOT(onRefDeleted())); + createAddAllEdgesAction(ui->listWidgetReferences); + connect(addAllEdgesAction, &QAction::triggered, this, &TaskFilletParameters::onAddAllEdges); + connect(ui->listWidgetReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(setSelection(QListWidgetItem*))); connect(ui->listWidgetReferences, SIGNAL(itemClicked(QListWidgetItem*)), @@ -201,6 +204,12 @@ void TaskFilletParameters::onRefDeleted(void) } } +void TaskFilletParameters::onAddAllEdges(void) +{ + TaskDressUpParameters::addAllEdges(ui->listWidgetReferences); + ui->buttonRefRemove->setEnabled(true); +} + void TaskFilletParameters::onLengthChanged(double len) { clearButtons(none); diff --git a/src/Mod/PartDesign/Gui/TaskFilletParameters.h b/src/Mod/PartDesign/Gui/TaskFilletParameters.h index e4eeb57ab0..7d60ddbcea 100644 --- a/src/Mod/PartDesign/Gui/TaskFilletParameters.h +++ b/src/Mod/PartDesign/Gui/TaskFilletParameters.h @@ -44,6 +44,7 @@ public: private Q_SLOTS: void onLengthChanged(double); void onRefDeleted(void); + void onAddAllEdges(void); protected: double getLength(void) const;