From 8fea71782d98535d59b7751057a093575e6b2bb9 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Wed, 8 Sep 2010 21:11:30 +0200 Subject: [PATCH] arrow crash fix. this fixes bug #0000001 --- cockatrice/src/arrowitem.cpp | 20 +++++++++++++++++--- cockatrice/src/arrowitem.h | 1 + cockatrice/src/arrowtarget.cpp | 12 ++++++++---- cockatrice/src/player.cpp | 17 +++++++++++------ cockatrice/src/player.h | 1 + 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/cockatrice/src/arrowitem.cpp b/cockatrice/src/arrowitem.cpp index 7eecba46..002bd2f1 100644 --- a/cockatrice/src/arrowitem.cpp +++ b/cockatrice/src/arrowitem.cpp @@ -27,17 +27,30 @@ ArrowItem::ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTar ArrowItem::~ArrowItem() { qDebug() << "ArrowItem destructor"; - if (startItem) +} + +void ArrowItem::delArrow() +{ + if (startItem) { startItem->removeArrowFrom(this); + startItem = 0; + } if (targetItem) { targetItem->setBeingPointedAt(false); targetItem->removeArrowTo(this); + targetItem = 0; } + + player->removeArrow(this); + deleteLater(); } void ArrowItem::updatePath() { + if (!targetItem) + return; + QPointF endPoint = targetItem->mapToScene(QPointF(targetItem->boundingRect().width() / 2, targetItem->boundingRect().height() / 2)); updatePath(endPoint); } @@ -196,7 +209,7 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) )); } } - deleteLater(); + delArrow(); for (int i = 0; i < childArrows.size(); ++i) childArrows[i]->mouseReleaseEvent(event); @@ -251,5 +264,6 @@ void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) targetCard->getId() )); } - deleteLater(); + + delArrow(); } diff --git a/cockatrice/src/arrowitem.h b/cockatrice/src/arrowitem.h index ae931715..f97c83e7 100644 --- a/cockatrice/src/arrowitem.h +++ b/cockatrice/src/arrowitem.h @@ -36,6 +36,7 @@ public: void setTargetItem(ArrowTarget *_item) { targetItem = _item; } ArrowTarget *getStartItem() const { return startItem; } ArrowTarget *getTargetItem() const { return targetItem; } + void delArrow(); }; class ArrowDragItem : public ArrowItem { diff --git a/cockatrice/src/arrowtarget.cpp b/cockatrice/src/arrowtarget.cpp index 1edf926b..1740eb95 100644 --- a/cockatrice/src/arrowtarget.cpp +++ b/cockatrice/src/arrowtarget.cpp @@ -9,10 +9,14 @@ ArrowTarget::ArrowTarget(Player *_owner, QGraphicsItem *parent) ArrowTarget::~ArrowTarget() { - while (!arrowsFrom.isEmpty()) - arrowsFrom.first()->getPlayer()->delArrow(arrowsFrom.first()->getId()); - while (!arrowsTo.isEmpty()) - arrowsTo.first()->getPlayer()->delArrow(arrowsTo.first()->getId()); + for (int i = 0; i < arrowsFrom.size(); ++i) { + arrowsFrom[i]->setStartItem(0); + arrowsFrom[i]->delArrow(); + } + for (int i = 0; i < arrowsTo.size(); ++i) { + arrowsTo[i]->setTargetItem(0); + arrowsTo[i]->delArrow(); + } } void ArrowTarget::setBeingPointedAt(bool _beingPointedAt) diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 520a0aa7..54780803 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -813,13 +813,13 @@ void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/ void Player::processPlayerInfo(ServerInfo_Player *info) { + clearCounters(); + clearArrows(); + QMapIterator zoneIt(zones); while (zoneIt.hasNext()) zoneIt.next().value()->clearContents(); - clearCounters(); - clearArrows(); - QList zl = info->getZoneList(); for (int i = 0; i < zl.size(); ++i) { ServerInfo_Zone *zoneInfo = zl[i]; @@ -957,15 +957,20 @@ void Player::delArrow(int arrowId) ArrowItem *a = arrows.value(arrowId, 0); if (!a) return; - arrows.remove(arrowId); - delete a; + a->delArrow(); +} + +void Player::removeArrow(ArrowItem *arrow) +{ + if (arrow->getId() != -1) + arrows.remove(arrow->getId()); } void Player::clearArrows() { QMapIterator arrowIterator(arrows); while (arrowIterator.hasNext()) - delete arrowIterator.next().value(); + arrowIterator.next().value()->delArrow(); arrows.clear(); } diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index e2532513..b8505183 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -167,6 +167,7 @@ public: ArrowItem *addArrow(ServerInfo_Arrow *arrow); ArrowItem *addArrow(int arrowId, CardItem *startCard, ArrowTarget *targetItem, const QColor &color); void delArrow(int arrowId); + void removeArrow(ArrowItem *arrow); void clearArrows(); PlayerTarget *getPlayerTarget() const { return playerTarget; }