From bff5462ef3b423b812ffcce6a3ca9782b68c6fa0 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 5 Nov 2016 15:27:19 +0200 Subject: [PATCH] Changes in dialog: reverse and internal move update the visualization automatically. --HG-- branch : feature --- .../dialogs/tools/dialogseamallowance.cpp | 103 +++++++++++------- .../dialogs/tools/dialogseamallowance.h | 1 + .../visualization/path/vistoolpiece.cpp | 38 ++++++- .../vtools/visualization/path/vistoolpiece.h | 2 + 4 files changed, 99 insertions(+), 45 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp b/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp index 52f02e3c3..34156dce2 100644 --- a/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp +++ b/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp @@ -52,6 +52,7 @@ DialogSeamAllowance::DialogSeamAllowance(const VContainer *data, const quint32 & ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->listWidget, &QListWidget::customContextMenuRequested, this, &DialogSeamAllowance::ShowContextMenu); + connect(ui->listWidget->model(), &QAbstractItemModel::rowsMoved, this, &DialogSeamAllowance::ListChanged); vis = new VisToolPiece(data); } @@ -97,50 +98,53 @@ void DialogSeamAllowance::SetPiece(const VPiece &piece) */ void DialogSeamAllowance::ChosenObject(quint32 id, const SceneObject &type) { - bool reverse = false; - if (QGuiApplication::keyboardModifiers() == Qt::ShiftModifier) + if (not prepare) { - reverse = true; - } - switch (type) - { - case SceneObject::Arc: - NewItem(VPieceNode(id, Tool::NodeArc, reverse)); - break; - case SceneObject::Point: - NewItem(VPieceNode(id, Tool::NodePoint)); - break; - case SceneObject::Spline: - NewItem(VPieceNode(id, Tool::NodeSpline, reverse)); - break; - case SceneObject::SplinePath: - NewItem(VPieceNode(id, Tool::NodeSplinePath, reverse)); - break; - case (SceneObject::Line): - case (SceneObject::Detail): - case (SceneObject::Unknown): - default: - qDebug() << "Got wrong scene object. Ignore."; - break; - } + bool reverse = false; + if (QGuiApplication::keyboardModifiers() == Qt::ShiftModifier) + { + reverse = true; + } + switch (type) + { + case SceneObject::Arc: + NewItem(VPieceNode(id, Tool::NodeArc, reverse)); + break; + case SceneObject::Point: + NewItem(VPieceNode(id, Tool::NodePoint)); + break; + case SceneObject::Spline: + NewItem(VPieceNode(id, Tool::NodeSpline, reverse)); + break; + case SceneObject::SplinePath: + NewItem(VPieceNode(id, Tool::NodeSplinePath, reverse)); + break; + case (SceneObject::Line): + case (SceneObject::Detail): + case (SceneObject::Unknown): + default: + qDebug() << "Got wrong scene object. Ignore."; + break; + } - ValidObjects(MainPathIsValid()); + ValidObjects(MainPathIsValid()); - auto visPath = qobject_cast(vis); - SCASSERT(visPath != nullptr); - const VPiece p = CreatePiece(); - visPath->SetPiece(p); + auto visPath = qobject_cast(vis); + SCASSERT(visPath != nullptr); + const VPiece p = CreatePiece(); + visPath->SetPiece(p); - if (p.CountNode() == 1) - { - emit ToolTip(tr("Select main path objects clockwise, Shift - reverse direction curve, " - "Enter - finish creation")); + if (p.CountNode() == 1) + { + emit ToolTip(tr("Select main path objects clockwise, Shift - reverse direction curve, " + "Enter - finish creation")); - visPath->VisualMode(NULL_ID); - } - else - { - visPath->RefreshGeometry(); + visPath->VisualMode(NULL_ID); + } + else + { + visPath->RefreshGeometry(); + } } } @@ -150,7 +154,15 @@ void DialogSeamAllowance::ShowDialog(bool click) if (click == false) { emit ToolTip(""); - setModal(true); + prepare = true; + + auto visPath = qobject_cast(vis); + SCASSERT(visPath != nullptr); + visPath->SetMode(Mode::Show); + visPath->RefreshGeometry(); + + // Fix issue #526. Dialog Detail is not on top after selection second object on Mac. + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); show(); } } @@ -211,6 +223,17 @@ void DialogSeamAllowance::ShowContextMenu(const QPoint &pos) rowItem->setText(GetNodeName(rowNode)); ValidObjects(MainPathIsValid()); } + + ListChanged(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogSeamAllowance::ListChanged() +{ + auto visPath = qobject_cast(vis); + SCASSERT(visPath != nullptr); + visPath->SetPiece(CreatePiece()); + visPath->RefreshGeometry(); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/dialogs/tools/dialogseamallowance.h b/src/libs/vtools/dialogs/tools/dialogseamallowance.h index c9134338a..5657147a5 100644 --- a/src/libs/vtools/dialogs/tools/dialogseamallowance.h +++ b/src/libs/vtools/dialogs/tools/dialogseamallowance.h @@ -61,6 +61,7 @@ protected: private slots: void ShowContextMenu(const QPoint &pos); + void ListChanged(); private: Q_DISABLE_COPY(DialogSeamAllowance) diff --git a/src/libs/vtools/visualization/path/vistoolpiece.cpp b/src/libs/vtools/visualization/path/vistoolpiece.cpp index 3ae7e9b14..f085d8e59 100644 --- a/src/libs/vtools/visualization/path/vistoolpiece.cpp +++ b/src/libs/vtools/visualization/path/vistoolpiece.cpp @@ -47,6 +47,8 @@ VisToolPiece::~VisToolPiece() //--------------------------------------------------------------------------------------------------------------------- void VisToolPiece::RefreshGeometry() { + HideAllItems(); + if (m_piece.CountNode() > 0) { DrawPath(this, m_piece.MainPathPath(Visualization::data), mainColor, Qt::SolidLine, Qt::RoundCap); @@ -59,12 +61,15 @@ void VisToolPiece::RefreshGeometry() DrawPoint(point, nodes.at(i), supportColor); } - const QVector points = m_piece.MainPathPoints(Visualization::data); - DrawLine(m_line1, QLineF(points.first(), Visualization::scenePos), supportColor, Qt::DashLine); - - if (points.size() > 1) + if (mode == Mode::Creation) { - DrawLine(m_line2, QLineF(points.last(), Visualization::scenePos), supportColor, Qt::DashLine); + const QVector points = m_piece.MainPathPoints(Visualization::data); + DrawLine(m_line1, QLineF(points.first(), Visualization::scenePos), supportColor, Qt::DashLine); + + if (points.size() > 1) + { + DrawLine(m_line2, QLineF(points.last(), Visualization::scenePos), supportColor, Qt::DashLine); + } } } } @@ -80,3 +85,26 @@ QGraphicsEllipseItem *VisToolPiece::GetPoint(quint32 i, const QColor &color) { return GetPointItem(Visualization::data, factor, m_points, i, color, this); } + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPiece::HideAllItems() +{ + if (m_line1) + { + m_line1->setVisible(false); + } + + if (m_line2) + { + m_line2->setVisible(false); + } + + QVector m_points; + for (int i=0; i < m_points.size(); ++i) + { + if (QGraphicsEllipseItem *item = m_points.at(i)) + { + item->setVisible(false); + } + } +} diff --git a/src/libs/vtools/visualization/path/vistoolpiece.h b/src/libs/vtools/visualization/path/vistoolpiece.h index f647924a2..a9071d5e4 100644 --- a/src/libs/vtools/visualization/path/vistoolpiece.h +++ b/src/libs/vtools/visualization/path/vistoolpiece.h @@ -55,6 +55,8 @@ private: VPiece m_piece; QGraphicsEllipseItem* GetPoint(quint32 i, const QColor &color); + + void HideAllItems(); }; #endif // VISTOOLPIECE_H