From 3feddb9ce99d4b1bf0b207684ca19f8d12144f68 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 7 Nov 2020 11:18:13 +0200 Subject: [PATCH] Fix alias validation bug. --- src/libs/vtools/dialogs/tools/dialogarc.cpp | 6 +- src/libs/vtools/dialogs/tools/dialogarc.h | 2 + .../dialogs/tools/dialogarcwithlength.cpp | 6 +- .../dialogs/tools/dialogarcwithlength.h | 2 + .../dialogs/tools/dialogcubicbezier.cpp | 6 +- .../vtools/dialogs/tools/dialogcubicbezier.h | 2 + .../dialogs/tools/dialogcubicbezierpath.cpp | 6 +- .../dialogs/tools/dialogcubicbezierpath.h | 2 + .../vtools/dialogs/tools/dialogcutarc.cpp | 47 ++-- src/libs/vtools/dialogs/tools/dialogcutarc.h | 3 + .../vtools/dialogs/tools/dialogcutspline.cpp | 47 ++-- .../vtools/dialogs/tools/dialogcutspline.h | 3 + .../dialogs/tools/dialogcutsplinepath.cpp | 47 ++-- .../dialogs/tools/dialogcutsplinepath.h | 3 + .../dialogs/tools/dialogellipticalarc.cpp | 6 +- .../dialogs/tools/dialogellipticalarc.h | 2 + .../dialogs/tools/dialogflippingbyaxis.cpp | 207 ++++++++++++++++-- .../vtools/dialogs/tools/dialogspline.cpp | 8 +- src/libs/vtools/dialogs/tools/dialogspline.h | 2 + .../vtools/dialogs/tools/dialogsplinepath.cpp | 8 +- .../vtools/dialogs/tools/dialogsplinepath.h | 2 + 21 files changed, 307 insertions(+), 110 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogarc.cpp b/src/libs/vtools/dialogs/tools/dialogarc.cpp index a3f263ee9..83ce97da4 100644 --- a/src/libs/vtools/dialogs/tools/dialogarc.cpp +++ b/src/libs/vtools/dialogs/tools/dialogarc.cpp @@ -244,7 +244,8 @@ QString DialogArc::GetNotes() const //--------------------------------------------------------------------------------------------------------------------- void DialogArc::SetAliasSuffix(const QString &alias) { - ui->lineEditAlias->setText(alias); + originAliasSuffix = alias; + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); } @@ -361,7 +362,8 @@ void DialogArc::ValidateAlias() VArc arc; arc.SetAliasSuffix(GetAliasSuffix()); if (not GetAliasSuffix().isEmpty() && - (not rx.match(arc.GetAlias()).hasMatch() || not data->IsUnique(arc.GetAlias()))) + (not rx.match(arc.GetAlias()).hasMatch() || + (originAliasSuffix != GetAliasSuffix() && not data->IsUnique(arc.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); diff --git a/src/libs/vtools/dialogs/tools/dialogarc.h b/src/libs/vtools/dialogs/tools/dialogarc.h index 9f9cec67c..9eb896f49 100644 --- a/src/libs/vtools/dialogs/tools/dialogarc.h +++ b/src/libs/vtools/dialogs/tools/dialogarc.h @@ -146,6 +146,8 @@ private: qreal angleF1; qreal angleF2; + QString originAliasSuffix{}; + void EvalRadius(); void EvalF(); }; diff --git a/src/libs/vtools/dialogs/tools/dialogarcwithlength.cpp b/src/libs/vtools/dialogs/tools/dialogarcwithlength.cpp index 53889f68b..c1ec97df7 100644 --- a/src/libs/vtools/dialogs/tools/dialogarcwithlength.cpp +++ b/src/libs/vtools/dialogs/tools/dialogarcwithlength.cpp @@ -270,7 +270,8 @@ QString DialogArcWithLength::GetNotes() const //--------------------------------------------------------------------------------------------------------------------- void DialogArcWithLength::SetAliasSuffix(const QString &alias) { - ui->lineEditAlias->setText(alias); + originAliasSuffix = alias; + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); } @@ -398,7 +399,8 @@ void DialogArcWithLength::ValidateAlias() VArc arc; arc.SetAliasSuffix(GetAliasSuffix()); if (not GetAliasSuffix().isEmpty() && - (not rx.match(arc.GetAlias()).hasMatch() || not data->IsUnique(arc.GetAlias()))) + (not rx.match(arc.GetAlias()).hasMatch() || + (originAliasSuffix != GetAliasSuffix() && not data->IsUnique(arc.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); diff --git a/src/libs/vtools/dialogs/tools/dialogarcwithlength.h b/src/libs/vtools/dialogs/tools/dialogarcwithlength.h index 107230fa0..ea69c1bbc 100644 --- a/src/libs/vtools/dialogs/tools/dialogarcwithlength.h +++ b/src/libs/vtools/dialogs/tools/dialogarcwithlength.h @@ -137,6 +137,8 @@ private: int formulaBaseHeightF1; int formulaBaseHeightLength; + QString originAliasSuffix{}; + void Radius(); void Length(); void EvalF(); diff --git a/src/libs/vtools/dialogs/tools/dialogcubicbezier.cpp b/src/libs/vtools/dialogs/tools/dialogcubicbezier.cpp index 0abe851dc..306423f6a 100644 --- a/src/libs/vtools/dialogs/tools/dialogcubicbezier.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcubicbezier.cpp @@ -109,7 +109,8 @@ void DialogCubicBezier::SetSpline(const VCubicBezier &spline) ui->lineEditSplineName->setText(qApp->TrVars()->VarToUser(spl.name())); ui->doubleSpinBoxApproximationScale->setValue(spl.GetApproximationScale()); - ui->lineEditAlias->setText(spl.GetAliasSuffix()); + originAliasSuffix = spl.GetAliasSuffix(); + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); auto path = qobject_cast(vis); @@ -270,7 +271,8 @@ void DialogCubicBezier::ValidateAlias() VCubicBezier spline = spl; spline.SetAliasSuffix(ui->lineEditAlias->text()); if (not ui->lineEditAlias->text().isEmpty() && - (not rx.match(spline.GetAlias()).hasMatch() || not data->IsUnique(spline.GetAlias()))) + (not rx.match(spline.GetAlias()).hasMatch() || + (originAliasSuffix != ui->lineEditAlias->text() && not data->IsUnique(spline.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); diff --git a/src/libs/vtools/dialogs/tools/dialogcubicbezier.h b/src/libs/vtools/dialogs/tools/dialogcubicbezier.h index 3b1ee58cf..a16a5b593 100644 --- a/src/libs/vtools/dialogs/tools/dialogcubicbezier.h +++ b/src/libs/vtools/dialogs/tools/dialogcubicbezier.h @@ -83,6 +83,8 @@ private: bool flagError; bool flagAlias{true}; + QString originAliasSuffix{}; + const QSharedPointer GetP1() const; const QSharedPointer GetP2() const; const QSharedPointer GetP3() const; diff --git a/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.cpp b/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.cpp index 6b10de924..e583126a0 100644 --- a/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.cpp @@ -115,7 +115,8 @@ void DialogCubicBezierPath::SetPath(const VCubicBezierPath &value) ui->lineEditSplPathName->setText(qApp->TrVars()->VarToUser(path.name())); ui->doubleSpinBoxApproximationScale->setValue(path.GetApproximationScale()); - ui->lineEditAlias->setText(path.GetAliasSuffix()); + originAliasSuffix = path.GetAliasSuffix(); + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); ChangeCurrentData(ui->comboBoxPenStyle, path.GetPenStyle()); @@ -259,7 +260,8 @@ void DialogCubicBezierPath::ValidateAlias() VCubicBezierPath tempPath = path; tempPath.SetAliasSuffix(ui->lineEditAlias->text()); if (not ui->lineEditAlias->text().isEmpty() && - (not rx.match(tempPath.GetAlias()).hasMatch() || not data->IsUnique(tempPath.GetAlias()))) + (not rx.match(tempPath.GetAlias()).hasMatch() || + (originAliasSuffix != ui->lineEditAlias->text() && not data->IsUnique(tempPath.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); diff --git a/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.h b/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.h index 60f91bfe8..ecea40812 100644 --- a/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.h +++ b/src/libs/vtools/dialogs/tools/dialogcubicbezierpath.h @@ -83,6 +83,8 @@ private: bool flagError; bool flagAlias{true}; + QString originAliasSuffix{}; + void NewItem(const VPointF &point); void DataPoint(const VPointF &p); void SavePath(); diff --git a/src/libs/vtools/dialogs/tools/dialogcutarc.cpp b/src/libs/vtools/dialogs/tools/dialogcutarc.cpp index 41aa68a61..eea074655 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutarc.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutarc.cpp @@ -209,46 +209,37 @@ void DialogCutArc::ArcChanged() void DialogCutArc::ValidateAlias() { QRegularExpression rx(NameRegExp()); + VArc arc1; arc1.SetAliasSuffix(GetAliasSuffix1()); - if (not GetAliasSuffix1().isEmpty() && - (not rx.match(arc1.GetAlias()).hasMatch() || not data->IsUnique(arc1.GetAlias()))) - { - flagAlias1 = false; - ChangeColor(ui->labelAlias1, errorColor); - } - else - { - flagAlias1 = true; - ChangeColor(ui->labelAlias1, OkColor(this)); - } VArc arc2; arc2.SetAliasSuffix(GetAliasSuffix2()); - if (not GetAliasSuffix2().isEmpty() && not data->IsUnique(arc2.GetAlias())) - { - flagAlias2 = false; - ChangeColor(ui->labelAlias2, errorColor); - } - else - { - flagAlias2 = true; - ChangeColor(ui->labelAlias2, OkColor(this)); - } - if (arc1.GetAlias() == arc2.GetAlias()) + if (not GetAliasSuffix1().isEmpty() && + (not rx.match(arc1.GetAlias()).hasMatch() || + (originAliasSuffix2 != GetAliasSuffix1() && not data->IsUnique(arc1.GetAlias())) || + arc1.GetAlias() == arc2.GetAlias())) { flagAlias1 = false; ChangeColor(ui->labelAlias1, errorColor); - - flagAlias2 = false; - ChangeColor(ui->labelAlias2, errorColor); } else { flagAlias1 = true; ChangeColor(ui->labelAlias1, OkColor(this)); + } + if (not GetAliasSuffix2().isEmpty() && + (not rx.match(arc2.GetAlias()).hasMatch() || + (originAliasSuffix2 != GetAliasSuffix2() && not data->IsUnique(arc2.GetAlias())) || + arc1.GetAlias() == arc2.GetAlias())) + { + flagAlias2 = false; + ChangeColor(ui->labelAlias2, errorColor); + } + else + { flagAlias2 = true; ChangeColor(ui->labelAlias2, OkColor(this)); } @@ -338,7 +329,8 @@ QString DialogCutArc::GetNotes() const //--------------------------------------------------------------------------------------------------------------------- void DialogCutArc::SetAliasSuffix1(const QString &alias) { - ui->lineEditAlias1->setText(alias); + originAliasSuffix1 = alias; + ui->lineEditAlias1->setText(originAliasSuffix1); ValidateAlias(); } @@ -351,7 +343,8 @@ QString DialogCutArc::GetAliasSuffix1() const //--------------------------------------------------------------------------------------------------------------------- void DialogCutArc::SetAliasSuffix2(const QString &alias) { - ui->lineEditAlias2->setText(alias); + originAliasSuffix2 = alias; + ui->lineEditAlias2->setText(originAliasSuffix2); ValidateAlias(); } diff --git a/src/libs/vtools/dialogs/tools/dialogcutarc.h b/src/libs/vtools/dialogs/tools/dialogcutarc.h index 385023b96..f4ba43101 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutarc.h +++ b/src/libs/vtools/dialogs/tools/dialogcutarc.h @@ -110,6 +110,9 @@ private: bool flagName; bool flagAlias1{true}; bool flagAlias2{true}; + + QString originAliasSuffix1{}; + QString originAliasSuffix2{}; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/dialogs/tools/dialogcutspline.cpp b/src/libs/vtools/dialogs/tools/dialogcutspline.cpp index 854caaf70..0f41f71a9 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutspline.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutspline.cpp @@ -216,46 +216,37 @@ void DialogCutSpline::SplineChanged() void DialogCutSpline::ValidateAlias() { QRegularExpression rx(NameRegExp()); + VSpline spl1; spl1.SetAliasSuffix(GetAliasSuffix1()); - if (not GetAliasSuffix1().isEmpty() && - (not rx.match(spl1.GetAlias()).hasMatch() || not data->IsUnique(spl1.GetAlias()))) - { - flagAlias1 = false; - ChangeColor(ui->labelAlias1, errorColor); - } - else - { - flagAlias1 = true; - ChangeColor(ui->labelAlias1, OkColor(this)); - } VSpline spl2; spl2.SetAliasSuffix(GetAliasSuffix2()); - if (not GetAliasSuffix2().isEmpty() && not data->IsUnique(spl2.GetAlias())) - { - flagAlias2 = false; - ChangeColor(ui->labelAlias2, errorColor); - } - else - { - flagAlias2 = true; - ChangeColor(ui->labelAlias2, OkColor(this)); - } - if (spl1.GetAlias() == spl2.GetAlias()) + if (not GetAliasSuffix1().isEmpty() && + (not rx.match(spl1.GetAlias()).hasMatch() || + (originAliasSuffix2 != GetAliasSuffix1() && not data->IsUnique(spl1.GetAlias())) || + spl1.GetAlias() == spl2.GetAlias())) { flagAlias1 = false; ChangeColor(ui->labelAlias1, errorColor); - - flagAlias2 = false; - ChangeColor(ui->labelAlias2, errorColor); } else { flagAlias1 = true; ChangeColor(ui->labelAlias1, OkColor(this)); + } + if (not GetAliasSuffix2().isEmpty() && + (not rx.match(spl2.GetAlias()).hasMatch() || + (originAliasSuffix2 != GetAliasSuffix2() && not data->IsUnique(spl2.GetAlias())) || + spl1.GetAlias() == spl2.GetAlias())) + { + flagAlias2 = false; + ChangeColor(ui->labelAlias2, errorColor); + } + else + { flagAlias2 = true; ChangeColor(ui->labelAlias2, OkColor(this)); } @@ -338,7 +329,8 @@ QString DialogCutSpline::GetNotes() const //--------------------------------------------------------------------------------------------------------------------- void DialogCutSpline::SetAliasSuffix1(const QString &alias) { - ui->lineEditAlias1->setText(alias); + originAliasSuffix1 = alias; + ui->lineEditAlias1->setText(originAliasSuffix1); ValidateAlias(); } @@ -351,7 +343,8 @@ QString DialogCutSpline::GetAliasSuffix1() const //--------------------------------------------------------------------------------------------------------------------- void DialogCutSpline::SetAliasSuffix2(const QString &alias) { - ui->lineEditAlias2->setText(alias); + originAliasSuffix2 = alias; + ui->lineEditAlias2->setText(originAliasSuffix2); ValidateAlias(); } diff --git a/src/libs/vtools/dialogs/tools/dialogcutspline.h b/src/libs/vtools/dialogs/tools/dialogcutspline.h index 060cb9d8a..04cd0fecd 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutspline.h +++ b/src/libs/vtools/dialogs/tools/dialogcutspline.h @@ -109,6 +109,9 @@ private: bool flagName; bool flagAlias1{true}; bool flagAlias2{true}; + + QString originAliasSuffix1{}; + QString originAliasSuffix2{}; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp b/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp index 412caa5c7..f49581936 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp +++ b/src/libs/vtools/dialogs/tools/dialogcutsplinepath.cpp @@ -216,46 +216,37 @@ void DialogCutSplinePath::SplinePathChanged() void DialogCutSplinePath::ValidateAlias() { QRegularExpression rx(NameRegExp()); + VSplinePath path1; path1.SetAliasSuffix(GetAliasSuffix1()); - if (not GetAliasSuffix1().isEmpty() && - (not rx.match(path1.GetAlias()).hasMatch() || not data->IsUnique(path1.GetAlias()))) - { - flagAlias1 = false; - ChangeColor(ui->labelAlias1, errorColor); - } - else - { - flagAlias1 = true; - ChangeColor(ui->labelAlias1, OkColor(this)); - } VSplinePath path2; path2.SetAliasSuffix(GetAliasSuffix2()); - if (not GetAliasSuffix2().isEmpty() && not data->IsUnique(path2.GetAlias())) - { - flagAlias2 = false; - ChangeColor(ui->labelAlias2, errorColor); - } - else - { - flagAlias2 = true; - ChangeColor(ui->labelAlias2, OkColor(this)); - } - if (path1.GetAlias() == path2.GetAlias()) + if (not GetAliasSuffix1().isEmpty() && + (not rx.match(path1.GetAlias()).hasMatch() || + (originAliasSuffix2 != GetAliasSuffix1() && not data->IsUnique(path1.GetAlias())) || + path1.GetAlias() == path2.GetAlias())) { flagAlias1 = false; ChangeColor(ui->labelAlias1, errorColor); - - flagAlias2 = false; - ChangeColor(ui->labelAlias2, errorColor); } else { flagAlias1 = true; ChangeColor(ui->labelAlias1, OkColor(this)); + } + if (not GetAliasSuffix2().isEmpty() && + (not rx.match(path2.GetAlias()).hasMatch() || + (originAliasSuffix2 != GetAliasSuffix2() && not data->IsUnique(path2.GetAlias())) || + path1.GetAlias() == path2.GetAlias())) + { + flagAlias2 = false; + ChangeColor(ui->labelAlias2, errorColor); + } + else + { flagAlias2 = true; ChangeColor(ui->labelAlias2, OkColor(this)); } @@ -338,7 +329,8 @@ QString DialogCutSplinePath::GetNotes() const //--------------------------------------------------------------------------------------------------------------------- void DialogCutSplinePath::SetAliasSuffix1(const QString &alias) { - ui->lineEditAlias1->setText(alias); + originAliasSuffix1 = alias; + ui->lineEditAlias1->setText(originAliasSuffix1); ValidateAlias(); } @@ -351,7 +343,8 @@ QString DialogCutSplinePath::GetAliasSuffix1() const //--------------------------------------------------------------------------------------------------------------------- void DialogCutSplinePath::SetAliasSuffix2(const QString &alias) { - ui->lineEditAlias2->setText(alias); + originAliasSuffix2 = alias; + ui->lineEditAlias2->setText(originAliasSuffix2); ValidateAlias(); } diff --git a/src/libs/vtools/dialogs/tools/dialogcutsplinepath.h b/src/libs/vtools/dialogs/tools/dialogcutsplinepath.h index 5963e82cf..41e132e31 100644 --- a/src/libs/vtools/dialogs/tools/dialogcutsplinepath.h +++ b/src/libs/vtools/dialogs/tools/dialogcutsplinepath.h @@ -108,6 +108,9 @@ private: bool flagName; bool flagAlias1{true}; bool flagAlias2{true}; + + QString originAliasSuffix1{}; + QString originAliasSuffix2{}; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/dialogs/tools/dialogellipticalarc.cpp b/src/libs/vtools/dialogs/tools/dialogellipticalarc.cpp index 058913369..9ec1af735 100644 --- a/src/libs/vtools/dialogs/tools/dialogellipticalarc.cpp +++ b/src/libs/vtools/dialogs/tools/dialogellipticalarc.cpp @@ -603,7 +603,8 @@ void DialogEllipticalArc::ValidateAlias() VEllipticalArc arc; arc.SetAliasSuffix(GetAliasSuffix()); if (not GetAliasSuffix().isEmpty() && - (not rx.match(arc.GetAlias()).hasMatch() || not data->IsUnique(arc.GetAlias()))) + (not rx.match(arc.GetAlias()).hasMatch() || + (originAliasSuffix != GetAliasSuffix() && not data->IsUnique(arc.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); @@ -632,7 +633,8 @@ QString DialogEllipticalArc::GetNotes() const //--------------------------------------------------------------------------------------------------------------------- void DialogEllipticalArc::SetAliasSuffix(const QString &alias) { - ui->lineEditAlias->setText(alias); + originAliasSuffix = alias; + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); } diff --git a/src/libs/vtools/dialogs/tools/dialogellipticalarc.h b/src/libs/vtools/dialogs/tools/dialogellipticalarc.h index 20338ff43..69d798775 100644 --- a/src/libs/vtools/dialogs/tools/dialogellipticalarc.h +++ b/src/libs/vtools/dialogs/tools/dialogellipticalarc.h @@ -173,6 +173,8 @@ private: qreal angleF2; qreal angleRotation; + QString originAliasSuffix{}; + void EvalRadiuses(); void EvalAngles(); }; diff --git a/src/libs/vtools/dialogs/tools/dialogflippingbyaxis.cpp b/src/libs/vtools/dialogs/tools/dialogflippingbyaxis.cpp index 0f5d6d7d6..9cb7a6c04 100644 --- a/src/libs/vtools/dialogs/tools/dialogflippingbyaxis.cpp +++ b/src/libs/vtools/dialogs/tools/dialogflippingbyaxis.cpp @@ -64,7 +64,6 @@ DialogFlippingByAxis::DialogFlippingByAxis(const VContainer *data, quint32 toolId, QWidget *parent) : DialogTool(data, toolId, parent), ui(new Ui::DialogFlippingByAxis), - objects(), stage1(true), m_suffix(), flagName(true), @@ -87,6 +86,9 @@ DialogFlippingByAxis::DialogFlippingByAxis(const VContainer *data, quint32 toolI connect(ui->comboBoxOriginPoint, &QComboBox::currentTextChanged, this, &DialogFlippingByAxis::PointChanged); + connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogFlippingByAxis::ShowSourceDetails); + connect(ui->lineEditAlias, &QLineEdit::textEdited, this, &DialogFlippingByAxis::AliasChanged); + vis = new VisToolFlippingByAxis(data); ui->tabWidget->setCurrentIndex(0); @@ -147,12 +149,6 @@ void DialogFlippingByAxis::SetSuffix(const QString &value) ui->lineEditSuffix->setText(value); } -//--------------------------------------------------------------------------------------------------------------------- -QVector DialogFlippingByAxis::GetObjects() const -{ - return ConvertToVector(objects); -} - //--------------------------------------------------------------------------------------------------------------------- QString DialogFlippingByAxis::GetVisibilityGroupName() const { @@ -201,7 +197,7 @@ void DialogFlippingByAxis::ShowDialog(bool click) { if (stage1 && not click) { - if (objects.isEmpty()) + if (sourceObjects.isEmpty()) { return; } @@ -214,7 +210,7 @@ void DialogFlippingByAxis::ShowDialog(bool click) VisToolFlippingByAxis *operation = qobject_cast(vis); SCASSERT(operation != nullptr) - operation->SetObjects(ConvertToVector(objects)); + operation->SetObjects(SourceToObjects(sourceObjects)); operation->VisualMode(); scene->ToggleArcSelection(false); @@ -229,6 +225,8 @@ void DialogFlippingByAxis::ShowDialog(bool click) qApp->getSceneView()->AllowRubberBand(false); + FillSourceList(); + emit ToolTip(tr("Select origin point")); } else if (not stage1 && prepare && click) @@ -240,6 +238,19 @@ void DialogFlippingByAxis::ShowDialog(bool click) } } +//--------------------------------------------------------------------------------------------------------------------- +QVector DialogFlippingByAxis::GetSourceObjects() const +{ + return sourceObjects; +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogFlippingByAxis::SetSourceObjects(const QVector &value) +{ + sourceObjects = value; + FillSourceList(); +} + //--------------------------------------------------------------------------------------------------------------------- void DialogFlippingByAxis::ChosenObject(quint32 id, const SceneObject &type) { @@ -247,7 +258,10 @@ void DialogFlippingByAxis::ChosenObject(quint32 id, const SceneObject &type) { if (type == SceneObject::Point) { - if (objects.contains(id)) + auto obj = std::find_if(sourceObjects.begin(), sourceObjects.end(), + [id](const SourceItem &sItem) { return sItem.id == id; }); + + if (obj != sourceObjects.end()) { emit ToolTip(tr("Select origin point that is not part of the list of objects")); return; @@ -272,16 +286,23 @@ void DialogFlippingByAxis::SelectedObject(bool selected, quint32 object, quint32 Q_UNUSED(tool) if (stage1) { + auto obj = std::find_if(sourceObjects.begin(), sourceObjects.end(), + [object](const SourceItem &sItem) { return sItem.id == object; }); if (selected) { - if (not objects.contains(object)) + if (obj == sourceObjects.cend()) { - objects.append(object); + SourceItem item; + item.id = object; + sourceObjects.append(item); } } else { - objects.removeOne(object); + if (obj != sourceObjects.end()) + { + sourceObjects.erase(obj); + } } } } @@ -297,6 +318,7 @@ void DialogFlippingByAxis::SuffixChanged() { flagName = false; ChangeColor(ui->labelSuffix, errorColor); + ui->labelStatus->setText(tr("Invalid suffix")); CheckState(); return; } @@ -313,6 +335,7 @@ void DialogFlippingByAxis::SuffixChanged() { flagName = false; ChangeColor(ui->labelSuffix, errorColor); + ui->labelStatus->setText(tr("Invalid suffix")); CheckState(); return; } @@ -337,6 +360,7 @@ void DialogFlippingByAxis::GroupNameChanged() { flagGroupName = false; ChangeColor(ui->labelGroupName, errorColor); + ui->labelStatus->setText(tr("Invalid group name")); CheckState(); return; } @@ -347,6 +371,63 @@ void DialogFlippingByAxis::GroupNameChanged() CheckState(); } +//--------------------------------------------------------------------------------------------------------------------- +void DialogFlippingByAxis::ShowSourceDetails(int row) +{ + ui->lineEditAlias->setDisabled(true); + + if (ui->listWidget->count() == 0) + { + return; + } + + const auto sourceItem = qvariant_cast(ui->listWidget->item(row)->data(Qt::UserRole)); + + const QSharedPointer obj = data->GetGObject(sourceItem.id); + + ui->labelAlias->setText(obj->getType() == GOType::Point ? tr("Label:") : tr("Alias:")); + + ui->lineEditAlias->blockSignals(true); + ui->lineEditAlias->setText(sourceItem.alias); + ui->lineEditAlias->setEnabled(true); + ui->lineEditAlias->blockSignals(false); + + QRegularExpression rx(NameRegExp()); + if (not rx.match(sourceItem.alias).hasMatch() || not data->IsUnique(sourceItem.alias)) + { + flagAlias = false; + ChangeColor(ui->labelAlias, errorColor); + ui->labelStatus->setText(obj->getType() == GOType::Point ? tr("Invalid label") : tr("Invalid alias")); + CheckState(); + return; + } + else + { + flagAlias = true; + ChangeColor(ui->labelAlias, errorColor); + CheckState(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogFlippingByAxis::AliasChanged(const QString &text) +{ + if (ui->listWidget->count() == 0) + { + return; + } + + if (auto *item = ui->listWidget->currentItem()) + { + auto sourceItem = qvariant_cast(item->data(Qt::UserRole)); + sourceItem.alias = text; + + item->setData(Qt::UserRole, QVariant::fromValue(sourceItem)); + + ValidateSourceAliases(); + } +} + //--------------------------------------------------------------------------------------------------------------------- void DialogFlippingByAxis::ShowVisualization() { @@ -358,10 +439,22 @@ void DialogFlippingByAxis::SaveData() { m_suffix = ui->lineEditSuffix->text(); + sourceObjects.clear(); + sourceObjects.reserve(ui->listWidget->count()); + + for (int i=0; ilistWidget->count(); ++i) + { + if (const QListWidgetItem *item = ui->listWidget->item(i)) + { + auto sourceItem = qvariant_cast(item->data(Qt::UserRole)); + sourceObjects.append(sourceItem); + } + } + VisToolFlippingByAxis *operation = qobject_cast(vis); SCASSERT(operation != nullptr) - operation->SetObjects(ConvertToVector(objects)); + operation->SetObjects(SourceToObjects(sourceObjects)); operation->SetOriginPointId(GetOriginPointId()); operation->SetAxisType(GetAxisType()); operation->RefreshGeometry(); @@ -383,9 +476,13 @@ void DialogFlippingByAxis::SaveData() void DialogFlippingByAxis::PointChanged() { QColor color; - if (objects.contains(getCurrentObjectId(ui->comboBoxOriginPoint))) + quint32 id = getCurrentObjectId(ui->comboBoxOriginPoint); + auto obj = std::find_if(sourceObjects.begin(), sourceObjects.end(), + [id](const SourceItem &sItem) { return sItem.id == id; }); + if (obj != sourceObjects.end()) { flagError = false; + ui->labelStatus->setText(tr("Invalid point")); color = errorColor; } else @@ -406,6 +503,73 @@ void DialogFlippingByAxis::FillComboBoxAxisType(QComboBox *box) box->addItem(tr("Horizontal axis"), QVariant(static_cast(AxisType::HorizontalAxis))); } +//--------------------------------------------------------------------------------------------------------------------- +void DialogFlippingByAxis::FillSourceList() +{ + ui->listWidget->blockSignals(true); + + ui->listWidget->clear(); + + int row = -1; + + for (auto &sourceItem : sourceObjects) + { + const QSharedPointer obj = data->GetGObject(sourceItem.id); + + auto *item = new QListWidgetItem(obj->ObjectName()); + item->setToolTip(obj->ObjectName()); + item->setData(Qt::UserRole, QVariant::fromValue(sourceItem)); + ui->listWidget->insertItem(++row, item); + } + + ui->listWidget->blockSignals(false); + + if (ui->listWidget->count() > 0) + { + ui->listWidget->setCurrentRow(0); + } + + ValidateSourceAliases(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogFlippingByAxis::ValidateSourceAliases() +{ + QRegularExpression rx(NameRegExp()); + + for (int i=0; ilistWidget->count(); ++i) + { + if (const QListWidgetItem *item = ui->listWidget->item(i)) + { + auto sourceItem = qvariant_cast(item->data(Qt::UserRole)); + + const QSharedPointer obj = data->GetGObject(sourceItem.id); + + QString name; + + if (obj->getType() == GOType::Point) + { + name = sourceItem.alias; + } + else + { + const QString oldAlias = obj->GetAliasSuffix(); + obj->SetAliasSuffix(sourceItem.alias); + name = obj->GetAlias(); + obj->SetAliasSuffix(oldAlias); + } + + if (not rx.match(name).hasMatch() || not data->IsUnique(name)) + { + flagAlias = false; + ui->labelStatus->setText(obj->getType() == GOType::Point ? tr("Invalid label") : tr("Invalid alias")); + CheckState(); + return; + } + } + } +} + //--------------------------------------------------------------------------------------------------------------------- void DialogFlippingByAxis::SetNotes(const QString ¬es) { @@ -417,3 +581,16 @@ QString DialogFlippingByAxis::GetNotes() const { return ui->plainTextEditToolNotes->toPlainText(); } + +//--------------------------------------------------------------------------------------------------------------------- +bool DialogFlippingByAxis::IsValid() const +{ + bool ready = flagError && flagName && flagGroupName && flagAlias; + + if (ready) + { + ui->labelStatus->setText(tr("Ready")); + } + + return ready; +} diff --git a/src/libs/vtools/dialogs/tools/dialogspline.cpp b/src/libs/vtools/dialogs/tools/dialogspline.cpp index 9c8404846..a781a2bf6 100644 --- a/src/libs/vtools/dialogs/tools/dialogspline.cpp +++ b/src/libs/vtools/dialogs/tools/dialogspline.cpp @@ -439,10 +439,13 @@ void DialogSpline::EvalLength2() void DialogSpline::ValidateAlias() { QRegularExpression rx(NameRegExp()); + VSpline spline = spl; spline.SetAliasSuffix(ui->lineEditAlias->text()); + if (not ui->lineEditAlias->text().isEmpty() && - (not rx.match(spline.GetAlias()).hasMatch() || not data->IsUnique(spline.GetAlias()))) + (not rx.match(spline.GetAlias()).hasMatch() || + (originAliasSuffix != ui->lineEditAlias->text() && not data->IsUnique(spline.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); @@ -613,7 +616,8 @@ void DialogSpline::SetSpline(const VSpline &spline) ui->plainTextEditLength2F->setPlainText(length2F); ui->lineEditSplineName->setText(qApp->TrVars()->VarToUser(spl.name())); - ui->lineEditAlias->setText(spl.GetAliasSuffix()); + originAliasSuffix = spl.GetAliasSuffix(); + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); auto path = qobject_cast(vis); diff --git a/src/libs/vtools/dialogs/tools/dialogspline.h b/src/libs/vtools/dialogs/tools/dialogspline.h index c268cc825..92f40a14f 100644 --- a/src/libs/vtools/dialogs/tools/dialogspline.h +++ b/src/libs/vtools/dialogs/tools/dialogspline.h @@ -121,6 +121,8 @@ private: bool flagError; bool flagAlias{true}; + QString originAliasSuffix{}; + const QSharedPointer GetP1() const; const QSharedPointer GetP4() const; diff --git a/src/libs/vtools/dialogs/tools/dialogsplinepath.cpp b/src/libs/vtools/dialogs/tools/dialogsplinepath.cpp index b8637dddc..38340b41a 100644 --- a/src/libs/vtools/dialogs/tools/dialogsplinepath.cpp +++ b/src/libs/vtools/dialogs/tools/dialogsplinepath.cpp @@ -170,7 +170,8 @@ void DialogSplinePath::SetPath(const VSplinePath &value) ui->lineEditSplPathName->setText(qApp->TrVars()->VarToUser(path.name())); ui->doubleSpinBoxApproximationScale->setValue(path.GetApproximationScale()); - ui->lineEditAlias->setText(path.GetAliasSuffix()); + originAliasSuffix = path.GetAliasSuffix(); + ui->lineEditAlias->setText(originAliasSuffix); ValidateAlias(); ChangeCurrentData(ui->comboBoxPenStyle, path.GetPenStyle()); @@ -500,10 +501,13 @@ void DialogSplinePath::FXLength2() void DialogSplinePath::ValidateAlias() { QRegularExpression rx(NameRegExp()); + VSplinePath tempPath = path; tempPath.SetAliasSuffix(ui->lineEditAlias->text()); + if (not ui->lineEditAlias->text().isEmpty() && - (not rx.match(tempPath.GetAlias()).hasMatch() || not data->IsUnique(tempPath.GetAlias()))) + (not rx.match(tempPath.GetAlias()).hasMatch() || + (originAliasSuffix != ui->lineEditAlias->text() && not data->IsUnique(tempPath.GetAlias())))) { flagAlias = false; ChangeColor(ui->labelAlias, errorColor); diff --git a/src/libs/vtools/dialogs/tools/dialogsplinepath.h b/src/libs/vtools/dialogs/tools/dialogsplinepath.h index 6e6a58dd6..36f68bbea 100644 --- a/src/libs/vtools/dialogs/tools/dialogsplinepath.h +++ b/src/libs/vtools/dialogs/tools/dialogsplinepath.h @@ -115,6 +115,8 @@ private: bool flagError; bool flagAlias{true}; + QString originAliasSuffix{}; + void EvalAngle1(); void EvalAngle2(); void EvalLength1();