From 0f78ef8b05ceae5910f9210c0f80e17338faee61 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 19 Aug 2022 17:38:26 +0300 Subject: [PATCH] Improve visualization for tool Special point on shoulder. --- .../dialogs/tools/dialogshoulderpoint.cpp | 93 +++++++++++++++---- .../dialogs/tools/dialogshoulderpoint.h | 6 ++ .../line/vistoolshoulderpoint.cpp | 21 +++++ 3 files changed, 102 insertions(+), 18 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogshoulderpoint.cpp b/src/libs/vtools/dialogs/tools/dialogshoulderpoint.cpp index bb77564d9..d98f96eb2 100644 --- a/src/libs/vtools/dialogs/tools/dialogshoulderpoint.cpp +++ b/src/libs/vtools/dialogs/tools/dialogshoulderpoint.cpp @@ -49,6 +49,8 @@ #include "../vmisc/vcommonsettings.h" #include "ui_dialogshoulderpoint.h" #include "../vpatterndb/vcontainer.h" +#include "../vwidgets/vabstractmainwindow.h" +#include "../vgeometry/vpointf.h" //--------------------------------------------------------------------------------------------------------------------- /** @@ -220,24 +222,7 @@ void DialogShoulderPoint::ChosenObject(quint32 id, const SceneObject &type) } break; case 2: - { - QSet set; - set.insert(getCurrentObjectId(ui->comboBoxP3)); - set.insert(getCurrentObjectId(ui->comboBoxP1Line)); - set.insert(id); - - if (set.size() == 3) - { - if (SetObject(id, ui->comboBoxP2Line, QString())) - { - line->setLineP2Id(id); - line->RefreshGeometry(); - prepare = true; - this->setModal(true); - this->show(); - } - } - } + ChosenThirdPoint(id); break; default: break; @@ -269,6 +254,33 @@ void DialogShoulderPoint::closeEvent(QCloseEvent *event) DialogTool::closeEvent(event); } +//--------------------------------------------------------------------------------------------------------------------- +void DialogShoulderPoint::ChosenThirdPoint(quint32 id) +{ + QSet set; + set.insert(getCurrentObjectId(ui->comboBoxP3)); + set.insert(getCurrentObjectId(ui->comboBoxP1Line)); + set.insert(id); + + if (set.size() == 3) + { + if (SetObject(id, ui->comboBoxP2Line, QString())) + { + auto *window = qobject_cast( + VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + + auto *line = qobject_cast(vis); + SCASSERT(line != nullptr) + connect(line, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); + + line->setLineP2Id(id); + line->RefreshGeometry(); + prepare = true; + } + } +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief setPShoulder set id shoulder point @@ -428,3 +440,48 @@ auto DialogShoulderPoint::GetNotes() const -> QString { return ui->plainTextEditToolNotes->toPlainText(); } + +//--------------------------------------------------------------------------------------------------------------------- +void DialogShoulderPoint::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 p3 = data->GeometricObject(GetP3()); + QLineF line(static_cast(*p3), scene->getScenePos()); + SetFormula(QString::number(FromPixel(line.length(), *data->GetPatternUnit()))); + + FinishCreating(); + } + + FinishCreating(); +} diff --git a/src/libs/vtools/dialogs/tools/dialogshoulderpoint.h b/src/libs/vtools/dialogs/tools/dialogshoulderpoint.h index c13755919..ef62d04e8 100644 --- a/src/libs/vtools/dialogs/tools/dialogshoulderpoint.h +++ b/src/libs/vtools/dialogs/tools/dialogshoulderpoint.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; /** @@ -112,6 +114,10 @@ private: bool m_flagFormula{false}; bool m_flagName{true}; bool m_flagError{true}; + + bool m_firstRelease{false}; + + void ChosenThirdPoint(quint32 id); }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/visualization/line/vistoolshoulderpoint.cpp b/src/libs/vtools/visualization/line/vistoolshoulderpoint.cpp index b5194cf07..12140dafb 100644 --- a/src/libs/vtools/visualization/line/vistoolshoulderpoint.cpp +++ b/src/libs/vtools/visualization/line/vistoolshoulderpoint.cpp @@ -41,6 +41,7 @@ #include "../vpatterndb/vcontainer.h" #include "../visualization.h" #include "visline.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolShoulderPoint::VisToolShoulderPoint(const VContainer *data, QGraphicsItem *parent) @@ -98,6 +99,26 @@ void VisToolShoulderPoint::RefreshGeometry() DrawPoint(m_point, mainLine.p2(), mainColor); DrawLine(m_line3, QLineF(static_cast(*first), mainLine.p2()), supportColor, Qt::DashLine); } + else if (mode == Mode::Creation) + { + QLineF cursorLine (static_cast(*first), Visualization::scenePos); + + qreal len = cursorLine.length(); + QPointF fPoint = VToolShoulderPoint::FindPoint(static_cast(*second), + static_cast(*third), + static_cast(*first), len); + QLineF mainLine = QLineF(static_cast(*second), fPoint); + DrawLine(this, mainLine, mainColor, lineStyle); + + DrawPoint(m_point, mainLine.p2(), mainColor); + DrawLine(m_line3, QLineF(static_cast(*first), mainLine.p2()), supportColor, Qt::DashLine); + + 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 { qreal angle = QLineF(static_cast(*second), static_cast(*third)).angle();