Skip to content

Commit

Permalink
[Sketcher] Migrate constraint and solver status to StatefulLabel
Browse files Browse the repository at this point in the history
  • Loading branch information
chennes committed Oct 3, 2021
1 parent c487848 commit ec249a8
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 31 deletions.
26 changes: 21 additions & 5 deletions src/Mod/Sketcher/Gui/TaskSketcherMessages.cpp
Expand Up @@ -59,8 +59,8 @@ TaskSketcherMessages::TaskSketcherMessages(ViewProviderSketch *sketchView) :

this->groupLayout()->addWidget(proxy);

connectionSetUp = sketchView->signalSetUp.connect(boost::bind(&SketcherGui::TaskSketcherMessages::slotSetUp, this, bp::_1));
connectionSolved = sketchView->signalSolved.connect(boost::bind(&SketcherGui::TaskSketcherMessages::slotSolved, this, bp::_1));
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));

ui->labelConstrainStatus->setOpenExternalLinks(false);

Expand All @@ -72,6 +72,20 @@ 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");

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");

/*QObject::connect(
ui->labelConstrainStatus, SIGNAL(linkActivated(const QString &)),
this , SLOT (on_labelConstrainStatus_linkActivated(const QString &))
Expand All @@ -92,13 +106,15 @@ TaskSketcherMessages::~TaskSketcherMessages()
connectionSolved.disconnect();
}

void TaskSketcherMessages::slotSetUp(QString msg)
void TaskSketcherMessages::slotSetUp(const QString &state, const QString &msg)
{
ui->labelConstrainStatus->setState(state);
ui->labelConstrainStatus->setText(msg);
}

void TaskSketcherMessages::slotSolved(QString msg)
void TaskSketcherMessages::slotSolved(const QString& state, const QString& msg)
{
ui->labelSolverStatus->setState(state);
ui->labelSolverStatus->setText(msg);
}

Expand All @@ -115,7 +131,7 @@ void TaskSketcherMessages::on_labelConstrainStatus_linkActivated(const QString &
else
if( str == QString::fromLatin1("#malformed"))
Gui::Application::Instance->commandManager().runCommandByName("Sketcher_SelectMalformedConstraints");
else
else
if( str == QString::fromLatin1("#partiallyredundant"))
Gui::Application::Instance->commandManager().runCommandByName("Sketcher_SelectPartiallyRedundantConstraints");

Expand Down
4 changes: 2 additions & 2 deletions src/Mod/Sketcher/Gui/TaskSketcherMessages.h
Expand Up @@ -47,8 +47,8 @@ class TaskSketcherMessages : public Gui::TaskView::TaskBox
TaskSketcherMessages(ViewProviderSketch *sketchView);
~TaskSketcherMessages();

void slotSetUp(QString msg);
void slotSolved(QString msg);
void slotSetUp(const QString &state, const QString &msg);
void slotSolved(const QString& state, const QString &msg);

private Q_SLOTS:
void on_labelConstrainStatus_linkActivated(const QString &);
Expand Down
9 changes: 7 additions & 2 deletions src/Mod/Sketcher/Gui/TaskSketcherMessages.ui
Expand Up @@ -15,7 +15,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="labelConstrainStatus">
<widget class="Gui::StatefulLabel" name="labelConstrainStatus">
<property name="text">
<string>Undefined degrees of freedom</string>
</property>
Expand All @@ -25,7 +25,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="labelSolverStatus">
<widget class="Gui::StatefulLabel" name="labelSolverStatus">
<property name="text">
<string>Not solved yet</string>
</property>
Expand Down Expand Up @@ -94,6 +94,11 @@
<extends>QCheckBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
<customwidget>
<class>Gui::StatefulLabel</class>
<extends>QLabel</extends>
<header>Gui/Widgets.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
Expand Down
49 changes: 29 additions & 20 deletions src/Mod/Sketcher/Gui/ViewProviderSketch.cpp
Expand Up @@ -402,6 +402,9 @@ ViewProviderSketch::ViewProviderSketch()
//rubberband selection
rubberband = new Gui::Rubberband();

// Status message states:


subscribeToParameters();
}

Expand Down Expand Up @@ -1309,9 +1312,9 @@ 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::fromLatin1("Solved in %1 sec").arg(getSolvedSketch().getSolveTime()));
signalSolved(QString::fromUtf8("neutral"), QString::fromLatin1("Solved in %1 sec").arg(getSolvedSketch().getSolveTime()));
} else {
signalSolved(QString::fromLatin1("Unsolved (%1 sec)").arg(getSolvedSketch().getSolveTime()));
signalSolved(QString::fromUtf8("bad"), QString::fromLatin1("Unsolved (%1 sec)").arg(getSolvedSketch().getSolveTime()));
//Base::Console().Log("Error solving:%d\n",ret);
}
}
Expand Down Expand Up @@ -1350,9 +1353,9 @@ 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::fromLatin1("Solved in %1 sec").arg(getSolvedSketch().getSolveTime()));
signalSolved(QString::fromUtf8("neutral"), QString::fromLatin1("Solved in %1 sec").arg(getSolvedSketch().getSolveTime()));
} else {
signalSolved(QString::fromLatin1("Unsolved (%1 sec)").arg(getSolvedSketch().getSolveTime()));
signalSolved(QString::fromUtf8("bad"), QString::fromLatin1("Unsolved (%1 sec)").arg(getSolvedSketch().getSolveTime()));
}
}
return true;
Expand Down Expand Up @@ -6591,35 +6594,39 @@ void ViewProviderSketch::UpdateSolverInformation()
bool hasMalformed = getSketchObject()->getLastHasMalformedConstraints();

if (getSketchObject()->Geometry.getSize() == 0) {
signalSetUp(tr("Empty sketch"));
signalSolved(QString());
signalSetUp(QString::fromUtf8("empty_sketch"), tr("Empty sketch"));
signalSolved(QString::fromUtf8("neutral"), QString());
}
else if (dofs < 0) { // over-constrained sketch
std::string msg;
SketchObject::appendConflictMsg(getSketchObject()->getLastConflicting(), msg);
signalSetUp(QString::fromLatin1("<font color='red'>%1 <a href=\"#conflicting\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3</font><br/>")
signalSetUp(QString::fromUtf8("conflicting_constraints"),
QString::fromLatin1("%1 <a href=\"#conflicting\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3<br/>")
.arg(tr("Over-constrained sketch"))
.arg(tr("(click to select)"))
.arg(QString::fromStdString(msg)));
signalSolved(QString());
signalSolved(QString::fromUtf8("neutral"), QString());
}
else if (hasMalformed) { // malformed constraints
signalSetUp(QString::fromLatin1("<font color='red'>%1 <a href=\"#malformed\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3</font><br/>")
signalSetUp(QString::fromUtf8("malformed_constraints"),
QString::fromLatin1("%1 <a href=\"#malformed\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3<br/>")
.arg(tr("Sketch contains malformed constraints"))
.arg(tr("(click to select)"))
.arg(appendMalformedMsg(getSketchObject()->getLastMalformedConstraints())));
signalSolved(QString());
signalSolved(QString::fromUtf8("neutral"), QString());
}
else if (hasConflicts) { // conflicting constraints
signalSetUp(QString::fromLatin1("<font color='red'>%1 <a href=\"#conflicting\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3</font><br/>")
signalSetUp(QString::fromUtf8("conflicting_constraints"),
QString::fromLatin1("%1 <a href=\"#conflicting\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3<br/>")
.arg(tr("Sketch contains conflicting constraints"))
.arg(tr("(click to select)"))
.arg(appendConflictMsg(getSketchObject()->getLastConflicting())));
signalSolved(QString());
signalSolved(QString::fromUtf8("neutral"), QString());
}
else {
if (hasRedundancies) { // redundant constraints
signalSetUp(QString::fromLatin1("<font color='orangered'>%1 <a href=\"#redundant\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3</font><br/>")
signalSetUp(QString::fromUtf8("redundant_constraints"),
QString::fromLatin1("%1 <a href=\"#redundant\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3<br/>")
.arg(tr("Sketch contains redundant constraints"))
.arg(tr("(click to select)"))
.arg(appendRedundantMsg(getSketchObject()->getLastRedundant())));
Expand All @@ -6628,7 +6635,7 @@ void ViewProviderSketch::UpdateSolverInformation()
QString partiallyRedundantString;

if(hasPartiallyRedundant) {
partiallyRedundantString = QString::fromLatin1("<br/><font color='royalblue'><span style=\"background-color: #ececec;\">%1 <a href=\"#partiallyredundant\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3</span></font><br/>")
partiallyRedundantString = QString::fromLatin1("<br/><span style=\"background-color: rgba(255,255,255,50) ;\">%1 <a href=\"#partiallyredundant\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%2</span></a><br/>%3</span><br/>")
.arg(tr("Sketch contains partially redundant constraints"))
.arg(tr("(click to select)"))
.arg(appendPartiallyRedundantMsg(getSketchObject()->getLastPartiallyRedundant()));
Expand All @@ -6641,25 +6648,27 @@ void ViewProviderSketch::UpdateSolverInformation()
edit->FullyConstrained = true;

if (!hasRedundancies) {
signalSetUp(QString::fromLatin1("<font color='green'><span style=\"color:#008000; background-color: #ececec;\">%1</font></span> %2").arg(tr("Fully constrained sketch")).arg(partiallyRedundantString));
signalSetUp(QString::fromUtf8("fully_constrained"),
partiallyRedundantString + tr("Fully constrained sketch"));
}
}
else if (!hasRedundancies) {
QString infoString;

if (dofs == 1)
signalSetUp(tr("Under-constrained sketch with <a href=\"#dofs\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">1 degree</span></a> of freedom. %1")
signalSetUp(QString::fromUtf8("under_constrained"),
tr("Under-constrained sketch with <a href=\"#dofs\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">1 degree</span></a> of freedom. %1")
.arg(partiallyRedundantString));
else
signalSetUp(tr("Under-constrained sketch with <a href=\"#dofs\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%1 degrees</span></a> of freedom. %2")
signalSetUp(QString::fromUtf8("under_constrained"),
tr("Under-constrained sketch with <a href=\"#dofs\"><span style=\" text-decoration: underline; color:#0000ff; background-color: #F8F8FF;\">%1 degrees</span></a> of freedom. %2")
.arg(dofs)
.arg(partiallyRedundantString));
}

signalSolved(QString::fromLatin1("<font color='green'><span style=\"color:#008000; background-color: #ececec;\">%1</font></span>").arg(tr("Solved in %1 sec").arg(getSketchObject()->getLastSolveTime())));
signalSolved(QString::fromUtf8("good"), tr("Solved in %1 sec").arg(getSketchObject()->getLastSolveTime()));
}
else {
signalSolved(QString::fromLatin1("<font color='red'>%1</font>").arg(tr("Unsolved (%1 sec)").arg(getSketchObject()->getLastSolveTime())));
signalSolved(QString::fromUtf8("bad"), tr("Unsolved (%1 sec)").arg(getSketchObject()->getLastSolveTime()));
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/Mod/Sketcher/Gui/ViewProviderSketch.h
Expand Up @@ -273,9 +273,9 @@ class SketcherGuiExport ViewProviderSketch : public PartGui::ViewProvider2DObjec
/// signals if the constraints list has changed
boost::signals2::signal<void ()> signalConstraintsChanged;
/// signals if the sketch has been set up
boost::signals2::signal<void (QString msg)> signalSetUp;
boost::signals2::signal<void (const QString &state, const QString &msg)> signalSetUp;
/// signals if the sketch has been solved
boost::signals2::signal<void (QString msg)> signalSolved;
boost::signals2::signal<void (const QString &state, const QString &msg)> signalSolved;
/// signals if the elements list has changed
boost::signals2::signal<void ()> signalElementsChanged;

Expand Down

0 comments on commit ec249a8

Please sign in to comment.