game: Automatic update of arrow position (#5729)

Currently, zones must keep track of which cards they move in order to
manually call `updatePath` on arrows.

This patch sets the `ItemSendsScenePositionChanges` flag on
`ArrowTarget`s to automatically update arrow positions without requiring
zones to keep track of that information.
This commit is contained in:
Basile Clement 2025-03-16 23:58:06 +01:00 committed by GitHub
parent c99afe7956
commit 4ada011632
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 19 additions and 32 deletions

View file

@ -6,6 +6,7 @@
ArrowTarget::ArrowTarget(Player *_owner, QGraphicsItem *parent)
: AbstractGraphicsItem(parent), owner(_owner), beingPointedAt(false)
{
setFlag(ItemSendsScenePositionChanges);
}
ArrowTarget::~ArrowTarget()
@ -25,3 +26,16 @@ void ArrowTarget::setBeingPointedAt(bool _beingPointedAt)
beingPointedAt = _beingPointedAt;
update();
}
QVariant ArrowTarget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
if (change == ItemScenePositionHasChanged && scene()) {
for (auto *arrow : arrowsFrom)
arrow->updatePath();
for (auto *arrow : arrowsTo)
arrow->updatePath();
}
return QGraphicsItem::itemChange(change, value);
}

View file

@ -57,5 +57,8 @@ public:
{
arrowsTo.removeOne(arrow);
}
protected:
QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override;
};
#endif

View file

@ -331,5 +331,5 @@ QVariant AbstractCardItem::itemChange(QGraphicsItem::GraphicsItemChange change,
update();
return value;
} else
return QGraphicsItem::itemChange(change, value);
return ArrowTarget::itemChange(change, value);
}

View file

@ -487,5 +487,5 @@ QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value)
owner->getGame()->setActiveCard(nullptr);
}
}
return QGraphicsItem::itemChange(change, value);
return AbstractCardItem::itemChange(change, value);
}

View file

@ -109,8 +109,6 @@ void StackZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone
void StackZone::reorganizeCards()
{
if (!cards.isEmpty()) {
QSet<ArrowItem *> arrowsToUpdate;
const auto cardCount = static_cast<int>(cards.size());
qreal totalWidth = boundingRect().width();
qreal cardWidth = cards.at(0)->boundingRect().width();
@ -125,16 +123,6 @@ void StackZone::reorganizeCards()
divideCardSpaceInZone(i, cardCount, boundingRect().height(), cards.at(0)->boundingRect().height());
card->setPos(x, y);
card->setRealZValue(i);
for (ArrowItem *item : card->getArrowsFrom()) {
arrowsToUpdate.insert(item);
}
for (ArrowItem *item : card->getArrowsTo()) {
arrowsToUpdate.insert(item);
}
}
for (ArrowItem *item : arrowsToUpdate) {
item->updatePath();
}
}
update();

View file

@ -157,8 +157,6 @@ void TableZone::handleDropEventByGrid(const QList<CardDragItem *> &dragItems,
void TableZone::reorganizeCards()
{
QSet<ArrowItem *> arrowsToUpdate;
// Calculate card stack widths so mapping functions work properly
computeCardStackWidths();
@ -189,23 +187,7 @@ void TableZone::reorganizeCards()
qreal childY = y + 5;
attachedCard->setPos(childX, childY);
attachedCard->setRealZValue((childY + CARD_HEIGHT) * 100000 + (childX + 1) * 100);
for (ArrowItem *item : attachedCard->getArrowsFrom()) {
arrowsToUpdate.insert(item);
}
for (ArrowItem *item : attachedCard->getArrowsTo()) {
arrowsToUpdate.insert(item);
}
}
for (ArrowItem *item : cards[i]->getArrowsFrom()) {
arrowsToUpdate.insert(item);
}
for (ArrowItem *item : cards[i]->getArrowsTo()) {
arrowsToUpdate.insert(item);
}
}
for (ArrowItem *item : arrowsToUpdate) {
item->updatePath();
}
resizeToContents();