From 0facbfc14028ac449f57f84fc79b248d6870b0e3 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Mon, 20 Sep 2021 19:46:49 +0200 Subject: [PATCH] Sketcher: Tracking of constraint visibility via contraint widget filter ======================================================================= Add new option so that the 3D view constraint visibility track the constraint widget filter selection. It maintains internally two mutually exclusive virtual spaces and the ability to select one as visible (the other remaining hiden). --- .../Sketcher/Gui/TaskSketcherConstrains.cpp | 157 ++++++++++++---- src/Mod/Sketcher/Gui/TaskSketcherConstrains.h | 2 + .../Sketcher/Gui/TaskSketcherConstrains.ui | 175 ++++++++++++++---- 3 files changed, 261 insertions(+), 73 deletions(-) diff --git a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp index 2d1a44b447..76c6cc73b2 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp @@ -743,7 +743,13 @@ void TaskSketcherConstrains::onSelectionChanged(const Gui::SelectionChanges& msg void TaskSketcherConstrains::on_comboBoxFilter_currentIndexChanged(int) { - slotConstraintsChanged(); + // enforce constraint visibility + bool visibilityTracksFilter = ui->visualisationTrackingFilter->isChecked(); + + if(visibilityTracksFilter) + change3DViewVisibilityToTrackFilter(); // it will call slotConstraintChanged via update mechanism + else + slotConstraintsChanged(); } void TaskSketcherConstrains::on_filterInternalAlignment_stateChanged(int state) @@ -872,54 +878,85 @@ void TaskSketcherConstrains::on_listWidgetConstraints_itemChanged(QListWidgetIte inEditMode = false; } -void TaskSketcherConstrains::slotConstraintsChanged(void) +void TaskSketcherConstrains::change3DViewVisibilityToTrackFilter() { assert(sketchView); // Build up ListView with the constraints const Sketcher::SketchObject * sketch = sketchView->getSketchObject(); const std::vector< Sketcher::Constraint * > &vals = sketch->Constraints.getValues(); - /* Update constraint number and virtual space check status */ - for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) { - ConstraintItem * it = dynamic_cast(ui->listWidgetConstraints->item(i)); + bool doCommit = false; - assert(it != 0); + Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Update constraint's virtual space")); - it->ConstraintNbr = i; - it->value = QVariant(); - } - - /* Remove entries, if any */ - for (std::size_t i = ui->listWidgetConstraints->count(); i > vals.size(); --i) - delete ui->listWidgetConstraints->takeItem(i - 1); - - /* Add new entries, if any */ - for (std::size_t i = ui->listWidgetConstraints->count(); i < vals.size(); ++i) - ui->listWidgetConstraints->addItem(new ConstraintItem(sketch, sketchView, i)); - - /* Update the states */ - ui->listWidgetConstraints->blockSignals(true); - for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) { - ConstraintItem * it = static_cast(ui->listWidgetConstraints->item(i)); - it->updateVirtualSpaceStatus(); - } - ui->listWidgetConstraints->blockSignals(false); - - /* Update filtering */ - int Filter = ui->comboBoxFilter->currentIndex(); for(std::size_t i = 0; i < vals.size(); ++i) { - const Sketcher::Constraint * constraint = vals[i]; ConstraintItem * it = static_cast(ui->listWidgetConstraints->item(i)); - bool visible = true; - bool showAll = (Filter == FilterValue::All); - bool showGeometric = (Filter == FilterValue::Geometric); - bool showDatums = (Filter == FilterValue::Datums); - bool showNamed = (Filter == FilterValue::Named && !(constraint->Name.empty())); - bool showNonDriving = (Filter == FilterValue::NonDriving && !constraint->isDriving); - bool hideInternalAlignment = this->ui->filterInternalAlignment->isChecked(); + bool visible = !isConstraintFiltered(it); - switch(constraint->Type) { + // If the constraint is filteredout and it was previously shown in 3D view + if( !visible && it->isInVirtualSpace() == sketchView->getIsShownVirtualSpace()) { + try { + Gui::cmdAppObjectArgs(sketch, "setVirtualSpace(%d, %s)", + it->ConstraintNbr, + "True"); + + doCommit = true; + + } + catch (const Base::Exception & e) { + Gui::Command::abortCommand(); + + QMessageBox::critical(Gui::MainWindow::getInstance(), tr("Error"), + QString::fromLatin1("Impossible to update visibility tracking"), QMessageBox::Ok, QMessageBox::Ok); + + return; + } + } + else if( visible && it->isInVirtualSpace() != sketchView->getIsShownVirtualSpace() ) { + try { + Gui::cmdAppObjectArgs(sketch, "setVirtualSpace(%d, %s)", + it->ConstraintNbr, + "False"); + + doCommit = true; + + } + catch (const Base::Exception & e) { + Gui::Command::abortCommand(); + + QMessageBox::critical(Gui::MainWindow::getInstance(), tr("Error"), + QString::fromLatin1("Impossible to update visibility tracking"), QMessageBox::Ok, QMessageBox::Ok); + + return; + } + } + } + + if(doCommit) + Gui::Command::commitCommand(); + +} + +bool TaskSketcherConstrains::isConstraintFiltered(QListWidgetItem * item) +{ + assert(sketchView); + const Sketcher::SketchObject * sketch = sketchView->getSketchObject(); + const std::vector< Sketcher::Constraint * > &vals = sketch->Constraints.getValues(); + ConstraintItem * it = static_cast(item); + const Sketcher::Constraint * constraint = vals[it->ConstraintNbr]; + + int Filter = ui->comboBoxFilter->currentIndex(); + bool hideInternalAlignment = this->ui->filterInternalAlignment->isChecked(); + + bool visible = true; + bool showAll = (Filter == FilterValue::All); + bool showGeometric = (Filter == FilterValue::Geometric); + bool showDatums = (Filter == FilterValue::Datums); + bool showNamed = (Filter == FilterValue::Named && !(constraint->Name.empty())); + bool showNonDriving = (Filter == FilterValue::NonDriving && !constraint->isDriving); + + switch(constraint->Type) { case Sketcher::Horizontal: visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Horizontal); break; @@ -979,7 +1016,50 @@ void TaskSketcherConstrains::slotConstraintsChanged(void) (!hideInternalAlignment || (Filter == FilterValue::InternalAlignment))); default: break; - } + } + + return !visible; +} + +void TaskSketcherConstrains::slotConstraintsChanged(void) +{ + assert(sketchView); + // Build up ListView with the constraints + const Sketcher::SketchObject * sketch = sketchView->getSketchObject(); + const std::vector< Sketcher::Constraint * > &vals = sketch->Constraints.getValues(); + + /* Update constraint number and virtual space check status */ + for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) { + ConstraintItem * it = dynamic_cast(ui->listWidgetConstraints->item(i)); + + assert(it != 0); + + it->ConstraintNbr = i; + it->value = QVariant(); + } + + /* Remove entries, if any */ + for (std::size_t i = ui->listWidgetConstraints->count(); i > vals.size(); --i) + delete ui->listWidgetConstraints->takeItem(i - 1); + + /* Add new entries, if any */ + for (std::size_t i = ui->listWidgetConstraints->count(); i < vals.size(); ++i) + ui->listWidgetConstraints->addItem(new ConstraintItem(sketch, sketchView, i)); + + /* Update the states */ + ui->listWidgetConstraints->blockSignals(true); + for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) { + ConstraintItem * it = static_cast(ui->listWidgetConstraints->item(i)); + it->updateVirtualSpaceStatus(); + } + ui->listWidgetConstraints->blockSignals(false); + + /* Update filtering */ + for(std::size_t i = 0; i < vals.size(); ++i) { + const Sketcher::Constraint * constraint = vals[i]; + ConstraintItem * it = static_cast(ui->listWidgetConstraints->item(i)); + + bool visible = !isConstraintFiltered(it); // block signals as there is no need to invoke the // on_listWidgetConstraints_itemChanged() slot in @@ -990,6 +1070,7 @@ void TaskSketcherConstrains::slotConstraintsChanged(void) it->setHidden(!visible); it->setData(Qt::EditRole, Base::Tools::fromStdString(constraint->Name)); model->blockSignals(block); + } } diff --git a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h index a0f304e352..efcafbc9fc 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h @@ -107,6 +107,8 @@ public: private: void slotConstraintsChanged(void); + bool isConstraintFiltered(QListWidgetItem * item); + void change3DViewVisibilityToTrackFilter(); public Q_SLOTS: void on_comboBoxFilter_currentIndexChanged(int); diff --git a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.ui b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.ui index ecfb596dd9..72111ff806 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.ui +++ b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.ui @@ -6,8 +6,8 @@ 0 0 - 212 - 288 + 234 + 388 @@ -19,7 +19,7 @@ 16777215 - 288 + 388 @@ -165,41 +165,146 @@ - + + + + 0 + 0 + + + + + 0 + 95 + + - Internal alignments will be hidden + - - Hide internal alignment - - - true - - - HideInternalAlignment - - - Mod/Sketcher - - - - - - - Extended information will be added to the list - - - Extended information - - - false - - - ExtendedConstraintInformation - - - Mod/Sketcher + + 1 + + + + 0 + 0 + + + + + 0 + 0 + + + + Controls widget list behaviour + + + List control + + + + + 0 + 30 + 189 + 36 + + + + + 0 + 0 + + + + Extended information will be added to the list + + + Extended information + + + false + + + ExtendedConstraintInformation + + + Mod/Sketcher + + + + + + 0 + 0 + 189 + 36 + + + + + 0 + 0 + + + + Internal alignments will be hidden + + + Hide internal alignment + + + true + + + HideInternalAlignment + + + Mod/Sketcher + + + + + + Controls visualisation in the 3D view + + + Visualisation + + + + + 0 + 0 + 189 + 36 + + + + + 0 + 0 + + + + Constraint visualisation tracks filter selection so that filtered out constraints are hidden + + + Track filter selection + + + false + + + VisualisationTrackingFilter + + + Mod/Sketcher + + +