diff --git a/ChangeLog.txt b/ChangeLog.txt index 72d0b20d0..d4018b7af 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -19,6 +19,7 @@ - Remember selected dimension values. - Fix segmenting a simple curve. - Fix export tiled pdf on Mac OS. +- Improve visualization for tools. # Valentina 0.7.51 April 18, 2022 - Z value change for a layout piece. diff --git a/src/libs/vtools/dialogs/tools/dialogalongline.cpp b/src/libs/vtools/dialogs/tools/dialogalongline.cpp index db192419e..186f8b6a7 100644 --- a/src/libs/vtools/dialogs/tools/dialogalongline.cpp +++ b/src/libs/vtools/dialogs/tools/dialogalongline.cpp @@ -54,6 +54,7 @@ #include "../vpatterndb/variables/vlinelength.h" #include "../vpatterndb/vtranslatevars.h" #include "ui_dialogalongline.h" +#include "../vwidgets/vabstractmainwindow.h" //--------------------------------------------------------------------------------------------------------------------- /** @@ -174,9 +175,6 @@ void DialogAlongLine::DeployFormulaTextEdit() //--------------------------------------------------------------------------------------------------------------------- DialogAlongLine::~DialogAlongLine() { - auto *locData = const_cast (data); - locData->RemoveVariable(currentLength); - delete ui; } @@ -209,25 +207,7 @@ void DialogAlongLine::ChosenObject(quint32 id, const SceneObject &type) } break; case 1: - if (SetObject(id, ui->comboBoxSecondPoint, QString())) - { - if (m_flagError) - { - line->setObject2Id(id); - if (m_buildMidpoint) - { - SetFormula(currentLength + QStringLiteral("/2")); - } - line->RefreshGeometry(); - prepare = true; - this->setModal(true); - this->show(); - } - else - { - emit ToolTip(toolTip); - } - } + ChosenSecondPoint(id, toolTip); break; default: break; @@ -284,6 +264,47 @@ void DialogAlongLine::SetCurrentLength() locData->AddVariable(length); } +//--------------------------------------------------------------------------------------------------------------------- +void DialogAlongLine::ChosenSecondPoint(quint32 id, const QString toolTip) +{ + if (SetObject(id, ui->comboBoxSecondPoint, QString())) + { + auto *line = qobject_cast(vis); + SCASSERT(line != nullptr) + + if (m_flagError) + { + line->setObject2Id(id); + if (m_buildMidpoint) + { + SetFormula(currentLength + QStringLiteral("/2")); + line->SetMode(Mode::Show); + } + else + { + auto *window = qobject_cast( + VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + connect(line, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); + } + + line->RefreshGeometry(); + + prepare = true; + + if (m_buildMidpoint) + { + setModal(true); + show(); + } + } + else + { + emit ToolTip(toolTip); + } + } +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief SetSecondPointId set id second point of line @@ -322,6 +343,62 @@ void DialogAlongLine::Build(const Tool &type) } } +//--------------------------------------------------------------------------------------------------------------------- +void DialogAlongLine::ShowDialog(bool click) +{ + if (not prepare || m_buildMidpoint) + { + 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)); + + 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(); +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief SetFirstPointId set id first point of line diff --git a/src/libs/vtools/dialogs/tools/dialogalongline.h b/src/libs/vtools/dialogs/tools/dialogalongline.h index cfcae052d..d5b6d30b3 100644 --- a/src/libs/vtools/dialogs/tools/dialogalongline.h +++ b/src/libs/vtools/dialogs/tools/dialogalongline.h @@ -75,6 +75,7 @@ public: auto GetNotes() const -> QString; void Build(const Tool &type) override; + void ShowDialog(bool click) override; public slots: void ChosenObject(quint32 id, const SceneObject &type) override; /** @@ -115,7 +116,11 @@ private: bool m_flagError{true}; bool m_flagName{true}; + bool m_firstRelease{false}; + void SetCurrentLength(); + + void ChosenSecondPoint(quint32 id, const QString toolTip); }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/dialogs/tools/dialogcutarc.cpp b/src/libs/vtools/dialogs/tools/dialogcutarc.cpp index 465ea932a..09307be1d 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutarc.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutarc.cpp @@ -147,9 +147,6 @@ void DialogCutArc::DeployFormulaTextEdit() //--------------------------------------------------------------------------------------------------------------------- DialogCutArc::~DialogCutArc() { - auto *locData = const_cast (data); - locData->RemoveVariable(currentLength); - delete ui; } diff --git a/src/libs/vtools/dialogs/tools/dialogcutspline.cpp b/src/libs/vtools/dialogs/tools/dialogcutspline.cpp index 807ea29f3..6f59bbb6b 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutspline.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutspline.cpp @@ -106,9 +106,6 @@ DialogCutSpline::DialogCutSpline(const VContainer *data, quint32 toolId, QWidget //--------------------------------------------------------------------------------------------------------------------- DialogCutSpline::~DialogCutSpline() { - auto *locData = const_cast (data); - locData->RemoveVariable(currentLength); - delete ui; } diff --git a/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp b/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp index 6c7e00878..9e9072896 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp @@ -106,9 +106,6 @@ DialogCutSplinePath::DialogCutSplinePath(const VContainer *data, quint32 toolId, //--------------------------------------------------------------------------------------------------------------------- DialogCutSplinePath::~DialogCutSplinePath() { - auto *locData = const_cast (data); - locData->RemoveVariable(currentLength); - delete ui; } diff --git a/src/libs/vtools/visualization/line/vistoolalongline.cpp b/src/libs/vtools/visualization/line/vistoolalongline.cpp index a65e32142..dd7549d88 100644 --- a/src/libs/vtools/visualization/line/vistoolalongline.cpp +++ b/src/libs/vtools/visualization/line/vistoolalongline.cpp @@ -36,12 +36,12 @@ #include #include -#include "../ifc/ifcdef.h" #include "../vgeometry/vgobject.h" #include "../vgeometry/vpointf.h" #include "../vpatterndb/vcontainer.h" #include "../visualization.h" #include "visline.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolAlongLine::VisToolAlongLine(const VContainer *data, QGraphicsItem *parent) @@ -97,7 +97,7 @@ void VisToolAlongLine::RefreshGeometry() if (m_midPointMode) { cursorLine.setLength(cursorLine.length()/2.0); - DrawPoint(lineP2, cursorLine.p2(), supportColor); + DrawPoint(point, cursorLine.p2(), mainColor); } } else @@ -105,7 +105,8 @@ void VisToolAlongLine::RefreshGeometry() const QSharedPointer second = Visualization::data->GeometricObject(object2Id); DrawPoint(lineP2, static_cast(*second), supportColor); - DrawLine(line, QLineF(static_cast(*first), static_cast(*second)), supportColor); + QLineF baseLine(static_cast(*first), static_cast(*second)); + DrawLine(line, baseLine, supportColor); if (not qFuzzyIsNull(length)) { @@ -114,6 +115,28 @@ void VisToolAlongLine::RefreshGeometry() DrawPoint(point, mainLine.p2(), mainColor); } + else if (mode == Mode::Creation) + { + QLineF cursorLine (static_cast(*first), Visualization::scenePos); + + qreal len = cursorLine.length(); + qreal angleTo = baseLine.angleTo(cursorLine); + if (angleTo > 90 && angleTo < 270) + { + len *= -1; + } + + QLineF mainLine = VGObject::BuildLine(static_cast(*first), len, line->line().angle()); + 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()); + } } } } diff --git a/src/libs/vtools/visualization/path/vistoolarc.cpp b/src/libs/vtools/visualization/path/vistoolarc.cpp index 08f9eb6c2..eaf06ccf3 100644 --- a/src/libs/vtools/visualization/path/vistoolarc.cpp +++ b/src/libs/vtools/visualization/path/vistoolarc.cpp @@ -81,13 +81,6 @@ void VisToolArc::RefreshGeometry() return r.angle(); }; - auto NumberToUser = [](qreal value) - { - return VAbstractApplication::VApp()->TrVars() - ->FormulaToUser(QString::number(VAbstractValApplication::VApp()->fromPixel(value)), - VAbstractApplication::VApp()->Settings()->GetOsSeparator()); - }; - static const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); if (qFuzzyIsNull(radius)) diff --git a/src/libs/vtools/visualization/path/vistoolarcwithlength.cpp b/src/libs/vtools/visualization/path/vistoolarcwithlength.cpp index 3210fd1fa..15f8e8d09 100644 --- a/src/libs/vtools/visualization/path/vistoolarcwithlength.cpp +++ b/src/libs/vtools/visualization/path/vistoolarcwithlength.cpp @@ -78,13 +78,6 @@ void VisToolArcWithLength::RefreshGeometry() return r.angle(); }; - auto NumberToUser = [](qreal value) - { - return VAbstractApplication::VApp()->TrVars() - ->FormulaToUser(QString::number(VAbstractValApplication::VApp()->fromPixel(value)), - VAbstractApplication::VApp()->Settings()->GetOsSeparator()); - }; - static const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); if (qFuzzyIsNull(radius)) diff --git a/src/libs/vtools/visualization/visualization.cpp b/src/libs/vtools/visualization/visualization.cpp index 23e94d978..13829b8d0 100644 --- a/src/libs/vtools/visualization/visualization.cpp +++ b/src/libs/vtools/visualization/visualization.cpp @@ -329,6 +329,14 @@ VCurvePathItem *Visualization::GetCurveItem(QVector &curves, q } } +//--------------------------------------------------------------------------------------------------------------------- +QString Visualization::NumberToUser(qreal value) +{ + return VAbstractApplication::VApp()->TrVars() + ->FormulaToUser(QString::number(VAbstractValApplication::VApp()->fromPixel(value)), + VAbstractApplication::VApp()->Settings()->GetOsSeparator()); +} + //--------------------------------------------------------------------------------------------------------------------- Mode Visualization::GetMode() const { diff --git a/src/libs/vtools/visualization/visualization.h b/src/libs/vtools/visualization/visualization.h index 5fa5d8f9c..6fec205d3 100644 --- a/src/libs/vtools/visualization/visualization.h +++ b/src/libs/vtools/visualization/visualization.h @@ -122,6 +122,8 @@ protected: QGraphicsItem *parent); static VCurvePathItem *GetCurveItem(QVector &curves, quint32 i, const QColor &color, QGraphicsItem *parent); + + static auto NumberToUser(qreal value) -> QString; private: Q_DISABLE_COPY_MOVE(Visualization) // NOLINT };