From 969dd163bf48a9c139341cd0713478597fc9d3dc Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 28 Oct 2017 19:21:47 +0300 Subject: [PATCH] Fix bug with spline's control point. Fix infinite redrawing. --HG-- branch : develop --- .../drawTools/toolcurve/vabstractspline.cpp | 54 +++++++++++++------ .../drawTools/toolcurve/vabstractspline.h | 2 + .../tools/drawTools/toolcurve/vtoolspline.cpp | 5 ++ .../drawTools/toolcurve/vtoolsplinepath.cpp | 5 ++ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.cpp b/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.cpp index 921c63211..ec29c8077 100644 --- a/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.cpp +++ b/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.cpp @@ -61,7 +61,8 @@ VAbstractSpline::VAbstractSpline(VAbstractPattern *doc, VContainer *data, quint3 controlPoints(), sceneType(SceneObject::Unknown), m_isHovered(false), - detailsMode(false) + detailsMode(false), + m_parentRefresh(false) { InitDefShape(); setAcceptHoverEvents(true); @@ -98,26 +99,39 @@ void VAbstractSpline::paint(QPainter *painter, const QStyleOptionGraphicsItem *o const QSharedPointer curve = VAbstractTool::data.GeometricObject(m_id); setPen(QPen(CorrectColor(this, curve->GetColor()), width, LineStyleToPenStyle(curve->GetPenStyle()), Qt::RoundCap)); - RefreshCtrlPoints(); - - if (m_isHovered || detailsMode) + auto PaintSpline = [this, curve](QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - painter->save(); + if (m_isHovered || detailsMode) + { + painter->save(); - QPen arrowPen(pen()); - arrowPen.setStyle(Qt::SolidLine); + QPen arrowPen(pen()); + arrowPen.setStyle(Qt::SolidLine); - painter->setPen(arrowPen); - painter->setBrush(brush()); + painter->setPen(arrowPen); + painter->setBrush(brush()); - painter->drawPath(VAbstractCurve::ShowDirection(curve->DirectionArrows(), - ScaleWidth(VAbstractCurve::lengthCurveDirectionArrow, - SceneScale(scene())))); + painter->drawPath(VAbstractCurve::ShowDirection(curve->DirectionArrows(), + ScaleWidth(VAbstractCurve::lengthCurveDirectionArrow, + SceneScale(scene())))); - painter->restore(); + painter->restore(); + } + + QGraphicsPathItem::paint(painter, option, widget); + }; + + if (not m_parentRefresh) + { + RefreshCtrlPoints(); + m_parentRefresh = true; + PaintSpline(painter, option, widget); + } + else + { + m_parentRefresh = false; + PaintSpline(painter, option, widget); } - - QGraphicsPathItem::paint(painter, option, widget); } //--------------------------------------------------------------------------------------------------------------------- @@ -156,12 +170,22 @@ void VAbstractSpline::DetailsMode(bool mode) void VAbstractSpline::AllowHover(bool enabled) { setAcceptHoverEvents(enabled); + + foreach (auto *point, controlPoints) + { + point->setAcceptHoverEvents(enabled); + } } //--------------------------------------------------------------------------------------------------------------------- void VAbstractSpline::AllowSelecting(bool enabled) { setFlag(QGraphicsItem::ItemIsSelectable, enabled); + + foreach (auto *point, controlPoints) + { + point->setFlag(QGraphicsItem::ItemIsSelectable, enabled); + } } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.h b/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.h index 43ccb5c95..a94e98a83 100644 --- a/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.h +++ b/src/libs/vtools/tools/drawTools/toolcurve/vabstractspline.h @@ -148,6 +148,8 @@ protected: private: Q_DISABLE_COPY(VAbstractSpline) + bool m_parentRefresh; + void InitDefShape(); }; diff --git a/src/libs/vtools/tools/drawTools/toolcurve/vtoolspline.cpp b/src/libs/vtools/tools/drawTools/toolcurve/vtoolspline.cpp index 641c2794c..a7b8759b9 100644 --- a/src/libs/vtools/tools/drawTools/toolcurve/vtoolspline.cpp +++ b/src/libs/vtools/tools/drawTools/toolcurve/vtoolspline.cpp @@ -296,6 +296,11 @@ void VToolSpline::ControlPointChangePosition(const qint32 &indexSpline, const Sp void VToolSpline::EnableToolMove(bool move) { this->setFlag(QGraphicsItem::ItemIsMovable, move); + + foreach (auto *point, controlPoints) + { + point->setFlag(QGraphicsItem::ItemIsMovable, move); + } } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp b/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp index 1cc7e5afc..a43836bf1 100644 --- a/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp +++ b/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp @@ -292,6 +292,11 @@ void VToolSplinePath::ControlPointChangePosition(const qint32 &indexSpline, cons void VToolSplinePath::EnableToolMove(bool move) { this->setFlag(QGraphicsItem::ItemIsMovable, move); + + foreach (auto *point, controlPoints) + { + point->setFlag(QGraphicsItem::ItemIsMovable, move); + } } //---------------------------------------------------------------------------------------------------------------------