From 8e1d7d12e0eaf908410310273f746aa532a5ad82 Mon Sep 17 00:00:00 2001 From: ebbit1q Date: Sat, 13 Mar 2021 20:43:50 +0100 Subject: [PATCH] allow multiple zoneviews (#4263) --- cockatrice/src/cardzone.cpp | 17 ++++++++++++----- cockatrice/src/cardzone.h | 10 +++------- cockatrice/src/gamescene.cpp | 17 ++++++++--------- cockatrice/src/player.cpp | 6 ++++-- cockatrice/src/zoneviewzone.cpp | 20 +++++++++++--------- 5 files changed, 38 insertions(+), 32 deletions(-) diff --git a/cockatrice/src/cardzone.cpp b/cockatrice/src/cardzone.cpp index 7010e56a..438c5de2 100644 --- a/cockatrice/src/cardzone.cpp +++ b/cockatrice/src/cardzone.cpp @@ -18,7 +18,7 @@ CardZone::CardZone(Player *_p, bool _contentsKnown, QGraphicsItem *parent, bool _isView) - : AbstractGraphicsItem(parent), player(_p), name(_name), cards(_contentsKnown), view(NULL), menu(NULL), + : AbstractGraphicsItem(parent), player(_p), name(_name), cards(_contentsKnown), views{}, menu(nullptr), doubleClickAction(0), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable), isView(_isView) { if (!isView) @@ -28,7 +28,11 @@ CardZone::CardZone(Player *_p, CardZone::~CardZone() { qDebug() << "CardZone destructor: " << name; - delete view; + for (auto *view : views) { + if (view != nullptr) { + view->deleteLater(); + } + } clearContents(); } @@ -120,9 +124,11 @@ void CardZone::mousePressEvent(QGraphicsSceneMouseEvent *event) void CardZone::addCard(CardItem *card, bool reorganize, int x, int y) { - if (view) - if ((x <= view->getCards().size()) || (view->getNumberCards() == -1)) + for (auto *view : views) { + if ((x <= view->getCards().size()) || (view->getNumberCards() == -1)) { view->addCard(new CardItem(player, card->getName(), card->getId()), reorganize, x, y); + } + } card->setZone(this); addCardImpl(card, x, y); @@ -168,8 +174,9 @@ CardItem *CardZone::takeCard(int position, int cardId, bool /*canResize*/) CardItem *c = cards.takeAt(position); - if (view) + for (auto *view : views) { view->removeCard(position); + } c->setId(cardId); diff --git a/cockatrice/src/cardzone.h b/cockatrice/src/cardzone.h index e64fef02..5585663a 100644 --- a/cockatrice/src/cardzone.h +++ b/cockatrice/src/cardzone.h @@ -21,7 +21,7 @@ protected: Player *player; QString name; CardList cards; - ZoneViewZone *view; + QList views; QMenu *menu; QAction *doubleClickAction; bool hasCardAttr; @@ -98,13 +98,9 @@ public: // takeCard() finds a card by position and removes it from the zone and from all of its views. virtual CardItem *takeCard(int position, int cardId, bool canResize = true); void removeCard(CardItem *card); - ZoneViewZone *getView() const + QList &getViews() { - return view; - } - void setView(ZoneViewZone *_view) - { - view = _view; + return views; } virtual void reorganizeCards() = 0; virtual QPointF closestGridPoint(const QPointF &point); diff --git a/cockatrice/src/gamescene.cpp b/cockatrice/src/gamescene.cpp index 9a2e51ae..815e35c5 100644 --- a/cockatrice/src/gamescene.cpp +++ b/cockatrice/src/gamescene.cpp @@ -144,12 +144,10 @@ void GameScene::rearrange() void GameScene::toggleZoneView(Player *player, const QString &zoneName, int numberCards) { - for (int i = 0; i < zoneViews.size(); i++) { - ZoneViewZone *temp = zoneViews[i]->getZone(); - if ((temp->getName() == zoneName) && (temp->getPlayer() == player)) { // view is already open - zoneViews[i]->close(); - if (temp->getNumberCards() == numberCards) - return; + for (auto &view : zoneViews) { + ZoneViewZone *temp = view->getZone(); + if (temp->getName() == zoneName && temp->getPlayer() == player && temp->getNumberCards() == numberCards) { + view->close(); } } @@ -157,12 +155,13 @@ void GameScene::toggleZoneView(Player *player, const QString &zoneName, int numb zoneViews.append(item); connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *))); addItem(item); - if (zoneName == "grave") + if (zoneName == "grave") { item->setPos(360, 100); - else if (zoneName == "rfg") + } else if (zoneName == "rfg") { item->setPos(380, 120); - else + } else { item->setPos(340, 80); + } } void GameScene::addRevealedZoneView(Player *player, diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index a9c054eb..87d36458 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -1552,8 +1552,10 @@ void Player::eventShuffle(const Event_Shuffle &event) if (!zone) { return; } - if (zone->getView() && zone->getView()->getRevealZone()) { - zone->getView()->setWriteableRevealZone(false); + for (auto *view : zone->getViews()) { + if (view != nullptr) { + view->setWriteableRevealZone(false); + } } emit logShuffle(this, zone, event.start(), event.end()); } diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index c71f9a09..eb3b7a98 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -26,16 +26,18 @@ ZoneViewZone::ZoneViewZone(Player *_p, numberCards(_numberCards), origZone(_origZone), revealZone(_revealZone), writeableRevealZone(_writeableRevealZone), sortByName(false), sortByType(false) { - if (!(revealZone && !writeableRevealZone)) - origZone->setView(this); + if (!(revealZone && !writeableRevealZone)) { + origZone->getViews().append(this); + } } ZoneViewZone::~ZoneViewZone() { emit beingDeleted(); qDebug("ZoneViewZone destructor"); - if (!(revealZone && !writeableRevealZone)) - origZone->setView(NULL); + if (!(revealZone && !writeableRevealZone)) { + origZone->getViews().removeOne(this); + } } QRectF ZoneViewZone::boundingRect() const @@ -238,11 +240,11 @@ QSizeF ZoneViewZone::sizeHint(Qt::SizeHint /*which*/, const QSizeF & /*constrain void ZoneViewZone::setWriteableRevealZone(bool _writeableRevealZone) { - if (writeableRevealZone && !_writeableRevealZone) - origZone->setView(this); - else if (!writeableRevealZone && _writeableRevealZone) - origZone->setView(NULL); - + if (writeableRevealZone && !_writeableRevealZone) { + origZone->getViews().append(this); + } else if (!writeableRevealZone && _writeableRevealZone) { + origZone->getViews().removeOne(this); + } writeableRevealZone = _writeableRevealZone; }