From b81614d1a16c6e06db200580c24654271b7c4a0d Mon Sep 17 00:00:00 2001 From: dismine Date: Sat, 4 Oct 2014 22:12:46 +0300 Subject: [PATCH] Fixed crash after detele tool. --HG-- branch : develop --- src/app/mainwindow.cpp | 2 +- src/app/tools/drawTools/vabstractspline.cpp | 2 +- src/app/tools/drawTools/vdrawtool.cpp | 4 ++-- src/app/tools/drawTools/vdrawtool.h | 3 ++- src/app/tools/drawTools/vtoolendline.cpp | 4 ++++ src/app/tools/drawTools/vtoolendline.h | 1 + src/app/tools/drawTools/vtoolline.cpp | 2 +- src/app/tools/drawTools/vtoollinepoint.cpp | 6 ++++++ src/app/tools/drawTools/vtoollinepoint.h | 1 + src/app/tools/drawTools/vtoolpoint.cpp | 6 +++++- src/app/tools/drawTools/vtoolpoint.h | 2 +- src/app/tools/vdatatool.cpp | 4 ++++ src/app/tools/vdatatool.h | 2 +- src/app/tools/vtooldetail.cpp | 3 ++- src/app/widgets/vmaingraphicsview.cpp | 12 ++++++------ src/app/widgets/vmaingraphicsview.h | 4 ++++ src/app/xml/vpattern.cpp | 4 ++-- 17 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index fea132871..2edf922ae 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -2091,12 +2091,12 @@ QString MainWindow::PatternPieceName(const QString &text) MainWindow::~MainWindow() { CancelTool(); - delete ui; delete pattern; delete doc; delete sceneDetails; delete sceneDraw; + delete ui; } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/tools/drawTools/vabstractspline.cpp b/src/app/tools/drawTools/vabstractspline.cpp index 72ed12980..aa6efbe7e 100644 --- a/src/app/tools/drawTools/vabstractspline.cpp +++ b/src/app/tools/drawTools/vabstractspline.cpp @@ -180,7 +180,7 @@ void VAbstractSpline::keyReleaseEvent(QKeyEvent *event) { case Qt::Key_Delete: DeleteTool(); - break; + return; //Leave this method immediately after call!!! default: break; } diff --git a/src/app/tools/drawTools/vdrawtool.cpp b/src/app/tools/drawTools/vdrawtool.cpp index e0f059c45..af98089a4 100644 --- a/src/app/tools/drawTools/vdrawtool.cpp +++ b/src/app/tools/drawTools/vdrawtool.cpp @@ -45,8 +45,8 @@ qreal VDrawTool::factor = 1; * @param data container with variables. * @param id object id in container. */ -VDrawTool::VDrawTool(VPattern *doc, VContainer *data, quint32 id) - :VAbstractTool(doc, data, id), ignoreFullUpdate(false), +VDrawTool::VDrawTool(VPattern *doc, VContainer *data, quint32 id, QObject *parent) + :VAbstractTool(doc, data, id, parent), ignoreFullUpdate(false), nameActivDraw(doc->GetNameActivPP()), dialog(nullptr) { connect(this->doc, &VPattern::ChangedActivPP, this, &VDrawTool::ChangedActivDraw); diff --git a/src/app/tools/drawTools/vdrawtool.h b/src/app/tools/drawTools/vdrawtool.h index 86e6f83ce..a685b8bfc 100644 --- a/src/app/tools/drawTools/vdrawtool.h +++ b/src/app/tools/drawTools/vdrawtool.h @@ -45,7 +45,7 @@ class VDrawTool : public VAbstractTool Q_OBJECT public: - VDrawTool(VPattern *doc, VContainer *data, quint32 id); + VDrawTool(VPattern *doc, VContainer *data, quint32 id, QObject *parent = nullptr); virtual ~VDrawTool(); /** @brief factor scene scale factor. */ @@ -134,6 +134,7 @@ protected: if (selectedAction == actionRemove) { DeleteTool(); + return; //Leave this method immediately after call!!! } } template diff --git a/src/app/tools/drawTools/vtoolendline.cpp b/src/app/tools/drawTools/vtoolendline.cpp index cf694af92..f0fe12ef8 100644 --- a/src/app/tools/drawTools/vtoolendline.cpp +++ b/src/app/tools/drawTools/vtoolendline.cpp @@ -64,6 +64,10 @@ VToolEndLine::VToolEndLine(VPattern *doc, VContainer *data, const quint32 &id, } } +//--------------------------------------------------------------------------------------------------------------------- +VToolEndLine::~VToolEndLine() +{} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief setDialog set dialog when user want change tool option. diff --git a/src/app/tools/drawTools/vtoolendline.h b/src/app/tools/drawTools/vtoolendline.h index 794f51cfe..b60014931 100644 --- a/src/app/tools/drawTools/vtoolendline.h +++ b/src/app/tools/drawTools/vtoolendline.h @@ -42,6 +42,7 @@ public: VToolEndLine(VPattern *doc, VContainer *data, const quint32 &id, const QString &typeLine, const QString &formulaLength, const QString &formulaAngle, const quint32 &basePointId, const Source &typeCreation, QGraphicsItem * parent = nullptr); + virtual ~VToolEndLine(); virtual void setDialog(); static VToolEndLine *Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data); static VToolEndLine *Create(const quint32 _id, const QString &pointName, const QString &typeLine, diff --git a/src/app/tools/drawTools/vtoolline.cpp b/src/app/tools/drawTools/vtoolline.cpp index 94ec22533..2c0f98912 100644 --- a/src/app/tools/drawTools/vtoolline.cpp +++ b/src/app/tools/drawTools/vtoolline.cpp @@ -350,7 +350,7 @@ void VToolLine::keyReleaseEvent(QKeyEvent *event) { case Qt::Key_Delete: DeleteTool(); - break; + return; //Leave this method immediately after call!!! default: break; } diff --git a/src/app/tools/drawTools/vtoollinepoint.cpp b/src/app/tools/drawTools/vtoollinepoint.cpp index 59fd9742d..67983917c 100644 --- a/src/app/tools/drawTools/vtoollinepoint.cpp +++ b/src/app/tools/drawTools/vtoollinepoint.cpp @@ -56,6 +56,12 @@ VToolLinePoint::VToolLinePoint(VPattern *doc, VContainer *data, const quint32 &i mainLine->setFlag(QGraphicsItem::ItemStacksBehindParent, true); } +//--------------------------------------------------------------------------------------------------------------------- +VToolLinePoint::~VToolLinePoint() +{ + delete mainLine; +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief ChangedActivDraw disable or enable context menu after change active pattern peace. diff --git a/src/app/tools/drawTools/vtoollinepoint.h b/src/app/tools/drawTools/vtoollinepoint.h index dc77b5962..3c29e248e 100644 --- a/src/app/tools/drawTools/vtoollinepoint.h +++ b/src/app/tools/drawTools/vtoollinepoint.h @@ -41,6 +41,7 @@ class VToolLinePoint : public VToolPoint public: VToolLinePoint(VPattern *doc, VContainer *data, const quint32 &id, const QString &typeLine, const QString &formula, const quint32 &basePointId, const qreal &angle, QGraphicsItem * parent = nullptr); + virtual ~VToolLinePoint(); virtual int type() const {return Type;} enum { Type = UserType + static_cast(Tool::LinePoint)}; VFormula getFormulaLength() const; diff --git a/src/app/tools/drawTools/vtoolpoint.cpp b/src/app/tools/drawTools/vtoolpoint.cpp index 9e71bb664..c22bea1dc 100644 --- a/src/app/tools/drawTools/vtoolpoint.cpp +++ b/src/app/tools/drawTools/vtoolpoint.cpp @@ -59,6 +59,10 @@ VToolPoint::VToolPoint(VPattern *doc, VContainer *data, quint32 id, QGraphicsIte RefreshPointGeometry(*VAbstractTool::data.GeometricObject(id)); } +//--------------------------------------------------------------------------------------------------------------------- +VToolPoint::~VToolPoint() +{} + //--------------------------------------------------------------------------------------------------------------------- void VToolPoint::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { @@ -315,7 +319,7 @@ void VToolPoint::keyReleaseEvent(QKeyEvent *event) { case Qt::Key_Delete: DeleteTool(); - break; + return; //Leave this method immediately after call!!! default: break; } diff --git a/src/app/tools/drawTools/vtoolpoint.h b/src/app/tools/drawTools/vtoolpoint.h index 5c19d073a..bb3c18512 100644 --- a/src/app/tools/drawTools/vtoolpoint.h +++ b/src/app/tools/drawTools/vtoolpoint.h @@ -43,7 +43,7 @@ class VToolPoint: public VDrawTool, public QGraphicsEllipseItem Q_OBJECT public: VToolPoint(VPattern *doc, VContainer *data, quint32 id, QGraphicsItem * parent = nullptr); - virtual ~VToolPoint(){} + virtual ~VToolPoint(); virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0); QString name() const; void setName(const QString &name); diff --git a/src/app/tools/vdatatool.cpp b/src/app/tools/vdatatool.cpp index ae860dcf2..d3140287b 100644 --- a/src/app/tools/vdatatool.cpp +++ b/src/app/tools/vdatatool.cpp @@ -40,6 +40,10 @@ VDataTool::VDataTool(VContainer *data, QObject *parent) SCASSERT(data != nullptr); } +//--------------------------------------------------------------------------------------------------------------------- +VDataTool::~VDataTool() +{} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief operator = assignment operator. diff --git a/src/app/tools/vdatatool.h b/src/app/tools/vdatatool.h index 887a74fd2..562d6dcca 100644 --- a/src/app/tools/vdatatool.h +++ b/src/app/tools/vdatatool.h @@ -42,7 +42,7 @@ class VDataTool : public QObject Q_OBJECT public: VDataTool(VContainer *data, QObject *parent = nullptr); - virtual ~VDataTool(){} + virtual ~VDataTool(); VDataTool &operator= (const VDataTool &tool); VContainer getData() const; void setData(const VContainer *value); diff --git a/src/app/tools/vtooldetail.cpp b/src/app/tools/vtooldetail.cpp index 911e72894..66435ccd9 100644 --- a/src/app/tools/vtooldetail.cpp +++ b/src/app/tools/vtooldetail.cpp @@ -363,7 +363,7 @@ void VToolDetail::keyReleaseEvent(QKeyEvent *event) { case Qt::Key_Delete: DeleteTool(); - break; + return; //Leave this method immediately after call!!! default: break; } @@ -423,6 +423,7 @@ void VToolDetail::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) if (selectedAction == actionRemove) { DeleteTool(); + return; //Leave this method immediately after call!!! } } diff --git a/src/app/widgets/vmaingraphicsview.cpp b/src/app/widgets/vmaingraphicsview.cpp index 7ebf5e755..510fec8da 100644 --- a/src/app/widgets/vmaingraphicsview.cpp +++ b/src/app/widgets/vmaingraphicsview.cpp @@ -42,10 +42,14 @@ //--------------------------------------------------------------------------------------------------------------------- GraphicsViewZoom::GraphicsViewZoom(QGraphicsView* view) : QObject(view), _view(view), _modifiers(Qt::ControlModifier), _zoom_factor_base(1.0015), - target_scene_pos(QPointF()), target_viewport_pos(QPointF()), _numScheduledScalings(0) + target_scene_pos(QPointF()), target_viewport_pos(QPointF()), _numScheduledScalings(0), anim(nullptr) { _view->viewport()->installEventFilter(this); _view->setMouseTracking(true); + anim = new QTimeLine(300, this); + anim->setUpdateInterval(20); + connect(anim, &QTimeLine::valueChanged, this, &GraphicsViewZoom::scrollingTime, Qt::UniqueConnection); + connect(anim, &QTimeLine::finished, this, &GraphicsViewZoom::animFinished, Qt::UniqueConnection); } //--------------------------------------------------------------------------------------------------------------------- @@ -101,7 +105,7 @@ void GraphicsViewZoom::animFinished() { _numScheduledScalings++; } - sender()->~QObject(); + anim->stop(); } //--------------------------------------------------------------------------------------------------------------------- @@ -140,10 +144,6 @@ bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event) _numScheduledScalings = numSteps; // previously scheduled scalings } - QTimeLine *anim = new QTimeLine(300, this); - anim->setUpdateInterval(20); - connect(anim, &QTimeLine::valueChanged, this, &GraphicsViewZoom::scrollingTime); - connect(anim, &QTimeLine::finished, this, &GraphicsViewZoom::animFinished); anim->start(); return true; } diff --git a/src/app/widgets/vmaingraphicsview.h b/src/app/widgets/vmaingraphicsview.h index 17701efb9..706648197 100644 --- a/src/app/widgets/vmaingraphicsview.h +++ b/src/app/widgets/vmaingraphicsview.h @@ -62,6 +62,9 @@ * (see QWheelEvent::angleDelta). * The default zoom factor base is 1.0015. */ + +class QTimeLine; + class GraphicsViewZoom : public QObject { Q_OBJECT @@ -81,6 +84,7 @@ private: double _zoom_factor_base; QPointF target_scene_pos; QPointF target_viewport_pos; + QTimeLine *anim; bool eventFilter(QObject* object, QEvent* event); private: diff --git a/src/app/xml/vpattern.cpp b/src/app/xml/vpattern.cpp index 8717e3839..f16d60003 100644 --- a/src/app/xml/vpattern.cpp +++ b/src/app/xml/vpattern.cpp @@ -2448,11 +2448,11 @@ void VPattern::PrepareForParse(const Document &parse) if (parse == Document::FullParse) { TestUniqueId(); + sceneDraw->clear(); + sceneDetail->clear(); data->Clear(); UpdateMeasurements(); nameActivPP.clear(); - sceneDraw->clear(); - sceneDetail->clear(); patternPieces.clear(); tools.clear(); cursor = 0;