From fea9e5ed07384516039ff54bdf8901a404558ef6 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 8 Jun 2024 20:35:55 +0300 Subject: [PATCH] Fix crashing after a piece remove while rendering label. --- src/libs/vtools/tools/vtoolseamallowance.cpp | 10 +++++++++ src/libs/vtools/tools/vtoolseamallowance.h | 2 ++ src/libs/vtools/undocommands/addpiece.cpp | 1 + src/libs/vtools/undocommands/deletepiece.cpp | 23 ++++++++++---------- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/libs/vtools/tools/vtoolseamallowance.cpp b/src/libs/vtools/tools/vtoolseamallowance.cpp index 3512b54a5..ea4cd1467 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.cpp +++ b/src/libs/vtools/tools/vtoolseamallowance.cpp @@ -1346,6 +1346,16 @@ auto VToolSeamAllowance::shape() const -> QPainterPath return ItemShapeFromPath(m_mainPath, pen()); } +//--------------------------------------------------------------------------------------------------------------------- +void VToolSeamAllowance::CancelLabelRendering() +{ + m_patternUpdateInfoWatcher->cancel(); + m_pieceUpdateInfoWatcher->cancel(); + + m_patternUpdateInfoWatcher->waitForFinished(); + m_pieceUpdateInfoWatcher->waitForFinished(); +} + //--------------------------------------------------------------------------------------------------------------------- void VToolSeamAllowance::FullUpdateFromGuiApply() { diff --git a/src/libs/vtools/tools/vtoolseamallowance.h b/src/libs/vtools/tools/vtoolseamallowance.h index 070518d37..7553c20ab 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.h +++ b/src/libs/vtools/tools/vtoolseamallowance.h @@ -121,6 +121,8 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; auto boundingRect() const -> QRectF override; auto shape() const -> QPainterPath override; + + void CancelLabelRendering(); public slots: void FullUpdateFromGuiApply() override; void FullUpdateFromFile() override; diff --git a/src/libs/vtools/undocommands/addpiece.cpp b/src/libs/vtools/undocommands/addpiece.cpp index 7c21d7d78..8c38dc97c 100644 --- a/src/libs/vtools/undocommands/addpiece.cpp +++ b/src/libs/vtools/undocommands/addpiece.cpp @@ -75,6 +75,7 @@ void AddPiece::undo() SCASSERT(not m_tool.isNull()); m_tool->DisconnectOutsideSignals(); m_tool->hide(); + m_tool->CancelLabelRendering(); m_scene->removeItem(m_tool); diff --git a/src/libs/vtools/undocommands/deletepiece.cpp b/src/libs/vtools/undocommands/deletepiece.cpp index 3f9237c32..188f96b25 100644 --- a/src/libs/vtools/undocommands/deletepiece.cpp +++ b/src/libs/vtools/undocommands/deletepiece.cpp @@ -34,24 +34,24 @@ #include "../ifc/ifcdef.h" #include "../ifc/xml/vabstractpattern.h" #include "../ifc/xml/vdomdocument.h" -#include "../vmisc/def.h" #include "../tools/vdatatool.h" -#include "vundocommand.h" +#include "../vmisc/def.h" #include "../vpatterndb/vpiecenode.h" #include "../vpatterndb/vpiecepath.h" #include "../vwidgets/vmaingraphicsview.h" +#include "vundocommand.h" //--------------------------------------------------------------------------------------------------------------------- DeletePiece::DeletePiece(VAbstractPattern *doc, quint32 id, const VContainer &data, VMainGraphicsScene *scene, QUndoCommand *parent) - : VUndoCommand(QDomElement(), doc, parent), - m_parentNode(), - m_siblingId(NULL_ID), - m_detail(data.GetPiece(id)), - m_data(data), - m_scene(scene), - m_tool(), - m_record(VAbstractTool::GetRecord(id, Tool::Piece, doc)) + : VUndoCommand(QDomElement(), doc, parent), + m_parentNode(), + m_siblingId(NULL_ID), + m_detail(data.GetPiece(id)), + m_data(data), + m_scene(scene), + m_tool(), + m_record(VAbstractTool::GetRecord(id, Tool::Piece, doc)) { setText(tr("delete tool")); nodeId = id; @@ -117,11 +117,12 @@ void DeletePiece::redo() { m_parentNode.removeChild(domElement); - m_tool = qobject_cast(VAbstractPattern::getTool(nodeId)); + m_tool = qobject_cast(VAbstractPattern::getTool(nodeId)); SCASSERT(not m_tool.isNull()); m_tool->DisconnectOutsideSignals(); m_tool->EnableToolMove(true); m_tool->hide(); + m_tool->CancelLabelRendering(); m_scene->removeItem(m_tool);