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 + + +