diff --git a/cockatrice/src/arrowitem.cpp b/cockatrice/src/arrowitem.cpp index 002bd2f1..8561678f 100644 --- a/cockatrice/src/arrowitem.cpp +++ b/cockatrice/src/arrowitem.cpp @@ -13,6 +13,7 @@ ArrowItem::ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTarget *_targetItem, const QColor &_color) : QGraphicsItem(), player(_player), id(_id), startItem(_startItem), targetItem(_targetItem), color(_color), fullColor(true) { + qDebug() << "ArrowItem constructor: startItem=" << startItem; setZValue(2000000005); if (startItem) @@ -62,6 +63,9 @@ void ArrowItem::updatePath(const QPointF &endPoint) const double headLength = headWidth / sqrt(2); const double phi = 15; + if (!startItem) + return; + QPointF startPoint = startItem->mapToScene(QPointF(startItem->boundingRect().width() / 2, startItem->boundingRect().height() / 2)); QLineF line(startPoint, endPoint); qreal lineLength = line.length(); @@ -141,6 +145,11 @@ void ArrowDragItem::addChildArrow(ArrowDragItem *childArrow) void ArrowDragItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + // This ensures that if a mouse move event happens after a call to delArrow(), + // the event will be discarded as it would create some stray pointers. + if (!startItem) + return; + QPointF endPos = event->scenePos(); QList colliding = scene()->items(endPos); @@ -177,6 +186,9 @@ void ArrowDragItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + if (!startItem) + return; + if (targetItem && (targetItem != startItem)) { CardZone *startZone = static_cast(startItem)->getZone(); // For now, we can safely assume that the start item is always a card. @@ -222,6 +234,9 @@ ArrowAttachItem::ArrowAttachItem(ArrowTarget *_startItem) void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + if (!startItem) + return; + QPointF endPos = event->scenePos(); QList colliding = scene()->items(endPos); @@ -249,6 +264,9 @@ void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) { + if (!startItem) + return; + if (targetItem && (targetItem != startItem)) { CardItem *startCard = qgraphicsitem_cast(startItem); CardZone *startZone = startCard->getZone(); diff --git a/cockatrice/src/arrowtarget.cpp b/cockatrice/src/arrowtarget.cpp index 1740eb95..2796ab08 100644 --- a/cockatrice/src/arrowtarget.cpp +++ b/cockatrice/src/arrowtarget.cpp @@ -1,6 +1,7 @@ #include "arrowtarget.h" #include "arrowitem.h" #include "player.h" +#include ArrowTarget::ArrowTarget(Player *_owner, QGraphicsItem *parent) : AbstractGraphicsItem(parent), owner(_owner), beingPointedAt(false) @@ -9,6 +10,7 @@ ArrowTarget::ArrowTarget(Player *_owner, QGraphicsItem *parent) ArrowTarget::~ArrowTarget() { + qDebug() << "ArrowTarget destructor"; for (int i = 0; i < arrowsFrom.size(); ++i) { arrowsFrom[i]->setStartItem(0); arrowsFrom[i]->delArrow(); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index f5e2aac3..ac3a26da 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -721,7 +721,7 @@ void Player::eventMoveCard(Event_MoveCard *event) while (playerIterator.hasNext()) { Player *p = playerIterator.next().value(); - QList arrowsToDelete; + QList arrowsToDelete; QMapIterator arrowIterator(p->getArrows()); while (arrowIterator.hasNext()) { ArrowItem *arrow = arrowIterator.next().value(); @@ -729,11 +729,11 @@ void Player::eventMoveCard(Event_MoveCard *event) if (startZone == targetZone) arrow->updatePath(); else - arrowsToDelete.append(arrow->getId()); + arrowsToDelete.append(arrow); } } for (int i = 0; i < arrowsToDelete.size(); ++i) - p->delArrow(arrowsToDelete[i]); + arrowsToDelete[i]->delArrow(); } } @@ -928,7 +928,7 @@ void Player::deleteCard(CardItem *c) if (dialogSemaphore) cardsToDelete.append(c); else - delete c; + c->deleteLater(); } void Player::addZone(CardZone *z)