From 4fb6dfbd9284d0bf9b3270737b80307e60e18c84 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 20 Aug 2022 18:50:11 +0300 Subject: [PATCH] Improve visualization for tool Segment an arc. --- .../vtools/dialogs/tools/dialogcutarc.cpp | 53 ++++++++++++++++++- src/libs/vtools/dialogs/tools/dialogcutarc.h | 3 ++ .../visualization/path/vistoolcutarc.cpp | 14 +++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogcutarc.cpp b/src/libs/vtools/dialogs/tools/dialogcutarc.cpp index 94727c978..68f052879 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutarc.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutarc.cpp @@ -47,6 +47,7 @@ #include "ui_dialogcutarc.h" #include "../vgeometry/varc.h" #include "../qmuparser/qmudef.h" +#include "../vwidgets/vabstractmainwindow.h" //--------------------------------------------------------------------------------------------------------------------- /** @@ -172,8 +173,10 @@ void DialogCutArc::ChosenObject(quint32 id, const SceneObject &type) vis->VisualMode(id); } prepare = true; - this->setModal(true); - this->show(); + + auto *window = qobject_cast(VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + connect(vis, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); } } } @@ -354,3 +357,49 @@ auto DialogCutArc::GetAliasSuffix2() const -> QString { return ui->lineEditAlias2->text(); } + +//--------------------------------------------------------------------------------------------------------------------- +void DialogCutArc::ShowDialog(bool click) +{ + if (not prepare) + { + return; + } + + auto FinishCreating = [this]() + { + vis->SetMode(Mode::Show); + vis->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 arc = data->GeometricObject(getArcId()); + QPointF p = arc->ClosestPoint(scene->getScenePos()); + qreal len = arc->GetLengthByPoint(p); + if (len > 0) + { + SetFormula(QString::number(FromPixel(len, *data->GetPatternUnit()))); + } + + FinishCreating(); + } + + FinishCreating(); +} diff --git a/src/libs/vtools/dialogs/tools/dialogcutarc.h b/src/libs/vtools/dialogs/tools/dialogcutarc.h index 0f7b9deb8..a7f398a42 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutarc.h +++ b/src/libs/vtools/dialogs/tools/dialogcutarc.h @@ -72,6 +72,7 @@ public: void SetAliasSuffix2(const QString &alias); auto GetAliasSuffix2() const -> QString; + void ShowDialog(bool click) override; public slots: void ChosenObject(quint32 id, const SceneObject &type) override; /** @@ -113,6 +114,8 @@ private: QString m_originAliasSuffix1{}; QString m_originAliasSuffix2{}; + + bool m_firstRelease{false}; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/visualization/path/vistoolcutarc.cpp b/src/libs/vtools/visualization/path/vistoolcutarc.cpp index c79ed58f3..36f5180c9 100644 --- a/src/libs/vtools/visualization/path/vistoolcutarc.cpp +++ b/src/libs/vtools/visualization/path/vistoolcutarc.cpp @@ -42,6 +42,7 @@ #include "../visualization.h" #include "vispath.h" #include "../vwidgets/scalesceneitems.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolCutArc::VisToolCutArc(const VContainer *data, QGraphicsItem *parent) @@ -75,6 +76,19 @@ void VisToolCutArc::RefreshGeometry() DrawPath(m_arc1, ar1.GetPath(), ar1.DirectionArrows(), Qt::darkGreen, lineStyle, Qt::RoundCap); DrawPath(m_arc2, ar2.GetPath(), ar2.DirectionArrows(), Qt::darkRed, lineStyle, Qt::RoundCap); } + else if (mode == Mode::Creation) + { + QPointF p = arc->ClosestPoint(Visualization::scenePos); + qreal length = arc->GetLengthByPoint(p); + + DrawPoint(m_point, p, 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(length), prefix, VModifierKey::EnterKey()); + } } }