arrow crash fix. this fixes bug #0000001

This commit is contained in:
Max-Wilhelm Bruker 2010-09-08 21:11:30 +02:00
parent a5f678bc3d
commit 8fea71782d
5 changed files with 38 additions and 13 deletions

View file

@ -27,17 +27,30 @@ ArrowItem::ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTar
ArrowItem::~ArrowItem() ArrowItem::~ArrowItem()
{ {
qDebug() << "ArrowItem destructor"; qDebug() << "ArrowItem destructor";
if (startItem) }
void ArrowItem::delArrow()
{
if (startItem) {
startItem->removeArrowFrom(this); startItem->removeArrowFrom(this);
startItem = 0;
}
if (targetItem) { if (targetItem) {
targetItem->setBeingPointedAt(false); targetItem->setBeingPointedAt(false);
targetItem->removeArrowTo(this); targetItem->removeArrowTo(this);
targetItem = 0;
} }
player->removeArrow(this);
deleteLater();
} }
void ArrowItem::updatePath() void ArrowItem::updatePath()
{ {
if (!targetItem)
return;
QPointF endPoint = targetItem->mapToScene(QPointF(targetItem->boundingRect().width() / 2, targetItem->boundingRect().height() / 2)); QPointF endPoint = targetItem->mapToScene(QPointF(targetItem->boundingRect().width() / 2, targetItem->boundingRect().height() / 2));
updatePath(endPoint); updatePath(endPoint);
} }
@ -196,7 +209,7 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
)); ));
} }
} }
deleteLater(); delArrow();
for (int i = 0; i < childArrows.size(); ++i) for (int i = 0; i < childArrows.size(); ++i)
childArrows[i]->mouseReleaseEvent(event); childArrows[i]->mouseReleaseEvent(event);
@ -251,5 +264,6 @@ void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/)
targetCard->getId() targetCard->getId()
)); ));
} }
deleteLater();
delArrow();
} }

View file

@ -36,6 +36,7 @@ public:
void setTargetItem(ArrowTarget *_item) { targetItem = _item; } void setTargetItem(ArrowTarget *_item) { targetItem = _item; }
ArrowTarget *getStartItem() const { return startItem; } ArrowTarget *getStartItem() const { return startItem; }
ArrowTarget *getTargetItem() const { return targetItem; } ArrowTarget *getTargetItem() const { return targetItem; }
void delArrow();
}; };
class ArrowDragItem : public ArrowItem { class ArrowDragItem : public ArrowItem {

View file

@ -9,10 +9,14 @@ ArrowTarget::ArrowTarget(Player *_owner, QGraphicsItem *parent)
ArrowTarget::~ArrowTarget() ArrowTarget::~ArrowTarget()
{ {
while (!arrowsFrom.isEmpty()) for (int i = 0; i < arrowsFrom.size(); ++i) {
arrowsFrom.first()->getPlayer()->delArrow(arrowsFrom.first()->getId()); arrowsFrom[i]->setStartItem(0);
while (!arrowsTo.isEmpty()) arrowsFrom[i]->delArrow();
arrowsTo.first()->getPlayer()->delArrow(arrowsTo.first()->getId()); }
for (int i = 0; i < arrowsTo.size(); ++i) {
arrowsTo[i]->setTargetItem(0);
arrowsTo[i]->delArrow();
}
} }
void ArrowTarget::setBeingPointedAt(bool _beingPointedAt) void ArrowTarget::setBeingPointedAt(bool _beingPointedAt)

View file

@ -813,13 +813,13 @@ void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/
void Player::processPlayerInfo(ServerInfo_Player *info) void Player::processPlayerInfo(ServerInfo_Player *info)
{ {
clearCounters();
clearArrows();
QMapIterator<QString, CardZone *> zoneIt(zones); QMapIterator<QString, CardZone *> zoneIt(zones);
while (zoneIt.hasNext()) while (zoneIt.hasNext())
zoneIt.next().value()->clearContents(); zoneIt.next().value()->clearContents();
clearCounters();
clearArrows();
QList<ServerInfo_Zone *> zl = info->getZoneList(); QList<ServerInfo_Zone *> zl = info->getZoneList();
for (int i = 0; i < zl.size(); ++i) { for (int i = 0; i < zl.size(); ++i) {
ServerInfo_Zone *zoneInfo = zl[i]; ServerInfo_Zone *zoneInfo = zl[i];
@ -957,15 +957,20 @@ void Player::delArrow(int arrowId)
ArrowItem *a = arrows.value(arrowId, 0); ArrowItem *a = arrows.value(arrowId, 0);
if (!a) if (!a)
return; return;
arrows.remove(arrowId); a->delArrow();
delete a; }
void Player::removeArrow(ArrowItem *arrow)
{
if (arrow->getId() != -1)
arrows.remove(arrow->getId());
} }
void Player::clearArrows() void Player::clearArrows()
{ {
QMapIterator<int, ArrowItem *> arrowIterator(arrows); QMapIterator<int, ArrowItem *> arrowIterator(arrows);
while (arrowIterator.hasNext()) while (arrowIterator.hasNext())
delete arrowIterator.next().value(); arrowIterator.next().value()->delArrow();
arrows.clear(); arrows.clear();
} }

View file

@ -167,6 +167,7 @@ public:
ArrowItem *addArrow(ServerInfo_Arrow *arrow); ArrowItem *addArrow(ServerInfo_Arrow *arrow);
ArrowItem *addArrow(int arrowId, CardItem *startCard, ArrowTarget *targetItem, const QColor &color); ArrowItem *addArrow(int arrowId, CardItem *startCard, ArrowTarget *targetItem, const QColor &color);
void delArrow(int arrowId); void delArrow(int arrowId);
void removeArrow(ArrowItem *arrow);
void clearArrows(); void clearArrows();
PlayerTarget *getPlayerTarget() const { return playerTarget; } PlayerTarget *getPlayerTarget() const { return playerTarget; }