From 9414c8c426c1339f5e3c716f80f5fd3c4b180cfa Mon Sep 17 00:00:00 2001 From: xypwn Date: Sat, 28 Mar 2020 11:15:04 +0100 Subject: [PATCH] Fix bug where undoing+redoing AddWire multiple times crashes --- CircuitBuffer.cpp | 4 ++-- Connector.cpp | 5 +++++ Connector.h | 4 +++- FileHandler.cpp | 4 ++-- Part.cpp | 10 ++++++++++ Part.h | 6 +++++- Wire.h | 2 +- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/CircuitBuffer.cpp b/CircuitBuffer.cpp index a859632..f7b2ec8 100644 --- a/CircuitBuffer.cpp +++ b/CircuitBuffer.cpp @@ -35,8 +35,8 @@ void CircuitBuffer::addFromScene(const QList &parts, const QList& } for(auto wire : wires) { - auto wireInputPart = (Part*)wire->m_connectorInput->parentItem(); - auto wireOutputPart = (Part*)wire->m_connectorOutput->parentItem(); + auto wireInputPart = wire->m_connectorInput->parentPart(); + auto wireOutputPart = wire->m_connectorOutput->parentPart(); // Create wireData WireData wireData; diff --git a/Connector.cpp b/Connector.cpp index 5ecd60f..15080de 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -17,6 +17,11 @@ Connector::Connector(Scene* scene, Part *parentPart, ConnectorType::ConnectorTyp setFlag(QGraphicsItem::ItemSendsScenePositionChanges); } +Part* Connector::parentPart() +{ + return (Part*)parentItem(); +} + QRectF Connector::boundingRect() const { if(m_connectorType == ConnectorType::Output) diff --git a/Connector.h b/Connector.h index 09a8841..14b4348 100644 --- a/Connector.h +++ b/Connector.h @@ -9,7 +9,7 @@ class Part; class Wire; class Scene; -class Connector : public QGraphicsItem +class Connector : private QGraphicsItem { public: friend class Scene; @@ -24,6 +24,8 @@ public: Connector(Scene* scene, Part *parentPart, ConnectorType::ConnectorType side); + Part* parentPart(); + QRectF boundingRect() const override; // For drawing QPainterPath shape() const override; // For selection ("Hitbox") void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; diff --git a/FileHandler.cpp b/FileHandler.cpp index 4ff8b8b..5fd422b 100644 --- a/FileHandler.cpp +++ b/FileHandler.cpp @@ -52,8 +52,8 @@ bool FileHandler::save(QString filename) fOut << "[wires]\n"; for(auto wire : m_logic->m_wires) { - auto wireInputPart = (Part*)wire->m_connectorInput->parentItem(); - auto wireOutputPart = (Part*)wire->m_connectorOutput->parentItem(); + auto wireInputPart = wire->m_connectorInput->parentPart(); + auto wireOutputPart = wire->m_connectorOutput->parentPart(); fOut << wireInputPart << " " << wireInputPart->m_outputs.indexOf(wire->m_connectorInput) << " " << wireOutputPart << " " << wireOutputPart->m_inputs.indexOf(wire->m_connectorOutput) << "\n"; } diff --git a/Part.cpp b/Part.cpp index ac6cc29..49a496d 100644 --- a/Part.cpp +++ b/Part.cpp @@ -34,6 +34,16 @@ PartType::PartType Part::partType() return m_partType; } +QPointF Part::getPos() const +{ + return pos(); +} + +void Part::setPos(QPointF pos) +{ + QGraphicsItem::setPos(pos); +} + void Part::addInputs(int amount) { for(int i = 0; i < amount; i++) diff --git a/Part.h b/Part.h index 5a70a88..2320406 100644 --- a/Part.h +++ b/Part.h @@ -9,7 +9,7 @@ class Connector; class Logic; -class Part : public QGraphicsItem +class Part : protected QGraphicsItem { public: friend class Connector; @@ -17,6 +17,7 @@ public: friend class Logic; friend class AddPart; friend class RemoveParts; + friend class AddWire; friend class RemoveWire; friend class CopyParts; @@ -45,6 +46,9 @@ public: PartType::PartType partType(); + QPointF getPos() const; + void setPos(QPointF pos); + void addInputs(int amount); void addOutputs(int amount); diff --git a/Wire.h b/Wire.h index ee63853..fd0fd29 100644 --- a/Wire.h +++ b/Wire.h @@ -6,7 +6,7 @@ class Connector; class Scene; -class Wire : public QGraphicsLineItem +class Wire : private QGraphicsLineItem { public: friend class Connector;