From 0939d28c41df68ff2be830a671e0c8a9ec19c320 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Mon, 22 Aug 2022 10:51:24 +0300 Subject: [PATCH] Improve visualization for tool Point of intersection circles. --- .../dialogpointofintersectioncircles.cpp | 80 +++++++++++++++++-- .../tools/dialogpointofintersectioncircles.h | 6 +- .../vistoolpointofintersectioncircles.cpp | 74 +++++++++++++---- .../line/vistoolpointofintersectioncircles.h | 18 ++--- src/libs/vwidgets/scalesceneitems.cpp | 17 +++- src/libs/vwidgets/scalesceneitems.h | 5 ++ 6 files changed, 167 insertions(+), 33 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.cpp b/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.cpp index eeb999320..15cf40739 100644 --- a/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.cpp +++ b/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.cpp @@ -49,6 +49,8 @@ #include "../vmisc/vabstractapplication.h" #include "../vmisc/vcommonsettings.h" #include "ui_dialogpointofintersectioncircles.h" +#include "../vwidgets/vabstractmainwindow.h" +#include "../vgeometry/vpointf.h" //--------------------------------------------------------------------------------------------------------------------- DialogPointOfIntersectionCircles::DialogPointOfIntersectionCircles(const VContainer *data, quint32 toolId, @@ -242,6 +244,67 @@ void DialogPointOfIntersectionCircles::SetCrossCirclesPoint(const CrossCirclesPo } } +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::ShowDialog(bool click) +{ + if (m_stage == 0 || m_stage == 2) + { + 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) + + QSharedPointer center = data->GeometricObject(m_stage == 1 ? GetFirstCircleCenterId() + : GetSecondCircleCenterId()); + + QLineF line(static_cast(*center), scene->getScenePos()); + + if (m_stage == 1) + { + SetFirstCircleRadius(QString::number(FromPixel(line.length(), *data->GetPatternUnit()))); + emit ToolTip(tr("Select second circle center")); + ++m_stage; + m_firstRelease = false; + } + else + { + SetSecondCircleRadius(QString::number(FromPixel(line.length(), *data->GetPatternUnit()))); + ++m_stage; + } + + if (m_stage > 2) + { + FinishCreating(); + } + + return; + } + + FinishCreating(); +} + //--------------------------------------------------------------------------------------------------------------------- void DialogPointOfIntersectionCircles::ChosenObject(quint32 id, const SceneObject &type) { @@ -255,26 +318,29 @@ void DialogPointOfIntersectionCircles::ChosenObject(quint32 id, const SceneObjec auto *point = qobject_cast(vis); SCASSERT(point != nullptr) - switch (m_number) + switch (m_stage) { case 0: - if (SetObject(id, ui->comboBoxCircle1Center, tr("Select second circle center"))) + if (SetObject(id, ui->comboBoxCircle1Center, QString())) { - m_number++; + ++m_stage; point->VisualMode(id); + + auto *window = qobject_cast( + VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + connect(vis, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); } break; - case 1: + case 2: if (getCurrentObjectId(ui->comboBoxCircle1Center) != id) { if (SetObject(id, ui->comboBoxCircle2Center, QString())) { - m_number = 0; point->setObject2Id(id); point->RefreshGeometry(); + ++m_stage; prepare = true; - this->setModal(true); - this->show(); } } break; diff --git a/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.h b/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.h index be3d1e0f4..48ffa3a2e 100644 --- a/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.h +++ b/src/libs/vtools/dialogs/tools/dialogpointofintersectioncircles.h @@ -73,6 +73,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; void PointChanged(); @@ -116,8 +118,10 @@ private: bool m_flagName{true}; bool m_flagError{true}; + bool m_firstRelease{false}; + /** @brief number number of handled objects */ - qint32 m_number{0}; + qint32 m_stage{0}; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.cpp b/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.cpp index 78c78e9b5..7c7ee887d 100644 --- a/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.cpp +++ b/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.cpp @@ -41,6 +41,7 @@ #include "../vwidgets/vmaingraphicsscene.h" #include "../visualization.h" #include "visline.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolPointOfIntersectionCircles::VisToolPointOfIntersectionCircles(const VContainer *data, QGraphicsItem *parent) @@ -48,9 +49,15 @@ VisToolPointOfIntersectionCircles::VisToolPointOfIntersectionCircles(const VCont { this->setPen(QPen(Qt::NoPen)); // don't use parent this time - m_c1Path = InitItem(Qt::darkGreen, this); - m_c2Path = InitItem(Qt::darkRed, this); + m_c1Path = InitItem(Qt::darkGreen, this); + m_c1Path->SetPointMode(false); + + m_c2Path = InitItem(Qt::darkRed, this); + m_c2Path->SetPointMode(false); + m_point = InitPoint(mainColor, this); + m_point->setZValue(1); + m_c1Center = InitPoint(supportColor, this); m_c2Center = InitPoint(supportColor, this); //-V656 } @@ -63,26 +70,63 @@ void VisToolPointOfIntersectionCircles::RefreshGeometry() const QSharedPointer first = Visualization::data->GeometricObject(object1Id); DrawPoint(m_c1Center, static_cast(*first), supportColor); - if (m_object2Id > NULL_ID) + if (m_c1Radius > 0) { - const QSharedPointer second = Visualization::data->GeometricObject(m_object2Id); - DrawPoint(m_c2Center, static_cast(*second), supportColor); + m_c1Path->setRect(PointRect(m_c1Radius)); + DrawPoint(m_c1Path, static_cast(*first), Qt::darkGreen, Qt::DashLine); - if (m_c1Radius > 0 && m_c2Radius > 0) + if (m_object2Id > NULL_ID) { - m_c1Path->setRect(PointRect(m_c1Radius)); - DrawPoint(m_c1Path, static_cast(*first), Qt::darkGreen, Qt::DashLine); + const QSharedPointer second = Visualization::data->GeometricObject(m_object2Id); + DrawPoint(m_c2Center, static_cast(*second), supportColor); - m_c2Path->setRect(PointRect(m_c2Radius)); - DrawPoint(m_c2Path, static_cast(*second), Qt::darkRed, Qt::DashLine); + if (m_c2Radius > 0) + { + m_c2Path->setRect(PointRect(m_c2Radius)); + DrawPoint(m_c2Path, static_cast(*second), Qt::darkRed, Qt::DashLine); - QPointF fPoint; - VToolPointOfIntersectionCircles::FindPoint(static_cast(*first), - static_cast(*second), - m_c1Radius, m_c2Radius, m_crossPoint, &fPoint); - DrawPoint(m_point, fPoint, mainColor); + QPointF fPoint; + VToolPointOfIntersectionCircles::FindPoint(static_cast(*first), + static_cast(*second), + m_c1Radius, m_c2Radius, m_crossPoint, &fPoint); + DrawPoint(m_point, fPoint, mainColor); + } + else if (mode == Mode::Creation) + { + QLineF radiusLine (static_cast(*second), Visualization::scenePos); + const qreal length = radiusLine.length(); + + m_c2Path->setRect(PointRect(length)); + DrawPoint(m_c2Path, static_cast(*second), Qt::darkRed, Qt::DashLine); + + QPointF fPoint; + VToolPointOfIntersectionCircles::FindPoint(static_cast(*first), + static_cast(*second), + m_c1Radius, length, m_crossPoint, &fPoint); + DrawPoint(m_point, fPoint, mainColor); + + const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); + Visualization::toolTip = tr("Radius = %1%2; " + "Mouse click - finish selecting the second radius, " + "%3 - skip") + .arg(NumberToUser(length), prefix, VModifierKey::EnterKey()); + } } } + else if (mode == Mode::Creation) + { + QLineF radiusLine (static_cast(*first), Visualization::scenePos); + const qreal length = radiusLine.length(); + + m_c1Path->setRect(PointRect(length)); + DrawPoint(m_c1Path, static_cast(*first), Qt::darkGreen, Qt::DashLine); + + const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); + Visualization::toolTip = tr("Radius = %1%2; " + "Mouse click - finish selecting the first radius, " + "%3 - skip") + .arg(NumberToUser(length), prefix, VModifierKey::EnterKey()); + } } } diff --git a/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.h b/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.h index 0e1dc1bd4..7dcc9ba9c 100644 --- a/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.h +++ b/src/libs/vtools/visualization/line/vistoolpointofintersectioncircles.h @@ -60,15 +60,15 @@ public: private: // cppcheck-suppress unknownMacro Q_DISABLE_COPY_MOVE(VisToolPointOfIntersectionCircles) // NOLINT - quint32 m_object2Id{NULL_ID}; - qreal m_c1Radius{0}; - qreal m_c2Radius{0}; - CrossCirclesPoint m_crossPoint{CrossCirclesPoint::FirstPoint}; - VScaledEllipse *m_point{nullptr}; - VScaledEllipse *m_c1Center{nullptr}; - VScaledEllipse *m_c2Center{nullptr}; - QGraphicsEllipseItem *m_c1Path{nullptr}; - QGraphicsEllipseItem *m_c2Path{nullptr}; + quint32 m_object2Id{NULL_ID}; + qreal m_c1Radius{0}; + qreal m_c2Radius{0}; + CrossCirclesPoint m_crossPoint{CrossCirclesPoint::FirstPoint}; + VScaledEllipse *m_point{nullptr}; + VScaledEllipse *m_c1Center{nullptr}; + VScaledEllipse *m_c2Center{nullptr}; + VScaledEllipse *m_c1Path{nullptr}; + VScaledEllipse *m_c2Path{nullptr}; }; #endif // VISTOOLPOINTOFINTERSECTIONCIRCLES_H diff --git a/src/libs/vwidgets/scalesceneitems.cpp b/src/libs/vwidgets/scalesceneitems.cpp index ff056fff9..59366c5e0 100644 --- a/src/libs/vwidgets/scalesceneitems.cpp +++ b/src/libs/vwidgets/scalesceneitems.cpp @@ -84,7 +84,22 @@ void VScaledEllipse::paint(QPainter *painter, const QStyleOptionGraphicsItem *op visPen.setWidthF(width); setPen(visPen); - ScaleCircleSize(this, scale); + if (m_pointMode) + { + ScaleCircleSize(this, scale); + } PaintWithFixItemHighlightSelected(this, painter, option, widget); } + +//--------------------------------------------------------------------------------------------------------------------- +bool VScaledEllipse::PointMode() const +{ + return m_pointMode; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VScaledEllipse::SetPointMode(bool newHoldSize) +{ + m_pointMode = newHoldSize; +} diff --git a/src/libs/vwidgets/scalesceneitems.h b/src/libs/vwidgets/scalesceneitems.h index e2798a0b4..66694cd50 100644 --- a/src/libs/vwidgets/scalesceneitems.h +++ b/src/libs/vwidgets/scalesceneitems.h @@ -67,8 +67,13 @@ public: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; + bool PointMode() const; + void SetPointMode(bool newPointMode); + private: Q_DISABLE_COPY_MOVE(VScaledEllipse) // NOLINT + + bool m_pointMode{true}; }; #endif // SCALESCENEITEMS_H