From ccc8da800fb54474dd366e72ff4692b262f628f3 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Wed, 18 Jan 2017 12:22:02 +0200 Subject: [PATCH] Pieces should disappear from the list when deleted. --HG-- branch : feature --- src/libs/ifc/xml/vabstractpattern.cpp | 10 ++++++++-- src/libs/ifc/xml/vabstractpattern.h | 5 +++-- src/libs/vpatterndb/vcontainer.cpp | 6 ++++++ src/libs/vpatterndb/vcontainer.h | 1 + src/libs/vtools/tools/vtoolseamallowance.cpp | 17 +++++++++++++++++ src/libs/vtools/tools/vtooluniondetails.cpp | 3 +++ 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/libs/ifc/xml/vabstractpattern.cpp b/src/libs/ifc/xml/vabstractpattern.cpp index ed68e62a0..f51ea8eaf 100644 --- a/src/libs/ifc/xml/vabstractpattern.cpp +++ b/src/libs/ifc/xml/vabstractpattern.cpp @@ -544,7 +544,7 @@ void VAbstractPattern::setCursor(const quint32 &value) * @param id tool id. * @return tool. */ -VDataTool *VAbstractPattern::getTool(const quint32 &id) +VDataTool *VAbstractPattern::getTool(quint32 id) { ToolExists(id); return tools.value(id); @@ -556,13 +556,19 @@ VDataTool *VAbstractPattern::getTool(const quint32 &id) * @param id tool id. * @param tool tool. */ -void VAbstractPattern::AddTool(const quint32 &id, VDataTool *tool) +void VAbstractPattern::AddTool(quint32 id, VDataTool *tool) { Q_ASSERT_X(id != 0, Q_FUNC_INFO, "id == 0"); SCASSERT(tool != nullptr) tools.insert(id, tool); } +//--------------------------------------------------------------------------------------------------------------------- +void VAbstractPattern::RemoveTool(quint32 id) +{ + tools.remove(id); +} + //--------------------------------------------------------------------------------------------------------------------- VPiecePath VAbstractPattern::ParsePieceNodes(const QDomElement &domElement) { diff --git a/src/libs/ifc/xml/vabstractpattern.h b/src/libs/ifc/xml/vabstractpattern.h index 83961b81e..e0237101d 100644 --- a/src/libs/ifc/xml/vabstractpattern.h +++ b/src/libs/ifc/xml/vabstractpattern.h @@ -92,8 +92,9 @@ public: virtual void UpdateToolData(const quint32 &id, VContainer *data)=0; - static VDataTool* getTool(const quint32 &id); - static void AddTool(const quint32 &id, VDataTool *tool); + static VDataTool* getTool(quint32 id); + static void AddTool(quint32 id, VDataTool *tool); + static void RemoveTool(quint32 id); static VPiecePath ParsePieceNodes(const QDomElement &domElement); static QVector ParsePieceCSARecords(const QDomElement &domElement); diff --git a/src/libs/vpatterndb/vcontainer.cpp b/src/libs/vpatterndb/vcontainer.cpp index db7efea75..5cc5a26ef 100644 --- a/src/libs/vpatterndb/vcontainer.cpp +++ b/src/libs/vpatterndb/vcontainer.cpp @@ -519,6 +519,12 @@ void VContainer::RemoveVariable(const QString &name) d->variables.remove(name); } +//--------------------------------------------------------------------------------------------------------------------- +void VContainer::RemovePiece(quint32 id) +{ + d->pieces->remove(id); +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief AddObject add object to container diff --git a/src/libs/vpatterndb/vcontainer.h b/src/libs/vpatterndb/vcontainer.h index aeeacb164..070ef4434 100644 --- a/src/libs/vpatterndb/vcontainer.h +++ b/src/libs/vpatterndb/vcontainer.h @@ -168,6 +168,7 @@ public: template void AddVariable(const QString& name, T *var); void RemoveVariable(const QString& name); + void RemovePiece(quint32 id); void UpdateGObject(quint32 id, VGObject* obj); void UpdateDetail(quint32 id, const VDetail &detail); diff --git a/src/libs/vtools/tools/vtoolseamallowance.cpp b/src/libs/vtools/tools/vtoolseamallowance.cpp index be6b1c712..6fa1fbb01 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.cpp +++ b/src/libs/vtools/tools/vtoolseamallowance.cpp @@ -1140,6 +1140,23 @@ void VToolSeamAllowance::DeleteTool(bool ask) /* If UnionDetails tool delete detail no need emit FullParsing.*/ connect(delDet, &DeletePiece::NeedFullParsing, doc, &VAbstractPattern::NeedFullParsing); } + + // If UnionDetails tool delete the detail this object will be deleted only after full parse. + // Deleting inside UnionDetails cause crash. + // Because this object should be inactive from no one we disconnect all signals that may cause a crash + // KEEP THIS LIST ACTUALL!!! + disconnect(doc, 0, this, 0); + if (QGraphicsScene *toolScene = scene()) + { + disconnect(toolScene, 0, this, 0); + } + disconnect(m_dataLabel, 0, this, 0); + disconnect(m_patternInfo, 0, this, 0); + disconnect(m_grainLine, 0, this, 0); + disconnect(m_sceneDetails, 0, this, 0); + + hide();// User shouldn't see this object + qApp->getUndoStack()->push(delDet); // Throw exception, this will help prevent case when we forget to immediately quit function. diff --git a/src/libs/vtools/tools/vtooluniondetails.cpp b/src/libs/vtools/tools/vtooluniondetails.cpp index 9cd040617..b5768ab8c 100644 --- a/src/libs/vtools/tools/vtooluniondetails.cpp +++ b/src/libs/vtools/tools/vtooluniondetails.cpp @@ -1194,6 +1194,9 @@ void CreateUnitedDetail(quint32 id, const VToolUnionDetailsInitData &initData, q SCASSERT(toolDet != nullptr); bool ask = false; toolDet->Remove(ask); + // We do not call full parse, so will need more to do more cleaning than usually + initData.doc->RemoveTool(id); + initData.data->RemovePiece(id); }; if (not initData.retainPieces)