diff --git a/src/Mod/Sketcher/Gui/TaskSketcherMessages.cpp b/src/Mod/Sketcher/Gui/TaskSketcherMessages.cpp index ac9e777c56..85bf3d7e0f 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherMessages.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherMessages.cpp @@ -59,8 +59,7 @@ TaskSketcherMessages::TaskSketcherMessages(ViewProviderSketch *sketchView) : this->groupLayout()->addWidget(proxy); - connectionSetUp = sketchView->signalSetUp.connect(boost::bind(&SketcherGui::TaskSketcherMessages::slotSetUp, this, bp::_1, bp::_2)); - connectionSolved = sketchView->signalSolved.connect(boost::bind(&SketcherGui::TaskSketcherMessages::slotSolved, this, bp::_1, bp::_2)); + connectionSetUp = sketchView->signalSetUp.connect(boost::bind(&SketcherGui::TaskSketcherMessages::slotSetUp, this, bp::_1, bp::_2, bp::_3, bp::_4)); ui->labelConstrainStatus->setOpenExternalLinks(false); @@ -72,19 +71,22 @@ TaskSketcherMessages::TaskSketcherMessages(ViewProviderSketch *sketchView) : else sketchView->getSketchObject()->noRecomputes=true; - // Set up the possible state values for the solver status label - const std::string paramGroup ("User parameter:BaseApp/Preferences/Mod/Sketcher"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("empty_sketch"), QColor("black"), paramGroup, "emptySketchMessageColor"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("under_constrained"), QColor("black"), paramGroup, "underconstrainedMessageColor"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("malformed_constraints"), QColor("red"), paramGroup, "malformedConstraintMessageColor"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("conflicting_constraints"), QColor("orangered"), paramGroup, "conflictingConstraintMessageColor"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("redundant_constraints"), QColor("red"), paramGroup, "redundantConstraintMessageColor"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("partially_redundant_constraints"), QColor("royalblue"), paramGroup, "partiallyRedundantConstraintMessageColor"); - ui->labelConstrainStatus->registerState(QString::fromUtf8("fully_constrained"), QColor("green"), paramGroup, "fullyConstrainedMessageColor"); + // Set up the possible state values for the status label + ui->labelConstrainStatus->setParameterGroup("User parameter:BaseApp/Preferences/Mod/Sketcher/General"); + ui->labelConstrainStatus->registerState(QString::fromUtf8("empty_sketch"), QColor("black"), std::string("EmptySketchMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("under_constrained"), QColor("black"), std::string("UnderconstrainedMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("malformed_constraints"), QColor("red"), std::string("MalformedConstraintMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("conflicting_constraints"), QColor("orangered"), std::string("ConflictingConstraintMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("redundant_constraints"), QColor("red"), std::string("RedundantConstraintMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("partially_redundant_constraints"), QColor("royalblue"), std::string("PartiallyRedundantConstraintMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("solver_failed"), QColor("red"), std::string("SolverFailedMessageColor")); + ui->labelConstrainStatus->registerState(QString::fromUtf8("fully_constrained"), QColor("green"), std::string("FullyConstrainedMessageColor")); - ui->labelSolverStatus->registerState(QString::fromUtf8("good"), QColor("green"), QColor(255, 255, 255, 50), paramGroup, "solverGoodMessageColor"); - ui->labelSolverStatus->registerState(QString::fromUtf8("bad"), QColor("red"), QColor(255, 255, 255, 50), paramGroup, "solverBadMessageColor"); - ui->labelSolverStatus->registerState(QString::fromUtf8("neutral"), QColor("black"), paramGroup, "solverNeutralMessageColor"); + ui->labelConstrainStatusLink->setLaunchExternal(false); + + // Manually connect the link since it uses "clicked()", which labels don't have natively + connect(ui->labelConstrainStatusLink, &Gui::UrlLabel::linkClicked, + this, &TaskSketcherMessages::on_labelConstrainStatusLink_linkClicked); /*QObject::connect( ui->labelConstrainStatus, SIGNAL(linkActivated(const QString &)), @@ -103,22 +105,17 @@ TaskSketcherMessages::TaskSketcherMessages(ViewProviderSketch *sketchView) : TaskSketcherMessages::~TaskSketcherMessages() { connectionSetUp.disconnect(); - connectionSolved.disconnect(); } -void TaskSketcherMessages::slotSetUp(const QString &state, const QString &msg) +void TaskSketcherMessages::slotSetUp(const QString& state, const QString& msg, const QString& link, const QString& linkText) { ui->labelConstrainStatus->setState(state); ui->labelConstrainStatus->setText(msg); + ui->labelConstrainStatusLink->setUrl(link); + ui->labelConstrainStatusLink->setText(linkText); } -void TaskSketcherMessages::slotSolved(const QString& state, const QString& msg) -{ - ui->labelSolverStatus->setState(state); - ui->labelSolverStatus->setText(msg); -} - -void TaskSketcherMessages::on_labelConstrainStatus_linkActivated(const QString &str) +void TaskSketcherMessages::on_labelConstrainStatusLink_linkClicked(const QString &str) { if( str == QString::fromLatin1("#conflicting")) Gui::Application::Instance->commandManager().runCommandByName("Sketcher_SelectConflictingConstraints"); diff --git a/src/Mod/Sketcher/Gui/TaskSketcherMessages.h b/src/Mod/Sketcher/Gui/TaskSketcherMessages.h index 3c2669f81a..300059c905 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherMessages.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherMessages.h @@ -47,11 +47,10 @@ public: TaskSketcherMessages(ViewProviderSketch *sketchView); ~TaskSketcherMessages(); - void slotSetUp(const QString &state, const QString &msg); - void slotSolved(const QString& state, const QString &msg); + void slotSetUp(const QString &state, const QString &msg, const QString& link, const QString& linkText); private Q_SLOTS: - void on_labelConstrainStatus_linkActivated(const QString &); + void on_labelConstrainStatusLink_linkClicked(const QString &); void on_autoUpdate_stateChanged(int state); void on_autoRemoveRedundants_stateChanged(int state); void on_manualUpdate_clicked(bool checked); @@ -59,7 +58,6 @@ private Q_SLOTS: protected: ViewProviderSketch *sketchView; Connection connectionSetUp; - Connection connectionSolved; private: QWidget* proxy; diff --git a/src/Mod/Sketcher/Gui/TaskSketcherMessages.ui b/src/Mod/Sketcher/Gui/TaskSketcherMessages.ui index cdfd694b57..8c95744c99 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherMessages.ui +++ b/src/Mod/Sketcher/Gui/TaskSketcherMessages.ui @@ -15,24 +15,35 @@ - - - Undefined degrees of freedom - - - true - - - - - - - Not solved yet - - - true - - + + + + + DOF + + + + + + + Link + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + @@ -94,11 +105,16 @@ QCheckBox
Gui/PrefWidgets.h
- - Gui::StatefulLabel - QLabel -
Gui/Widgets.h
-
+ + Gui::StatefulLabel + QLabel +
Gui/Widgets.h
+
+ + Gui::UrlLabel + QLabel +
Gui/Widgets.h
+
diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 951fe66507..a63a7bf104 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -1312,10 +1312,6 @@ bool ViewProviderSketch::mouseMove(const SbVec2s &cursorPos, Gui::View3DInventor if (getSketchObject()->moveTemporaryPoint(GeoId, PosId, vec, false) == 0) { setPositionText(Base::Vector2d(x,y)); draw(true,false); - signalSolved(QString::fromUtf8("neutral"), QString::fromLatin1("Solved in %1 sec").arg(getSolvedSketch().getSolveTime())); - } else { - signalSolved(QString::fromUtf8("bad"), QString::fromLatin1("Unsolved (%1 sec)").arg(getSolvedSketch().getSolveTime())); - //Base::Console().Log("Error solving:%d\n",ret); } } } @@ -1353,9 +1349,6 @@ bool ViewProviderSketch::mouseMove(const SbVec2s &cursorPos, Gui::View3DInventor if (getSketchObject()->moveTemporaryPoint(edit->DragCurve, Sketcher::none, vec, relative) == 0) { setPositionText(Base::Vector2d(x,y)); draw(true,false); - signalSolved(QString::fromUtf8("neutral"), QString::fromLatin1("Solved in %1 sec").arg(getSolvedSketch().getSolveTime())); - } else { - signalSolved(QString::fromUtf8("bad"), QString::fromLatin1("Unsolved (%1 sec)").arg(getSolvedSketch().getSolveTime())); } } return true; @@ -6584,6 +6577,29 @@ QString ViewProviderSketch::appendConstraintMsg(const QString & singularmsg, return msg; } +inline QString intListHelper(const std::vector &ints) +{ + QString results; + if (ints.size() < 8) { // The 8 is a bit heuristic... more than that and we shift formats + for (const auto i : ints) { + if (results.isEmpty()) + results.append(QString::fromUtf8("%1").arg(i)); + else + results.append(QString::fromUtf8(", %1").arg(i)); + } + } + else { + const int numToShow = 3; + int more = ints.size() - numToShow; + for (int i = 0; i < numToShow; ++i) { + results.append(QString::fromUtf8("%1, ").arg(ints[i])); + } + results.append(QCoreApplication::translate("ViewProviderSketch","and %1 more").arg(more)); + } + std::string testString = results.toStdString(); + return results; +} + void ViewProviderSketch::UpdateSolverInformation() { // Updates Solver Information with the Last solver execution at SketchObject level @@ -6594,82 +6610,48 @@ void ViewProviderSketch::UpdateSolverInformation() bool hasMalformed = getSketchObject()->getLastHasMalformedConstraints(); if (getSketchObject()->Geometry.getSize() == 0) { - signalSetUp(QString::fromUtf8("empty_sketch"), tr("Empty sketch")); - signalSolved(QString::fromUtf8("neutral"), QString()); + signalSetUp(QString::fromUtf8("empty_sketch"), tr("Empty sketch"), QString(), QString()); } - else if (dofs < 0) { // over-constrained sketch - std::string msg; - SketchObject::appendConflictMsg(getSketchObject()->getLastConflicting(), msg); - signalSetUp(QString::fromUtf8("conflicting_constraints"), - QString::fromLatin1("%1 %2
%3
") - .arg(tr("Over-constrained sketch")) - .arg(tr("(click to select)")) - .arg(QString::fromStdString(msg))); - signalSolved(QString::fromUtf8("neutral"), QString()); + else if (dofs < 0 || hasConflicts) { // over-constrained sketch + signalSetUp(QString::fromUtf8("conflicting_constraints"), + tr("Over-constrained: "), + QString::fromUtf8("#conflicting"), + QString::fromUtf8("(%1)").arg(intListHelper(getSketchObject()->getLastConflicting()))); } else if (hasMalformed) { // malformed constraints - signalSetUp(QString::fromUtf8("malformed_constraints"), - QString::fromLatin1("%1 %2
%3
") - .arg(tr("Sketch contains malformed constraints")) - .arg(tr("(click to select)")) - .arg(appendMalformedMsg(getSketchObject()->getLastMalformedConstraints()))); - signalSolved(QString::fromUtf8("neutral"), QString()); + signalSetUp(QString::fromUtf8("malformed_constraints"), + tr("Malformed constraints: "), + QString::fromUtf8("#malformed"), + QString::fromUtf8("(%1)").arg(intListHelper(getSketchObject()->getLastMalformedConstraints()))); } - else if (hasConflicts) { // conflicting constraints - signalSetUp(QString::fromUtf8("conflicting_constraints"), - QString::fromLatin1("%1 %2
%3
") - .arg(tr("Sketch contains conflicting constraints")) - .arg(tr("(click to select)")) - .arg(appendConflictMsg(getSketchObject()->getLastConflicting()))); - signalSolved(QString::fromUtf8("neutral"), QString()); + else if (hasRedundancies) { + signalSetUp(QString::fromUtf8("redundant_constraints"), + tr("Redundant constraints:"), + QString::fromUtf8("#redundant"), + QString::fromUtf8("(%1)").arg(intListHelper(getSketchObject()->getLastRedundant()))); + } + else if (hasPartiallyRedundant) { + signalSetUp(QString::fromUtf8("partially_redundant_constraints"), + tr("Partially redundant:"), + QString::fromUtf8("#partiallyredundant"), + QString::fromUtf8("(%1)").arg(intListHelper(getSketchObject()->getLastPartiallyRedundant()))); + } + else if (getSketchObject()->getLastSolverStatus() != 0) { + signalSetUp(QString::fromUtf8("solver_failed"), + tr("Solver failed to converge"), + QString::fromUtf8(""), + QString::fromUtf8("")); + } else if (dofs > 0) { + signalSetUp(QString::fromUtf8("under_constrained"), + tr("Under constrained:"), + QString::fromUtf8("#dofs"), + QString::fromUtf8("%1 %2").arg(dofs).arg(tr("DoF"))); } else { - if (hasRedundancies) { // redundant constraints - signalSetUp(QString::fromUtf8("redundant_constraints"), - QString::fromLatin1("%1 %2
%3
") - .arg(tr("Sketch contains redundant constraints")) - .arg(tr("(click to select)")) - .arg(appendRedundantMsg(getSketchObject()->getLastRedundant()))); - } - - QString partiallyRedundantString; - - if(hasPartiallyRedundant) { - partiallyRedundantString = QString::fromLatin1("
%1 %2
%3

") - .arg(tr("Sketch contains partially redundant constraints")) - .arg(tr("(click to select)")) - .arg(appendPartiallyRedundantMsg(getSketchObject()->getLastPartiallyRedundant())); - } - - if (getSketchObject()->getLastSolverStatus() == 0) { - if (dofs == 0) { - // color the sketch as fully constrained if it has geometry (other than the axes) - if(getSolvedSketch().getGeometrySize()>2) - edit->FullyConstrained = true; - - if (!hasRedundancies) { - signalSetUp(QString::fromUtf8("fully_constrained"), - partiallyRedundantString + tr("Fully constrained sketch")); - } - } - else if (!hasRedundancies) { - QString infoString; - if (dofs == 1) - signalSetUp(QString::fromUtf8("under_constrained"), - tr("Under-constrained sketch with 1 degree of freedom. %1") - .arg(partiallyRedundantString)); - else - signalSetUp(QString::fromUtf8("under_constrained"), - tr("Under-constrained sketch with %1 degrees of freedom. %2") - .arg(dofs) - .arg(partiallyRedundantString)); - } - - signalSolved(QString::fromUtf8("good"), tr("Solved in %1 sec").arg(getSketchObject()->getLastSolveTime())); - } - else { - signalSolved(QString::fromUtf8("bad"), tr("Unsolved (%1 sec)").arg(getSketchObject()->getLastSolveTime())); - } + signalSetUp(QString::fromUtf8("fully_constrained"), tr("Fully constrained"), QString(), QString()); + // color the sketch as fully constrained if it has geometry (other than the axes) + if(getSolvedSketch().getGeometrySize()>2) + edit->FullyConstrained = true; } } diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.h b/src/Mod/Sketcher/Gui/ViewProviderSketch.h index b086f1554d..fabb68c1ea 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.h @@ -273,9 +273,7 @@ public: /// signals if the constraints list has changed boost::signals2::signal signalConstraintsChanged; /// signals if the sketch has been set up - boost::signals2::signal signalSetUp; - /// signals if the sketch has been solved - boost::signals2::signal signalSolved; + boost::signals2::signal signalSetUp; /// signals if the elements list has changed boost::signals2::signal signalElementsChanged;