diff --git a/src/libs/vtools/dialogs/tools/dialognormal.cpp b/src/libs/vtools/dialogs/tools/dialognormal.cpp index e85f5c1a6..217055fe8 100644 --- a/src/libs/vtools/dialogs/tools/dialognormal.cpp +++ b/src/libs/vtools/dialogs/tools/dialognormal.cpp @@ -35,21 +35,23 @@ #include #include #include +#include #include #include #include #include #include "../vpatterndb/vtranslatevars.h" -#include "../../tools/vabstracttool.h" +#include "../vpatterndb/vcontainer.h" #include "../../visualization/line/vistoolnormal.h" #include "../../visualization/visualization.h" #include "../ifc/xml/vabstractpattern.h" -#include "../ifc/xml/vdomdocument.h" #include "../support/dialogeditwrongformula.h" #include "../vmisc/vabstractapplication.h" #include "../vmisc/vcommonsettings.h" #include "ui_dialognormal.h" +#include "../vwidgets/vabstractmainwindow.h" +#include "../vgeometry/vpointf.h" //--------------------------------------------------------------------------------------------------------------------- /** @@ -218,8 +220,11 @@ void DialogNormal::ChosenObject(quint32 id, const SceneObject &type) line->setObject2Id(id); line->RefreshGeometry(); prepare = true; - this->setModal(true); - this->show(); + + auto *window = qobject_cast( + VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + connect(line, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); } } break; @@ -415,3 +420,60 @@ auto DialogNormal::GetNotes() const -> QString { return ui->plainTextEditToolNotes->toPlainText(); } + +//--------------------------------------------------------------------------------------------------------------------- +void DialogNormal::ShowDialog(bool click) +{ + if (not prepare) + { + return; + } + + auto *lineVis = qobject_cast(vis); + SCASSERT(lineVis != nullptr) + + auto FinishCreating = [this, lineVis]() + { + lineVis->SetMode(Mode::Show); + lineVis->RefreshGeometry(); + + emit ToolTip(QString()); + + setModal(true); + show(); + }; + + if (click) + { + // The check need to ignore first release of mouse button. + // User can select point by clicking on a label. + if (not m_firstRelease) + { + m_firstRelease = true; + return; + } + + auto *scene = qobject_cast(VAbstractValApplication::VApp()->getCurrentScene()); + SCASSERT(scene != nullptr) + + const QSharedPointer p1 = data->GeometricObject(GetFirstPointId()); + const QSharedPointer p2 = data->GeometricObject(GetSecondPointId()); + QLineF baseLine(static_cast(*p1), static_cast(*p2)); + baseLine.setAngle(baseLine.angle() + 90); + + QLineF line(static_cast(*p1), scene->getScenePos()); + + qreal len = line.length(); + qreal angleTo = baseLine.angleTo(line); + if (angleTo > 90 && angleTo < 270) + { + len *= -1; + } + + SetFormula(QString::number(FromPixel(len, *data->GetPatternUnit()))); + + FinishCreating(); + } + + FinishCreating(); +} diff --git a/src/libs/vtools/dialogs/tools/dialognormal.h b/src/libs/vtools/dialogs/tools/dialognormal.h index 98df755a1..74c32c87a 100644 --- a/src/libs/vtools/dialogs/tools/dialognormal.h +++ b/src/libs/vtools/dialogs/tools/dialognormal.h @@ -76,6 +76,8 @@ public: void SetNotes(const QString ¬es); auto GetNotes() const -> QString; + + void ShowDialog(bool click) override; public slots: void ChosenObject(quint32 id, const SceneObject &type) override; /** diff --git a/src/libs/vtools/visualization/line/vistoolnormal.cpp b/src/libs/vtools/visualization/line/vistoolnormal.cpp index 2b955e490..078d4acf4 100644 --- a/src/libs/vtools/visualization/line/vistoolnormal.cpp +++ b/src/libs/vtools/visualization/line/vistoolnormal.cpp @@ -37,11 +37,11 @@ #include #include "../../tools/drawTools/toolpoint/toolsinglepoint/toollinepoint/vtoolnormal.h" -#include "../ifc/ifcdef.h" #include "../vgeometry/vpointf.h" #include "../vpatterndb/vcontainer.h" #include "../visualization.h" #include "visline.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolNormal::VisToolNormal(const VContainer *data, QGraphicsItem *parent) @@ -82,13 +82,7 @@ void VisToolNormal::RefreshGeometry() QLineF line_mouse(static_cast(*first), static_cast(*second)); DrawLine(line, line_mouse, supportColor); - if (qFuzzyIsNull(length)) - { - QLineF normal = line_mouse.normalVector(); - QPointF endRay = Ray(normal.p1(), normal.angle()); - DrawLine(this, QLineF(normal.p1(), endRay), mainColor); - } - else + if (not qFuzzyIsNull(length)) { QPointF fPoint = VToolNormal::FindPoint(static_cast(*first), static_cast(*second), length, angle); @@ -97,6 +91,37 @@ void VisToolNormal::RefreshGeometry() DrawPoint(point, mainLine.p2(), mainColor); } + else if (mode == Mode::Creation) + { + QLineF cursorLine (static_cast(*first), Visualization::scenePos); + QLineF normal = line_mouse.normalVector(); + + qreal len = cursorLine.length(); + qreal angleTo = normal.angleTo(cursorLine); + if (angleTo > 90 && angleTo < 270) + { + len *= -1; + } + + QPointF fPoint = VToolNormal::FindPoint(static_cast(*first), static_cast(*second), + len, angle); + QLineF mainLine = QLineF(static_cast(*first), fPoint); + DrawLine(this, mainLine, mainColor, lineStyle); + + DrawPoint(point, mainLine.p2(), mainColor); + + const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); + Visualization::toolTip = tr("Length = %1%2; " + "Mouse click - finish selecting the length, " + "%3 - skip") + .arg(NumberToUser(len), prefix, VModifierKey::EnterKey()); + } + else + { + QLineF normal = line_mouse.normalVector(); + QPointF endRay = Ray(normal.p1(), normal.angle()); + DrawLine(this, QLineF(normal.p1(), endRay), mainColor); + } } } }