From 443f8717a35f78956135a6be512031de345872be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sat, 1 Mar 2025 12:47:58 +0100 Subject: [PATCH] New DeckList method to return cards as CardInfoPtrs Saner update to prevent crashes. --- .../tab_deck_editor_visual.cpp | 2 +- .../deck_editor_deck_dock_widget.cpp | 3 + .../visual_deck_editor_widget.cpp | 31 +--------- .../visual_deck_editor_widget.h | 4 +- common/decklist.cpp | 62 +++++++++++++++++++ common/decklist.h | 4 ++ 6 files changed, 75 insertions(+), 31 deletions(-) diff --git a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index 401964fb0..a78dc1fa0 100644 --- a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -81,7 +81,7 @@ void TabDeckEditorVisual::createCentralFrame() void TabDeckEditorVisual::onDeckChanged() { AbstractTabDeckEditor::onDeckChanged(); - tabContainer->visualDeckView->updateDisplay(); + tabContainer->visualDeckView->decklistDataChanged(QModelIndex(), QModelIndex()); tabContainer->deckAnalytics->refreshDisplays(deckDockWidget->deckModel); tabContainer->sampleHandWidget->setDeckModel(deckDockWidget->deckModel); } diff --git a/cockatrice/src/client/ui/widgets/deck_editor/deck_editor_deck_dock_widget.cpp b/cockatrice/src/client/ui/widgets/deck_editor/deck_editor_deck_dock_widget.cpp index a89f73aed..00b4369f5 100644 --- a/cockatrice/src/client/ui/widgets/deck_editor/deck_editor_deck_dock_widget.cpp +++ b/cockatrice/src/client/ui/widgets/deck_editor/deck_editor_deck_dock_widget.cpp @@ -309,6 +309,8 @@ void DeckEditorDeckDockWidget::setDeck(DeckLoader *_deck) deckView->expandAll(); deckTagsDisplayWidget->connectDeckList(deckModel->getDeckList()); + + emit deckChanged(); } DeckLoader *DeckEditorDeckDockWidget::getDeckList() @@ -325,6 +327,7 @@ void DeckEditorDeckDockWidget::cleanDeck() nameEdit->setText(QString()); commentsEdit->setText(QString()); hashLabel->setText(QString()); + emit deckChanged(); updateBannerCardComboBox(); deckTagsDisplayWidget->connectDeckList(deckModel->getDeckList()); } diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp index 366b4b948..834a1fc6c 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp @@ -205,35 +205,8 @@ void VisualDeckEditorWidget::populateCards() if (!deck_list_model) return; DeckList *decklist = deck_list_model->getDeckList(); - if (!decklist) - return; - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return; - - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - if (!currentZone) - continue; - for (int j = 0; j < currentZone->size(); j++) { - DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); - if (!currentCard) - continue; - for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( - currentCard->getName(), currentCard->getCardProviderId()); - if (info) { - if (currentZone->getName() == DECK_ZONE_MAIN) { - mainDeckCards->append(info); - } else if (currentZone->getName() == DECK_ZONE_SIDE) { - sideboardCards->append(info); - } - } else { - qDebug() << "Card not found in database!"; - } - } - } - } + mainDeckCards = decklist->getCardsAsCardInfoPtrsForZone(DECK_ZONE_MAIN); + sideboardCards = decklist->getCardsAsCardInfoPtrsForZone(DECK_ZONE_SIDE); } void VisualDeckEditorWidget::sortCardList(const QStringList properties, Qt::SortOrder order = Qt::AscendingOrder) diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h index 773660ab4..a340ffb20 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h @@ -26,6 +26,9 @@ public: void sortCardList(QStringList properties, Qt::SortOrder order); void setDeckList(const DeckList &new_deck_list_model); +public slots: + void decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight); + signals: void activeCardChanged(CardInfoPtr activeCard); void mainboardCardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance); @@ -35,7 +38,6 @@ protected slots: void onHover(CardInfoPtr hoveredCard); void onMainboardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance); void onSideboardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance); - void decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight); void activeSortCriteriaChanged(); private: diff --git a/common/decklist.cpp b/common/decklist.cpp index 789f57910..69ffff685 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -1,5 +1,7 @@ #include "decklist.h" +#include "../cockatrice/src/game/cards/card_database_manager.h" + #include #include #include @@ -864,6 +866,66 @@ QMap DeckList::getCardListWithProviderId() const return result; } +QList *DeckList::getCardsAsCardInfoPtrs() const +{ + QList *cards = new QList(); + InnerDecklistNode *listRoot = getRoot(); + if (!listRoot) + return cards; + + for (int i = 0; i < listRoot->size(); i++) { + InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); + if (!currentZone) + continue; + for (int j = 0; j < currentZone->size(); j++) { + DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); + if (!currentCard) + continue; + for (int k = 0; k < currentCard->getNumber(); ++k) { + CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + currentCard->getName(), currentCard->getCardProviderId()); + if (info) { + cards->append(info); + } else { + qDebug() << "Card not found in database!"; + } + } + } + } + return cards; +} + +QList *DeckList::getCardsAsCardInfoPtrsForZone(QString zoneName) const +{ + QList *cards = new QList(); + InnerDecklistNode *listRoot = getRoot(); + if (!listRoot) + return cards; + + for (int i = 0; i < listRoot->size(); i++) { + InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); + if (!currentZone) + continue; + if (currentZone->getName() == zoneName) { + for (int j = 0; j < currentZone->size(); j++) { + DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); + if (!currentCard) + continue; + for (int k = 0; k < currentCard->getNumber(); ++k) { + CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + currentCard->getName(), currentCard->getCardProviderId()); + if (info) { + cards->append(info); + } else { + qDebug() << "Card not found in database!"; + } + } + } + } + } + return cards; +} + int DeckList::getSideboardSize() const { int size = 0; diff --git a/common/decklist.h b/common/decklist.h index de839ad23..ace6ed7d1 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -5,6 +5,8 @@ #include // Required on Mac. Forward declaration doesn't work. Don't ask why. +#include "../cockatrice/src/game/cards/card_database.h" + #include #include #include @@ -364,6 +366,8 @@ public: } QStringList getCardList() const; QMap getCardListWithProviderId() const; + QList *getCardsAsCardInfoPtrs() const; + QList *getCardsAsCardInfoPtrsForZone(QString zoneName) const; int getSideboardSize() const;