From 00ed5c370ce9b285051913b503ba28965f491ea9 Mon Sep 17 00:00:00 2001 From: ebbit1q Date: Sat, 13 Mar 2021 20:44:57 +0100 Subject: [PATCH] implement a maximum amount of cardmenus generated for views (#4262) --- cockatrice/src/carditem.cpp | 18 +++++++++++++----- cockatrice/src/carditem.h | 4 +++- cockatrice/src/zoneviewzone.cpp | 10 +++++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 3c4ed3ee..84d09df1 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -18,9 +18,15 @@ #include #include -CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _revealedCard, QGraphicsItem *parent) - : AbstractCardItem(_name, _owner, _cardid, parent), zone(0), revealedCard(_revealedCard), attacking(false), - destroyOnZoneChange(false), doesntUntap(false), dragItem(0), attachedTo(0) +CardItem::CardItem(Player *_owner, + const QString &_name, + int _cardid, + bool _revealedCard, + QGraphicsItem *parent, + CardZone *_zone, + bool updateMenu) + : AbstractCardItem(_name, _owner, _cardid, parent), zone(_zone), revealedCard(_revealedCard), attacking(false), + destroyOnZoneChange(false), doesntUntap(false), dragItem(nullptr), attachedTo(nullptr) { owner->addCard(this); @@ -29,7 +35,9 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _reve moveMenu = new QMenu; retranslateUi(); - emit updateCardMenu(this); + if (updateMenu) { // avoid updating card menu too often + emit updateCardMenu(this); + } } CardItem::~CardItem() @@ -382,7 +390,7 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) } } - if (owner != nullptr){ // cards without owner will be deleted + if (owner != nullptr) { // cards without owner will be deleted setCursor(Qt::OpenHandCursor); } AbstractCardItem::mouseReleaseEvent(event); diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index 57992958..5c04d97f 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -52,7 +52,9 @@ public: const QString &_name = QString(), int _cardid = -1, bool revealedCard = false, - QGraphicsItem *parent = nullptr); + QGraphicsItem *parent = nullptr, + CardZone *_zone = nullptr, + bool updateMenu = false); ~CardItem(); void retranslateUi(); CardZone *getZone() const diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index eb3b7a98..84045231 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -83,15 +83,19 @@ void ZoneViewZone::initializeCards(const QList &cardLis void ZoneViewZone::zoneDumpReceived(const Response &r) { + static constexpr int MAX_VIEW_MENU = 300; const Response_DumpZone &resp = r.GetExtension(Response_DumpZone::ext); const int respCardListSize = resp.zone_info().card_list_size(); for (int i = 0; i < respCardListSize; ++i) { const ServerInfo_Card &cardInfo = resp.zone_info().card_list(i); - CardItem *card = new CardItem(player, QString::fromStdString(cardInfo.name()), cardInfo.id(), revealZone, this); - addCard(card, false, i); + auto cardName = QString::fromStdString(cardInfo.name()); + // stop updating card menus after MAX_VIEW_MENU cards + // this means only the first cards in the menu have actions but others can still be dragged + auto *card = new CardItem(player, cardName, cardInfo.id(), revealZone, this, this, i < MAX_VIEW_MENU); + cards.insert(i, card); } - reorganizeCards(); + emit cardCountChanged(); } // Because of boundingRect(), this function must not be called before the zone was added to a scene.