arrow crash fix. this fixes bug #0000001
This commit is contained in:
parent
a5f678bc3d
commit
8fea71782d
5 changed files with 38 additions and 13 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue