From db1b481ef8d20b45a88776b232a3b004d18820a4 Mon Sep 17 00:00:00 2001 From: RickyRister <42636155+RickyRister@users.noreply.github.com> Date: Sat, 4 Jan 2025 01:09:36 -0800 Subject: [PATCH] Get cardIds to update properly in bottom view (#5414) * wip * refactor * saving before changing something * unborked * almost works * it works!!!!!!!! * cleanup --- cockatrice/src/game/game_scene.cpp | 3 +- cockatrice/src/game/zones/card_zone.cpp | 4 +- cockatrice/src/game/zones/view_zone.cpp | 39 +++++++++++++------ cockatrice/src/game/zones/view_zone.h | 10 ++++- .../src/game/zones/view_zone_widget.cpp | 3 +- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/cockatrice/src/game/game_scene.cpp b/cockatrice/src/game/game_scene.cpp index b657b596c..71937f1dc 100644 --- a/cockatrice/src/game/game_scene.cpp +++ b/cockatrice/src/game/game_scene.cpp @@ -151,7 +151,8 @@ void GameScene::toggleZoneView(Player *player, const QString &zoneName, int numb } } - ZoneViewWidget *item = new ZoneViewWidget(player, player->getZones().value(zoneName), numberCards, false, false, {}, isReversed); + ZoneViewWidget *item = + new ZoneViewWidget(player, player->getZones().value(zoneName), numberCards, false, false, {}, isReversed); zoneViews.append(item); connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *))); addItem(item); diff --git a/cockatrice/src/game/zones/card_zone.cpp b/cockatrice/src/game/zones/card_zone.cpp index 7c5ef621f..4c3fd9db5 100644 --- a/cockatrice/src/game/zones/card_zone.cpp +++ b/cockatrice/src/game/zones/card_zone.cpp @@ -200,12 +200,12 @@ CardItem *CardZone::takeCard(int position, int cardId, bool /*canResize*/) if (position >= cards.size()) return nullptr; - CardItem *c = cards.takeAt(position); - for (auto *view : views) { view->removeCard(position); } + CardItem *c = cards.takeAt(position); + c->setId(cardId); reorganizeCards(); diff --git a/cockatrice/src/game/zones/view_zone.cpp b/cockatrice/src/game/zones/view_zone.cpp index 8b4050b8f..05c7ec0aa 100644 --- a/cockatrice/src/game/zones/view_zone.cpp +++ b/cockatrice/src/game/zones/view_zone.cpp @@ -33,7 +33,7 @@ ZoneViewZone::ZoneViewZone(Player *_p, : SelectZone(_p, _origZone->getName(), false, false, true, parent, true), bRect(QRectF()), minRows(0), numberCards(_numberCards), origZone(_origZone), revealZone(_revealZone), writeableRevealZone(_writeableRevealZone), groupBy(CardList::NoSort), sortBy(CardList::NoSort), - isReversed(_isReversed), firstCardId(-1) + isReversed(_isReversed) { if (!(revealZone && !writeableRevealZone)) { origZone->getViews().append(this); @@ -102,17 +102,14 @@ void ZoneViewZone::zoneDumpReceived(const Response &r) auto cardProviderId = QString::fromStdString(cardInfo.provider_id()); auto *card = new CardItem(player, this, cardName, cardProviderId, cardInfo.id(), revealZone, this); cards.insert(i, card); - - if (i == 0) { - firstCardId = cardInfo.id(); - } } + + updateCardIds(INITIALIZE); reorganizeCards(); emit cardCountChanged(); } -// Because of boundingRect(), this function must not be called before the zone was added to a scene. -void ZoneViewZone::reorganizeCards() +void ZoneViewZone::updateCardIds(CardAction action) { int cardCount = cards.size(); if (!origZone->contentsKnown()) { @@ -120,11 +117,20 @@ void ZoneViewZone::reorganizeCards() return; } - auto startId = isReversed ? cards.first()->getId() : 0; + auto startId = 0; if (isReversed) { - if (cards.first()->getId() != firstCardId) { - startId -= 1; + // these get called after this zone's card list updates but before parent zone's card list updates + startId = origZone->getCards().size() - cards.size(); + switch (action) { + case INITIALIZE: + break; + case ADD_CARD: + startId += 1; + break; + case REMOVE_CARD: + startId -= 1; + break; } } @@ -132,7 +138,11 @@ void ZoneViewZone::reorganizeCards() cards[i]->setId(i + startId); } } +} +// Because of boundingRect(), this function must not be called before the zone was added to a scene. +void ZoneViewZone::reorganizeCards() +{ CardList cardsToDisplay(cards); // sort cards @@ -231,7 +241,7 @@ ZoneViewZone::GridSize ZoneViewZone::positionCardsForDisplay(CardList &cards, Ca if (cols < 2) cols = 2; - qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols; + qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols; for (int i = 0; i < cardCount; i++) { CardItem *c = cards.at(i); @@ -274,13 +284,18 @@ void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/) if (x != 0) { cards.append(card); } else { + updateCardIds(ADD_CARD); + reorganizeCards(); return; } } else { cards.insert(x, card); } + card->setParentItem(this); card->update(); + + updateCardIds(ADD_CARD); reorganizeCards(); } @@ -308,6 +323,7 @@ void ZoneViewZone::removeCard(int position) if (isReversed) { position -= cards.first()->getId(); if (position < 0 || position >= cards.size()) { + updateCardIds(REMOVE_CARD); reorganizeCards(); return; } @@ -319,6 +335,7 @@ void ZoneViewZone::removeCard(int position) CardItem *card = cards.takeAt(position); card->deleteLater(); + updateCardIds(REMOVE_CARD); reorganizeCards(); } diff --git a/cockatrice/src/game/zones/view_zone.h b/cockatrice/src/game/zones/view_zone.h index db875958e..4780d73d1 100644 --- a/cockatrice/src/game/zones/view_zone.h +++ b/cockatrice/src/game/zones/view_zone.h @@ -35,7 +35,15 @@ private: CardList::SortOption groupBy, sortBy; bool pileView; bool isReversed; - int firstCardId; + + enum CardAction + { + INITIALIZE, + ADD_CARD, + REMOVE_CARD + }; + + void updateCardIds(CardAction action); struct GridSize { diff --git a/cockatrice/src/game/zones/view_zone_widget.cpp b/cockatrice/src/game/zones/view_zone_widget.cpp index 605f004f4..f1e96c532 100644 --- a/cockatrice/src/game/zones/view_zone_widget.cpp +++ b/cockatrice/src/game/zones/view_zone_widget.cpp @@ -108,7 +108,8 @@ ZoneViewWidget::ZoneViewWidget(Player *_player, vbox->addItem(zoneHBox); - zone = new ZoneViewZone(player, _origZone, numberCards, _revealZone, _writeableRevealZone, zoneContainer, _isReversed); + zone = + new ZoneViewZone(player, _origZone, numberCards, _revealZone, _writeableRevealZone, zoneContainer, _isReversed); connect(zone, SIGNAL(wheelEventReceived(QGraphicsSceneWheelEvent *)), scrollBarProxy, SLOT(recieveWheelEvent(QGraphicsSceneWheelEvent *)));