Refactor: Represent cardName + providerId with CardRef struct (#6039)

* card_ref.h

* update CardDatabase signatures

* make everything compile

* rename methods

* add docs

* mark stuff const

* set cardRef in CardItem

* cleanup

* fix build failure

* Fix builds on mac

---------

Co-authored-by: ZeldaZach <zahalpern+github@gmail.com>
This commit is contained in:
RickyRister 2025-07-15 19:14:02 -07:00 committed by GitHub
parent e05dad4267
commit a9b3be33e0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 328 additions and 305 deletions

View file

@ -100,7 +100,7 @@ public:
QString collectorNumber = cardData.value("cn").toString(); QString collectorNumber = cardData.value("cn").toString();
QString providerId = cardData.value("scryfall_id").toString(); QString providerId = cardData.value("scryfall_id").toString();
list->setBannerCard(QPair<QString, QString>(commanderName, providerId)); list->setBannerCard({commanderName, providerId});
list->addCard(commanderName, DECK_ZONE_MAIN, -1, setName, collectorNumber, providerId); list->addCard(commanderName, DECK_ZONE_MAIN, -1, setName, collectorNumber, providerId);
} }
} }

View file

@ -161,8 +161,7 @@ void AbstractTabDeckEditor::openDeck(DeckLoader *deck)
void AbstractTabDeckEditor::setDeck(DeckLoader *_deck) void AbstractTabDeckEditor::setDeck(DeckLoader *_deck)
{ {
deckDockWidget->setDeck(_deck); deckDockWidget->setDeck(_deck);
PictureLoader::cacheCardPixmaps( PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(getDeckList()->getCardRefList()));
CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(getDeckList()->getCardListWithProviderId()));
setModified(false); setModified(false);
// If they load a deck, make the deck list appear // If they load a deck, make the deck list appear

View file

@ -12,7 +12,7 @@ EdhrecApiResponseCardDetailsDisplayWidget::EdhrecApiResponseCardDetailsDisplayWi
setLayout(layout); setLayout(layout);
cardPictureWidget = new CardInfoPictureWidget(this); cardPictureWidget = new CardInfoPictureWidget(this);
cardPictureWidget->setCard(CardDatabaseManager::getInstance()->guessCard(toDisplay.sanitized)); cardPictureWidget->setCard(CardDatabaseManager::getInstance()->guessCard({toDisplay.sanitized}));
nameLabel = new QLabel(this); nameLabel = new QLabel(this);
nameLabel->setText(toDisplay.name); nameLabel->setText(toDisplay.name);

View file

@ -15,7 +15,7 @@ EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCom
setLayout(layout); setLayout(layout);
commanderPicture = new CardInfoPictureWidget(this); commanderPicture = new CardInfoPictureWidget(this);
commanderPicture->setCard(CardDatabaseManager::getInstance()->getCard(commanderDetails.getName())); commanderPicture->setCard(CardDatabaseManager::getInstance()->getCardInfo(commanderDetails.getName()));
QWidget *currentParent = parentWidget(); QWidget *currentParent = parentWidget();
TabEdhRecMain *parentTab = nullptr; TabEdhRecMain *parentTab = nullptr;

View file

@ -136,7 +136,7 @@ void TabEdhRecMain::retranslateUi()
void TabEdhRecMain::doSearch() void TabEdhRecMain::doSearch()
{ {
CardInfoPtr searchedCard = CardDatabaseManager::getInstance()->getCard(searchBar->text()); CardInfoPtr searchedCard = CardDatabaseManager::getInstance()->getCardInfo(searchBar->text());
if (!searchedCard) { if (!searchedCard) {
return; return;
} }

View file

@ -14,14 +14,13 @@ Tab::Tab(TabSupervisor *_tabSupervisor)
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
} }
void Tab::showCardInfoPopup(const QPoint &pos, const QString &cardName, const QString &providerId) void Tab::showCardInfoPopup(const QPoint &pos, const CardRef &cardRef)
{ {
if (infoPopup) { if (infoPopup) {
infoPopup->deleteLater(); infoPopup->deleteLater();
} }
currentCardName = cardName; currentCard = cardRef;
currentProviderId = providerId; infoPopup = new CardInfoDisplayWidget(currentCard, nullptr,
infoPopup = new CardInfoDisplayWidget(cardName, providerId, nullptr,
Qt::Widget | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint | Qt::Widget | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint |
Qt::WindowStaysOnTopHint); Qt::WindowStaysOnTopHint);
infoPopup->setAttribute(Qt::WA_TransparentForMouseEvents); infoPopup->setAttribute(Qt::WA_TransparentForMouseEvents);
@ -37,7 +36,7 @@ void Tab::showCardInfoPopup(const QPoint &pos, const QString &cardName, const QS
void Tab::deleteCardInfoPopup(const QString &cardName) void Tab::deleteCardInfoPopup(const QString &cardName)
{ {
if (infoPopup) { if (infoPopup) {
if ((currentCardName == cardName) || (cardName == "_")) { if (currentCard.name == cardName || cardName == "_") {
infoPopup->deleteLater(); infoPopup->deleteLater();
infoPopup = 0; infoPopup = 0;
} }

View file

@ -1,6 +1,8 @@
#ifndef TAB_H #ifndef TAB_H
#define TAB_H #define TAB_H
#include "card_ref.h"
#include <QMainWindow> #include <QMainWindow>
class QMenu; class QMenu;
@ -27,12 +29,12 @@ protected:
tabMenus.append(menu); tabMenus.append(menu);
} }
protected slots: protected slots:
void showCardInfoPopup(const QPoint &pos, const QString &cardName, const QString &providerId); void showCardInfoPopup(const QPoint &pos, const CardRef &cardRef);
void deleteCardInfoPopup(const QString &cardName); void deleteCardInfoPopup(const QString &cardName);
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;
private: private:
QString currentCardName, currentProviderId; CardRef currentCard;
bool contentsChanged; bool contentsChanged;
CardInfoDisplayWidget *infoPopup; CardInfoDisplayWidget *infoPopup;
QList<QMenu *> tabMenus; QList<QMenu *> tabMenus;

View file

@ -929,8 +929,8 @@ void TabGame::eventGameStateChanged(const Event_GameStateChanged &event,
DeckViewContainer *deckViewContainer = deckViewContainers.value(playerId); DeckViewContainer *deckViewContainer = deckViewContainers.value(playerId);
if (playerInfo.has_deck_list()) { if (playerInfo.has_deck_list()) {
DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list()));
PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCardsByNameAndProviderId( PictureLoader::cacheCardPixmaps(
newDeck.getCardListWithProviderId())); CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList()));
deckViewContainer->setDeck(newDeck); deckViewContainer->setDeck(newDeck);
player->setDeck(newDeck); player->setDeck(newDeck);
} }
@ -1625,9 +1625,9 @@ void TabGame::createDeckViewContainerWidget(bool bReplay)
deckViewContainerWidget->setLayout(deckViewContainerLayout); deckViewContainerWidget->setLayout(deckViewContainerLayout);
} }
void TabGame::viewCardInfo(const QString &cardName, const QString &providerId) const void TabGame::viewCardInfo(const CardRef &cardRef) const
{ {
cardInfoFrameWidget->setCard(cardName, providerId); cardInfoFrameWidget->setCard(cardRef);
} }
void TabGame::createCardInfoDock(bool bReplay) void TabGame::createCardInfoDock(bool bReplay)

View file

@ -266,7 +266,7 @@ public:
public slots: public slots:
void sendGameCommand(PendingCommand *pend, int playerId = -1); void sendGameCommand(PendingCommand *pend, int playerId = -1);
void sendGameCommand(const ::google::protobuf::Message &command, int playerId = -1); void sendGameCommand(const ::google::protobuf::Message &command, int playerId = -1);
void viewCardInfo(const QString &cardName, const QString &providerId = "") const; void viewCardInfo(const CardRef &cardRef = {}) const;
}; };
#endif #endif

View file

@ -95,7 +95,7 @@ void TappedOutInterface::analyzeDeck(DeckList *deck)
void TappedOutInterface::copyDeckSplitMainAndSide(DeckList &source, DeckList &mainboard, DeckList &sideboard) void TappedOutInterface::copyDeckSplitMainAndSide(DeckList &source, DeckList &mainboard, DeckList &sideboard)
{ {
auto copyMainOrSide = [this, &mainboard, &sideboard](const auto node, const auto card) { auto copyMainOrSide = [this, &mainboard, &sideboard](const auto node, const auto card) {
CardInfoPtr dbCard = cardDatabase.getCard(card->getName()); CardInfoPtr dbCard = cardDatabase.getCardInfo(card->getName());
if (!dbCard || dbCard->getIsToken()) if (!dbCard || dbCard->getIsToken())
return; return;

View file

@ -46,7 +46,7 @@ QWidget *CardGroupDisplayWidget::constructWidgetForIndex(int rowIndex)
auto widget = new CardInfoPictureWithTextOverlayWidget(getLayoutParent(), true); auto widget = new CardInfoPictureWithTextOverlayWidget(getLayoutParent(), true);
widget->setScaleFactor(cardSizeWidget->getSlider()->value()); widget->setScaleFactor(cardSizeWidget->getSlider()->value());
widget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, cardProviderId)); widget->setCard(CardDatabaseManager::getInstance()->getCard({cardName, cardProviderId}));
connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &CardGroupDisplayWidget::onClick); connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &CardGroupDisplayWidget::onClick);
connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &CardGroupDisplayWidget::onHover); connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &CardGroupDisplayWidget::onHover);

View file

@ -89,7 +89,7 @@ QWidget *FlatCardGroupDisplayWidget::constructWidgetForIndex(int row)
auto widget = new CardInfoPictureWithTextOverlayWidget(flowWidget, true); auto widget = new CardInfoPictureWithTextOverlayWidget(flowWidget, true);
widget->setScaleFactor(cardSizeWidget->getSlider()->value()); widget->setScaleFactor(cardSizeWidget->getSlider()->value());
widget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, cardProviderId)); widget->setCard(CardDatabaseManager::getInstance()->getCard({cardName, cardProviderId}));
connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &FlatCardGroupDisplayWidget::onClick); connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &FlatCardGroupDisplayWidget::onClick);
connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &FlatCardGroupDisplayWidget::onHover); connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &FlatCardGroupDisplayWidget::onHover);

View file

@ -11,10 +11,7 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <utility> #include <utility>
CardInfoDisplayWidget::CardInfoDisplayWidget(const QString &cardName, CardInfoDisplayWidget::CardInfoDisplayWidget(const CardRef &cardRef, QWidget *parent, Qt::WindowFlags flags)
const QString &providerId,
QWidget *parent,
Qt::WindowFlags flags)
: QFrame(parent, flags), aspectRatio((qreal)CARD_HEIGHT / (qreal)CARD_WIDTH), info(nullptr) : QFrame(parent, flags), aspectRatio((qreal)CARD_HEIGHT / (qreal)CARD_WIDTH), info(nullptr)
{ {
setContentsMargins(3, 3, 3, 3); setContentsMargins(3, 3, 3, 3);
@ -22,7 +19,7 @@ CardInfoDisplayWidget::CardInfoDisplayWidget(const QString &cardName,
pic->setObjectName("pic"); pic->setObjectName("pic");
text = new CardInfoTextWidget(); text = new CardInfoTextWidget();
text->setObjectName("text"); text->setObjectName("text");
connect(text, &CardInfoTextWidget::linkActivated, this, [this](const QString &card) { setCard(card); }); connect(text, &CardInfoTextWidget::linkActivated, this, [this](const QString &card) { setCard({card}); });
auto *layout = new QVBoxLayout(); auto *layout = new QVBoxLayout();
layout->setObjectName("layout"); layout->setObjectName("layout");
@ -40,7 +37,7 @@ CardInfoDisplayWidget::CardInfoDisplayWidget(const QString &cardName,
pic->setFixedHeight(pixmapHeight); pic->setFixedHeight(pixmapHeight);
setFixedWidth(pixmapWidth + 150); setFixedWidth(pixmapWidth + 150);
setCard(cardName, providerId); setCard(cardRef);
// ensure our parent gets a valid size to position us correctly // ensure our parent gets a valid size to position us correctly
resize(width(), sizeHint().height()); resize(width(), sizeHint().height());
@ -58,11 +55,11 @@ void CardInfoDisplayWidget::setCard(CardInfoPtr card)
pic->setCard(info); pic->setCard(info);
} }
void CardInfoDisplayWidget::setCard(const QString &cardName, const QString &providerId) void CardInfoDisplayWidget::setCard(const CardRef &cardRef)
{ {
setCard(CardDatabaseManager::getInstance()->guessCard(cardName, providerId)); setCard(CardDatabaseManager::getInstance()->guessCard(cardRef));
if (info == nullptr) { if (info == nullptr) {
text->setInvalidCardName(cardName); text->setInvalidCardName(cardRef.name);
} }
} }

View file

@ -2,6 +2,7 @@
#define CARDINFOWIDGET_H #define CARDINFOWIDGET_H
#include "../../../../game/cards/card_info.h" #include "../../../../game/cards/card_info.h"
#include "card_ref.h"
#include <QComboBox> #include <QComboBox>
#include <QFrame> #include <QFrame>
@ -22,14 +23,11 @@ private:
CardInfoTextWidget *text; CardInfoTextWidget *text;
public: public:
explicit CardInfoDisplayWidget(const QString &cardName, explicit CardInfoDisplayWidget(const CardRef &cardRef, QWidget *parent = nullptr, Qt::WindowFlags f = {});
const QString &providerId,
QWidget *parent = nullptr,
Qt::WindowFlags f = {});
public slots: public slots:
void setCard(CardInfoPtr card); void setCard(CardInfoPtr card);
void setCard(const QString &cardName, const QString &providerId = QString()); void setCard(const CardRef &cardRef);
void setCard(AbstractCardItem *card); void setCard(AbstractCardItem *card);
private slots: private slots:

View file

@ -62,7 +62,7 @@ CardInfoFrameWidget::CardInfoFrameWidget(const QString &cardName, QWidget *paren
setViewMode(SettingsCache::instance().getCardInfoViewMode()); setViewMode(SettingsCache::instance().getCardInfoViewMode());
// TODO: Change this to be by UUID // TODO: Change this to be by UUID
setCard(CardDatabaseManager::getInstance()->getCard(cardName)); setCard(CardDatabaseManager::getInstance()->getCardInfo(cardName));
} }
void CardInfoFrameWidget::retranslateUi() void CardInfoFrameWidget::retranslateUi()
@ -166,12 +166,12 @@ void CardInfoFrameWidget::setCard(CardInfoPtr card)
void CardInfoFrameWidget::setCard(const QString &cardName) void CardInfoFrameWidget::setCard(const QString &cardName)
{ {
setCard(CardDatabaseManager::getInstance()->guessCard(cardName)); setCard(CardDatabaseManager::getInstance()->guessCard({cardName}));
} }
void CardInfoFrameWidget::setCard(const QString &cardName, const QString &providerId) void CardInfoFrameWidget::setCard(const CardRef &cardRef)
{ {
setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, providerId)); setCard(CardDatabaseManager::getInstance()->getCard(cardRef));
} }
void CardInfoFrameWidget::setCard(AbstractCardItem *card) void CardInfoFrameWidget::setCard(AbstractCardItem *card)

View file

@ -2,6 +2,7 @@
#define CARDFRAME_H #define CARDFRAME_H
#include "../../../../game/cards/card_info.h" #include "../../../../game/cards/card_info.h"
#include "card_ref.h"
#include <QPushButton> #include <QPushButton>
#include <QTabWidget> #include <QTabWidget>
@ -46,7 +47,7 @@ public:
public slots: public slots:
void setCard(CardInfoPtr card); void setCard(CardInfoPtr card);
void setCard(const QString &cardName); void setCard(const QString &cardName);
void setCard(const QString &cardName, const QString &providerId); void setCard(const CardRef &cardRef);
void setCard(AbstractCardItem *card); void setCard(AbstractCardItem *card);
void viewTransformation(); void viewTransformation();
void clearCard(); void clearCard();

View file

@ -374,7 +374,7 @@ QMenu *CardInfoPictureWidget::createViewRelatedCardsMenu()
QList<CardRelation *> relatedCards = info->getAllRelatedCards(); QList<CardRelation *> relatedCards = info->getAllRelatedCards();
auto relatedCardExists = [](const CardRelation *cardRelation) { auto relatedCardExists = [](const CardRelation *cardRelation) {
return CardDatabaseManager::getInstance()->getCard(cardRelation->getName()) != nullptr; return CardDatabaseManager::getInstance()->getCardInfo(cardRelation->getName()) != nullptr;
}; };
bool atLeastOneGoodRelationFound = std::any_of(relatedCards.begin(), relatedCards.end(), relatedCardExists); bool atLeastOneGoodRelationFound = std::any_of(relatedCards.begin(), relatedCards.end(), relatedCardExists);
@ -388,7 +388,7 @@ QMenu *CardInfoPictureWidget::createViewRelatedCardsMenu()
const auto &relatedCardName = relatedCard->getName(); const auto &relatedCardName = relatedCard->getName();
QAction *viewCard = viewRelatedCards->addAction(relatedCardName); QAction *viewCard = viewRelatedCards->addAction(relatedCardName);
connect(viewCard, &QAction::triggered, this, [this, &relatedCardName] { connect(viewCard, &QAction::triggered, this, [this, &relatedCardName] {
emit cardChanged(CardDatabaseManager::getInstance()->getCard(relatedCardName)); emit cardChanged(CardDatabaseManager::getInstance()->getCardInfo(relatedCardName));
}); });
viewRelatedCards->addAction(viewCard); viewRelatedCards->addAction(viewCard);
} }

View file

@ -87,7 +87,7 @@ QHash<QString, int> ManaBaseWidget::analyzeManaBase()
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
if (info) { if (info) {
auto devotion = determineManaProduction(info->getText()); auto devotion = determineManaProduction(info->getText());
mergeManaCounts(manaBaseMap, devotion); mergeManaCounts(manaBaseMap, devotion);

View file

@ -53,7 +53,7 @@ std::unordered_map<int, int> ManaCurveWidget::analyzeManaCurve()
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
if (info) { if (info) {
int cmc = info->getCmc().toInt(); int cmc = info->getCmc().toInt();
manaCurveMap[cmc]++; manaCurveMap[cmc]++;

View file

@ -55,7 +55,7 @@ std::unordered_map<char, int> ManaDevotionWidget::analyzeManaDevotion()
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
if (info) { if (info) {
auto devotion = countManaSymbols(info->getManaCost()); auto devotion = countManaSymbols(info->getManaCost());
mergeManaCounts(manaDevotionMap, devotion); mergeManaCounts(manaDevotionMap, devotion);

View file

@ -136,16 +136,16 @@ void DeckEditorDatabaseDisplayWidget::clearAllDatabaseFilters()
void DeckEditorDatabaseDisplayWidget::updateCard(const QModelIndex &current, const QModelIndex & /*previous*/) void DeckEditorDatabaseDisplayWidget::updateCard(const QModelIndex &current, const QModelIndex & /*previous*/)
{ {
const QString cardName = current.sibling(current.row(), 0).data().toString(); const QString cardName = current.sibling(current.row(), 0).data().toString();
const QString cardProviderID = CardDatabaseManager::getInstance()->getPreferredPrintingProviderIdForCard(cardName); const QString cardProviderID = CardDatabaseManager::getInstance()->getPreferredPrintingProviderId(cardName);
if (!current.isValid()) { if (!current.isValid()) {
return; return;
} }
if (!current.model()->hasChildren(current.sibling(current.row(), 0))) { if (!current.model()->hasChildren(current.sibling(current.row(), 0))) {
CardInfoPtr card = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, cardProviderID); CardInfoPtr card = CardDatabaseManager::getInstance()->getCard({cardName, cardProviderID});
if (!card) { if (!card) {
card = CardDatabaseManager::getInstance()->getCard(cardName); card = CardDatabaseManager::getInstance()->getCardInfo(cardName);
} }
emit cardChanged(card); emit cardChanged(card);
} }
@ -180,7 +180,7 @@ CardInfoPtr DeckEditorDatabaseDisplayWidget::currentCardInfo() const
const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString();
return CardDatabaseManager::getInstance()->getCard(cardName); return CardDatabaseManager::getInstance()->getCardInfo(cardName);
} }
void DeckEditorDatabaseDisplayWidget::databaseCustomMenu(QPoint point) void DeckEditorDatabaseDisplayWidget::databaseCustomMenu(QPoint point)

View file

@ -227,8 +227,7 @@ CardInfoPtr DeckEditorDeckDockWidget::getCurrentCard()
if (!current.model()->hasChildren(current.sibling(current.row(), 0))) { if (!current.model()->hasChildren(current.sibling(current.row(), 0))) {
QString cardName = current.sibling(current.row(), 1).data().toString(); QString cardName = current.sibling(current.row(), 1).data().toString();
QString providerId = current.sibling(current.row(), 4).data().toString(); QString providerId = current.sibling(current.row(), 4).data().toString();
if (CardInfoPtr selectedCard = if (CardInfoPtr selectedCard = CardDatabaseManager::getInstance()->getCard({cardName, providerId})) {
CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, providerId)) {
return selectedCard; return selectedCard;
} }
} }
@ -287,11 +286,9 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox()
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->toCardRef());
currentCard->getName(), currentCard->getCardProviderId());
if (info) { if (info) {
bannerCardSet.insert( bannerCardSet.insert({currentCard->getName(), currentCard->getCardProviderId()});
QPair<QString, QString>(currentCard->getName(), currentCard->getCardProviderId()));
} }
} }
} }
@ -312,13 +309,13 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox()
int restoredIndex = bannerCardComboBox->findText(currentText); int restoredIndex = bannerCardComboBox->findText(currentText);
if (restoredIndex != -1) { if (restoredIndex != -1) {
bannerCardComboBox->setCurrentIndex(restoredIndex); bannerCardComboBox->setCurrentIndex(restoredIndex);
if (deckModel->getDeckList()->getBannerCard().second != if (deckModel->getDeckList()->getBannerCard().providerId !=
bannerCardComboBox->currentData().value<QPair<QString, QString>>().second) { bannerCardComboBox->currentData().value<QPair<QString, QString>>().second) {
setBannerCard(restoredIndex); setBannerCard(restoredIndex);
} }
} else { } else {
// Add a placeholder "-" and set it as the current selection // Add a placeholder "-" and set it as the current selection
int bannerIndex = bannerCardComboBox->findText(deckModel->getDeckList()->getBannerCard().first); int bannerIndex = bannerCardComboBox->findText(deckModel->getDeckList()->getBannerCard().name);
if (bannerIndex != -1) { if (bannerIndex != -1) {
bannerCardComboBox->setCurrentIndex(bannerIndex); bannerCardComboBox->setCurrentIndex(bannerIndex);
} else { } else {
@ -333,8 +330,8 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox()
void DeckEditorDeckDockWidget::setBannerCard(int /* changedIndex */) void DeckEditorDeckDockWidget::setBannerCard(int /* changedIndex */)
{ {
auto cardAndId = bannerCardComboBox->currentData().value<QPair<QString, QString>>(); auto [name, id] = bannerCardComboBox->currentData().value<QPair<QString, QString>>();
deckModel->getDeckList()->setBannerCard(cardAndId); deckModel->getDeckList()->setBannerCard({name, id});
deckEditor->setModified(true); deckEditor->setModified(true);
emit deckModified(); emit deckModified();
} }
@ -360,7 +357,7 @@ void DeckEditorDeckDockWidget::setDeck(DeckLoader *_deck)
nameEdit->setText(deckModel->getDeckList()->getName()); nameEdit->setText(deckModel->getDeckList()->getName());
commentsEdit->setText(deckModel->getDeckList()->getComments()); commentsEdit->setText(deckModel->getDeckList()->getComments());
bannerCardComboBox->setCurrentText(deckModel->getDeckList()->getBannerCard().first); bannerCardComboBox->setCurrentText(deckModel->getDeckList()->getBannerCard().name);
updateBannerCardComboBox(); updateBannerCardComboBox();
updateHash(); updateHash();
deckModel->sort(deckView->header()->sortIndicatorSection(), deckView->header()->sortIndicatorOrder()); deckModel->sort(deckView->header()->sortIndicatorSection(), deckView->header()->sortIndicatorOrder());
@ -476,9 +473,9 @@ bool DeckEditorDeckDockWidget::swapCard(const QModelIndex &currentIndex)
const QString otherZoneName = zoneName == DECK_ZONE_MAIN ? DECK_ZONE_SIDE : DECK_ZONE_MAIN; const QString otherZoneName = zoneName == DECK_ZONE_MAIN ? DECK_ZONE_SIDE : DECK_ZONE_MAIN;
// Third argument (true) says create the card no matter what, even if not in DB // Third argument (true) says create the card no matter what, even if not in DB
QModelIndex newCardIndex = QModelIndex newCardIndex = deckModel->addCard(
deckModel->addCard(cardName, CardDatabaseManager::getInstance()->getSpecificPrinting(cardName, cardProviderID), cardName, CardDatabaseManager::getInstance()->getSpecificPrinting({cardName, cardProviderID}), otherZoneName,
otherZoneName, true); true);
recursiveExpand(newCardIndex); recursiveExpand(newCardIndex);
return true; return true;

View file

@ -44,8 +44,7 @@ PrintingSelectorCardOverlayWidget::PrintingSelectorCardOverlayWidget(QWidget *pa
cardInfoPicture = new CardInfoPictureWidget(this); cardInfoPicture = new CardInfoPictureWidget(this);
cardInfoPicture->setMinimumSize(0, 0); cardInfoPicture->setMinimumSize(0, 0);
cardInfoPicture->setScaleFactor(cardSizeSlider->value()); cardInfoPicture->setScaleFactor(cardSizeSlider->value());
setCard = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(rootCard->getName(), setCard = CardDatabaseManager::getInstance()->getCard({rootCard->getName(), _printingInfo.getProperty("uuid")});
_printingInfo.getProperty("uuid"));
cardInfoPicture->setCard(setCard); cardInfoPicture->setCard(setCard);
mainLayout->addWidget(cardInfoPicture); mainLayout->addWidget(cardInfoPicture);
@ -177,7 +176,7 @@ void PrintingSelectorCardOverlayWidget::customMenu(QPoint point)
if (preferredProviderId.isEmpty() || preferredProviderId != cardProviderId) { if (preferredProviderId.isEmpty() || preferredProviderId != cardProviderId) {
auto *pinAction = preferenceMenu->addAction(tr("Pin Printing")); auto *pinAction = preferenceMenu->addAction(tr("Pin Printing"));
connect(pinAction, &QAction::triggered, this, [this, cardProviderId]() { connect(pinAction, &QAction::triggered, this, [this, cardProviderId]() {
SettingsCache::instance().cardOverrides().setCardPreferenceOverride(rootCard->getName(), cardProviderId); SettingsCache::instance().cardOverrides().setCardPreferenceOverride({rootCard->getName(), cardProviderId});
emit cardPreferenceChanged(); emit cardPreferenceChanged();
}); });
} else { } else {
@ -199,7 +198,7 @@ void PrintingSelectorCardOverlayWidget::customMenu(QPoint point)
const QString &relatedCardName = rel->getName(); const QString &relatedCardName = rel->getName();
QAction *relatedCard = relatedMenu->addAction(relatedCardName); QAction *relatedCard = relatedMenu->addAction(relatedCardName);
connect(relatedCard, &QAction::triggered, deckEditor, [this, relatedCardName] { connect(relatedCard, &QAction::triggered, deckEditor, [this, relatedCardName] {
deckEditor->updateCard(CardDatabaseManager::getInstance()->getCard(relatedCardName)); deckEditor->updateCard(CardDatabaseManager::getInstance()->getCardInfo(relatedCardName));
deckEditor->showPrintingSelector(); deckEditor->showPrintingSelector();
}); });
} }

View file

@ -228,13 +228,13 @@ void VisualDatabaseDisplayWidget::populateCards()
QVariant name = databaseDisplayModel->data(index, Qt::DisplayRole); QVariant name = databaseDisplayModel->data(index, Qt::DisplayRole);
qCDebug(VisualDatabaseDisplayLog) << name.toString(); qCDebug(VisualDatabaseDisplayLog) << name.toString();
if (CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(name.toString())) { if (CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(name.toString())) {
if (setFilter) { if (setFilter) {
SetToPrintingsMap setMap = info->getSets(); SetToPrintingsMap setMap = info->getSets();
if (setMap.contains(setFilter->term())) { if (setMap.contains(setFilter->term())) {
for (PrintingInfo printing : setMap[setFilter->term()]) { for (PrintingInfo printing : setMap[setFilter->term()]) {
addCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId( addCard(CardDatabaseManager::getInstance()->getCard(
name.toString(), printing.getProperty("uuid"))); {name.toString(), printing.getProperty("uuid")}));
} }
} }
} else { } else {
@ -294,13 +294,13 @@ void VisualDatabaseDisplayWidget::loadNextPage()
for (int row = start; row < end; ++row) { for (int row = start; row < end; ++row) {
QModelIndex index = databaseDisplayModel->index(row, CardDatabaseModel::NameColumn); QModelIndex index = databaseDisplayModel->index(row, CardDatabaseModel::NameColumn);
QVariant name = databaseDisplayModel->data(index, Qt::DisplayRole); QVariant name = databaseDisplayModel->data(index, Qt::DisplayRole);
if (CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(name.toString())) { if (CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(name.toString())) {
if (setFilter) { if (setFilter) {
SetToPrintingsMap setMap = info->getSets(); SetToPrintingsMap setMap = info->getSets();
if (setMap.contains(setFilter->term())) { if (setMap.contains(setFilter->term())) {
for (PrintingInfo printing : setMap[setFilter->term()]) { for (PrintingInfo printing : setMap[setFilter->term()]) {
addCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId( addCard(CardDatabaseManager::getInstance()->getCard(
name.toString(), printing.getProperty("uuid"))); {name.toString(), printing.getProperty("uuid")}));
} }
} }
} else { } else {

View file

@ -101,8 +101,7 @@ QList<CardInfoPtr> VisualDeckEditorSampleHandWidget::getRandomCards(int amountTo
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->toCardRef());
currentCard->getName(), currentCard->getCardProviderId());
if (info) { if (info) {
mainDeckCards.append(info); mainDeckCards.append(info);
} }

View file

@ -42,7 +42,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
if (!searchBar->hasFocus()) if (!searchBar->hasFocus())
return; return;
CardInfoPtr card = CardDatabaseManager::getInstance()->getCard(searchBar->text()); CardInfoPtr card = CardDatabaseManager::getInstance()->getCardInfo(searchBar->text());
if (card) { if (card) {
emit cardAdditionRequested(card); emit cardAdditionRequested(card);
} }
@ -103,7 +103,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
// Search button functionality // Search button functionality
searchPushButton = new QPushButton(this); searchPushButton = new QPushButton(this);
connect(searchPushButton, &QPushButton::clicked, this, [=, this]() { connect(searchPushButton, &QPushButton::clicked, this, [=, this]() {
CardInfoPtr card = CardDatabaseManager::getInstance()->getCard(searchBar->text()); CardInfoPtr card = CardDatabaseManager::getInstance()->getCardInfo(searchBar->text());
if (card) { if (card) {
emit cardAdditionRequested(card); emit cardAdditionRequested(card);
} }

View file

@ -74,10 +74,9 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
if (!deckLoadSuccess) { if (!deckLoadSuccess) {
return; return;
} }
auto bannerCard = deckLoader->getBannerCard().first.isEmpty() auto bannerCard = deckLoader->getBannerCard().name.isEmpty()
? CardInfoPtr() ? CardInfoPtr()
: CardDatabaseManager::getInstance()->getCardByNameAndProviderId( : CardDatabaseManager::getInstance()->getCard(deckLoader->getBannerCard());
deckLoader->getBannerCard().first, deckLoader->getBannerCard().second);
bannerCardDisplayWidget->setCard(bannerCard); bannerCardDisplayWidget->setCard(bannerCard);
bannerCardDisplayWidget->setFontSize(24); bannerCardDisplayWidget->setFontSize(24);
@ -91,7 +90,7 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
bannerCardComboBox = new QComboBox(this); bannerCardComboBox = new QComboBox(this);
bannerCardComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); bannerCardComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
bannerCardComboBox->setObjectName("bannerCardComboBox"); bannerCardComboBox->setObjectName("bannerCardComboBox");
bannerCardComboBox->setCurrentText(deckLoader->getBannerCard().first); bannerCardComboBox->setCurrentText(deckLoader->getBannerCard().name);
bannerCardComboBox->installEventFilter(new NoScrollFilter()); bannerCardComboBox->installEventFilter(new NoScrollFilter());
connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&DeckPreviewWidget::setBannerCard); &DeckPreviewWidget::setBannerCard);
@ -161,7 +160,7 @@ QString DeckPreviewWidget::getColorIdentity()
QSet<QChar> colorSet; // A set to collect unique color symbols (e.g., W, U, B, R, G) QSet<QChar> colorSet; // A set to collect unique color symbols (e.g., W, U, B, R, G)
for (const QString &cardName : cardList) { for (const QString &cardName : cardList) {
CardInfoPtr currentCard = CardDatabaseManager::getInstance()->getCard(cardName); CardInfoPtr currentCard = CardDatabaseManager::getInstance()->getCardInfo(cardName);
if (currentCard) { if (currentCard) {
QString colors = currentCard->getColors(); // Assuming this returns something like "WUB" QString colors = currentCard->getColors(); // Assuming this returns something like "WUB"
for (const QChar &color : colors) { for (const QChar &color : colors) {
@ -274,7 +273,7 @@ void DeckPreviewWidget::updateBannerCardComboBox()
bannerCardComboBox->setCurrentIndex(restoredIndex); bannerCardComboBox->setCurrentIndex(restoredIndex);
} else { } else {
// Add a placeholder "-" and set it as the current selection // Add a placeholder "-" and set it as the current selection
int bannerIndex = bannerCardComboBox->findText(deckLoader->getBannerCard().first); int bannerIndex = bannerCardComboBox->findText(deckLoader->getBannerCard().name);
if (bannerIndex != -1) { if (bannerIndex != -1) {
bannerCardComboBox->setCurrentIndex(bannerIndex); bannerCardComboBox->setCurrentIndex(bannerIndex);
} else { } else {
@ -290,11 +289,11 @@ void DeckPreviewWidget::updateBannerCardComboBox()
void DeckPreviewWidget::setBannerCard(int /* changedIndex */) void DeckPreviewWidget::setBannerCard(int /* changedIndex */)
{ {
auto nameAndId = bannerCardComboBox->currentData().value<QPair<QString, QString>>(); auto [name, id] = bannerCardComboBox->currentData().value<QPair<QString, QString>>();
deckLoader->setBannerCard(nameAndId); CardRef cardRef = {name, id};
deckLoader->setBannerCard(cardRef);
deckLoader->saveToFile(filePath, DeckLoader::getFormatFromName(filePath)); deckLoader->saveToFile(filePath, DeckLoader::getFormatFromName(filePath));
bannerCardDisplayWidget->setCard( bannerCardDisplayWidget->setCard(CardDatabaseManager::getInstance()->getCard(cardRef));
CardDatabaseManager::getInstance()->getCardByNameAndProviderId(nameAndId.first, nameAndId.second));
} }
void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance) void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)

View file

@ -66,7 +66,7 @@ void DeckListModel::rebuildTree()
continue; continue;
} }
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
QString groupCriteria = getGroupCriteriaForCard(info); QString groupCriteria = getGroupCriteriaForCard(info);
auto *groupNode = dynamic_cast<InnerDecklistNode *>(node->findChild(groupCriteria)); auto *groupNode = dynamic_cast<InnerDecklistNode *>(node->findChild(groupCriteria));
@ -337,7 +337,7 @@ DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName,
return nullptr; return nullptr;
} }
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(cardName); CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(cardName);
if (!info) { if (!info) {
return nullptr; return nullptr;
} }
@ -375,8 +375,7 @@ QModelIndex DeckListModel::addCard(const QString &cardName,
const QString &zoneName, const QString &zoneName,
bool abAddAnyway) bool abAddAnyway)
{ {
CardInfoPtr cardInfo = CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard({cardName, printingInfo.getProperty("uuid")});
CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, printingInfo.getProperty("uuid"));
if (cardInfo == nullptr) { if (cardInfo == nullptr) {
if (abAddAnyway) { if (abAddAnyway) {
@ -559,8 +558,7 @@ QList<CardInfoPtr> DeckListModel::getCardsAsCardInfoPtrs() const
if (!currentCard) if (!currentCard)
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->toCardRef());
currentCard->getName(), currentCard->getCardProviderId());
if (info) { if (info) {
cards.append(info); cards.append(info);
} else { } else {
@ -593,8 +591,7 @@ QList<CardInfoPtr> DeckListModel::getCardsAsCardInfoPtrsForZone(QString zoneName
if (!currentCard) if (!currentCard)
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->toCardRef());
currentCard->getName(), currentCard->getCardProviderId());
if (info) { if (info) {
cards.append(info); cards.append(info);
} else { } else {

View file

@ -281,7 +281,7 @@ QString DeckLoader::exportDeckToDecklist(DecklistWebsite website)
// Set up the function to call // Set up the function to call
auto formatDeckListForExport = [&mainBoardCards, &sideBoardCards](const auto *node, const auto *card) { auto formatDeckListForExport = [&mainBoardCards, &sideBoardCards](const auto *node, const auto *card) {
// Get the card name // Get the card name
CardInfoPtr dbCard = CardDatabaseManager::getInstance()->getCard(card->getName()); CardInfoPtr dbCard = CardDatabaseManager::getInstance()->getCardInfo(card->getName());
if (!dbCard || dbCard->getIsToken()) { if (!dbCard || dbCard->getIsToken()) {
// If it's a token, we don't care about the card. // If it's a token, we don't care about the card.
return; return;
@ -466,7 +466,7 @@ void DeckLoader::saveToStream_DeckZone(QTextStream &out,
for (int j = 0; j < zoneNode->size(); j++) { for (int j = 0; j < zoneNode->size(); j++) {
auto *card = dynamic_cast<DecklistCardNode *>(zoneNode->at(j)); auto *card = dynamic_cast<DecklistCardNode *>(zoneNode->at(j));
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(card->getName()); CardInfoPtr info = CardDatabaseManager::getInstance()->getCardInfo(card->getName());
QString cardType = info ? info->getMainCardType() : "unknown"; QString cardType = info ? info->getMainCardType() : "unknown";
cardsByType.insert(cardType, card); cardsByType.insert(cardType, card);
@ -582,7 +582,7 @@ bool DeckLoader::convertToCockatriceFormat(QString fileName)
QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneName) QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneName)
{ {
CardInfoPtr card = CardDatabaseManager::getInstance()->getCard(cardName); CardInfoPtr card = CardDatabaseManager::getInstance()->getCardInfo(cardName);
if (card && card->getIsToken()) { if (card && card->getIsToken()) {
return DECK_ZONE_TOKENS; return DECK_ZONE_TOKENS;
@ -594,7 +594,7 @@ QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneNam
QString DeckLoader::getCompleteCardName(const QString &cardName) const QString DeckLoader::getCompleteCardName(const QString &cardName) const
{ {
if (CardDatabaseManager::getInstance()) { if (CardDatabaseManager::getInstance()) {
CardInfoPtr temp = CardDatabaseManager::getInstance()->guessCard(cardName); CardInfoPtr temp = CardDatabaseManager::getInstance()->guessCard({cardName});
if (temp) { if (temp) {
return temp->getName(); return temp->getName();
} }

View file

@ -70,7 +70,7 @@ void DeckStatsInterface::analyzeDeck(DeckList *deck)
void DeckStatsInterface::copyDeckWithoutTokens(DeckList &source, DeckList &destination) void DeckStatsInterface::copyDeckWithoutTokens(DeckList &source, DeckList &destination)
{ {
auto copyIfNotAToken = [this, &destination](const auto node, const auto card) { auto copyIfNotAToken = [this, &destination](const auto node, const auto card) {
CardInfoPtr dbCard = cardDatabase.getCard(card->getName()); CardInfoPtr dbCard = cardDatabase.getCardInfo(card->getName());
if (dbCard && !dbCard->getIsToken()) { if (dbCard && !dbCard->getIsToken()) {
DecklistCardNode *addedCard = destination.addCard(card->getName(), node->getName(), -1); DecklistCardNode *addedCard = destination.addCard(card->getName(), node->getName(), -1);
addedCard->setNumber(card->getNumber()); addedCard->setNumber(card->getNumber());

View file

@ -152,7 +152,7 @@ void DlgEditTokens::actAddToken()
name = getTextWithMax(this, tr("Add token"), tr("Please enter the name of the token:")); name = getTextWithMax(this, tr("Add token"), tr("Please enter the name of the token:"));
if (name.isEmpty()) if (name.isEmpty())
return; return;
if (databaseModel->getDatabase()->getCard(name)) { if (databaseModel->getDatabase()->getCardInfo(name)) {
QMessageBox::critical(this, tr("Error"), QMessageBox::critical(this, tr("Error"),
tr("The chosen name conflicts with an existing card or token.\nMake sure to enable " tr("The chosen name conflicts with an existing card or token.\nMake sure to enable "
"the 'Token' set in the \"Manage sets\" dialog to display them correctly.")); "the 'Token' set in the \"Manage sets\" dialog to display them correctly."));

View file

@ -222,7 +222,7 @@ QMap<QString, int> DlgSelectSetForCards::getSetsForCards()
if (!currentCard) if (!currentCard)
continue; continue;
CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
if (!infoPtr) if (!infoPtr)
continue; continue;
@ -290,15 +290,15 @@ void DlgSelectSetForCards::updateCardLists()
if (!found) { if (!found) {
// The card was not in any selected set // The card was not in any selected set
CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(uneditedCardsFlowWidget); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(uneditedCardsFlowWidget);
picture_widget->setCard(infoPtr); picture_widget->setCard(infoPtr);
uneditedCardsFlowWidget->addWidget(picture_widget); uneditedCardsFlowWidget->addWidget(picture_widget);
} else { } else {
CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCard(
currentCard->getName(), CardDatabaseManager::getInstance() {currentCard->getName(), CardDatabaseManager::getInstance()
->getSpecificPrinting(currentCard->getName(), foundSetName, "") ->getSpecificPrinting(currentCard->getName(), foundSetName, "")
.getProperty("uuid")); .getProperty("uuid")});
CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget);
picture_widget->setCard(infoPtr); picture_widget->setCard(infoPtr);
modifiedCardsFlowWidget->addWidget(picture_widget); modifiedCardsFlowWidget->addWidget(picture_widget);
@ -376,7 +376,7 @@ QMap<QString, QStringList> DlgSelectSetForCards::getCardsForSets()
if (!currentCard) if (!currentCard)
continue; continue;
CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); CardInfoPtr infoPtr = CardDatabaseManager::getInstance()->getCardInfo(currentCard->getName());
if (!infoPtr) if (!infoPtr)
continue; continue;
@ -626,17 +626,17 @@ void SetEntryWidget::updateCardDisplayWidgets()
for (const QString &cardName : possibleCards) { for (const QString &cardName : possibleCards) {
CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(cardListContainer); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(cardListContainer);
picture_widget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId( QString providerId =
cardName, CardDatabaseManager::getInstance()->getSpecificPrinting(cardName, setName, nullptr).getProperty("uuid");
CardDatabaseManager::getInstance()->getSpecificPrinting(cardName, setName, nullptr).getProperty("uuid"))); picture_widget->setCard(CardDatabaseManager::getInstance()->getCard({cardName, providerId}));
cardListContainer->addWidget(picture_widget); cardListContainer->addWidget(picture_widget);
} }
for (const QString &cardName : unusedCards) { for (const QString &cardName : unusedCards) {
CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(alreadySelectedCardListContainer); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(alreadySelectedCardListContainer);
picture_widget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId( QString providerId =
cardName, CardDatabaseManager::getInstance()->getSpecificPrinting(cardName, setName, nullptr).getProperty("uuid");
CardDatabaseManager::getInstance()->getSpecificPrinting(cardName, setName, nullptr).getProperty("uuid"))); picture_widget->setCard(CardDatabaseManager::getInstance()->getCard({cardName, providerId}));
alreadySelectedCardListContainer->addWidget(picture_widget); alreadySelectedCardListContainer->addWidget(picture_widget);
} }
} }

View file

@ -12,13 +12,9 @@
#include <QPainter> #include <QPainter>
#include <algorithm> #include <algorithm>
AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, const CardRef &cardRef, Player *_owner, int _id)
const QString &_name, : ArrowTarget(_owner, parent), id(_id), cardRef(cardRef), tapped(false), facedown(false), tapAngle(0),
const QString &_providerId, bgColor(Qt::transparent), isHovered(false), realZValue(0)
Player *_owner,
int _id)
: ArrowTarget(_owner, parent), id(_id), name(_name), providerId(_providerId), tapped(false), facedown(false),
tapAngle(0), bgColor(Qt::transparent), isHovered(false), realZValue(0)
{ {
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
setFlag(ItemIsSelectable); setFlag(ItemIsSelectable);
@ -37,7 +33,7 @@ AbstractCardItem::AbstractCardItem(QGraphicsItem *parent,
AbstractCardItem::~AbstractCardItem() AbstractCardItem::~AbstractCardItem()
{ {
emit deleteCardInfoPopup(name); emit deleteCardInfoPopup(cardRef.name);
} }
QRectF AbstractCardItem::boundingRect() const QRectF AbstractCardItem::boundingRect() const
@ -61,13 +57,13 @@ void AbstractCardItem::pixmapUpdated()
void AbstractCardItem::refreshCardInfo() void AbstractCardItem::refreshCardInfo()
{ {
info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(name, providerId); info = CardDatabaseManager::getInstance()->getCard(cardRef);
if (!info && !name.isEmpty()) { if (!info && !cardRef.name.isEmpty()) {
QVariantHash properties = QVariantHash(); QVariantHash properties = QVariantHash();
info = CardInfo::newInstance(name, "", true, QVariantHash(), QList<CardRelation *>(), QList<CardRelation *>(), info = CardInfo::newInstance(cardRef.name, "", true, QVariantHash(), QList<CardRelation *>(),
SetToPrintingsMap(), false, false, -1, false); QList<CardRelation *>(), SetToPrintingsMap(), false, false, -1, false);
} }
if (info.data()) { if (info.data()) {
connect(info.data(), &CardInfo::pixmapUpdated, this, &AbstractCardItem::pixmapUpdated); connect(info.data(), &CardInfo::pixmapUpdated, this, &AbstractCardItem::pixmapUpdated);
@ -114,7 +110,7 @@ void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedS
QPixmap translatedPixmap; QPixmap translatedPixmap;
bool paintImage = true; bool paintImage = true;
if (facedown || name.isEmpty()) { if (facedown || cardRef.name.isEmpty()) {
// never reveal card color, always paint the card back // never reveal card color, always paint the card back
PictureLoader::getCardBackPixmap(translatedPixmap, translatedSize.toSize()); PictureLoader::getCardBackPixmap(translatedPixmap, translatedSize.toSize());
} else { } else {
@ -154,7 +150,7 @@ void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedS
if (SettingsCache::instance().debug().getShowCardId()) { if (SettingsCache::instance().debug().getShowCardId()) {
prefix = "#" + QString::number(id) + " "; prefix = "#" + QString::number(id) + " ";
} }
nameStr = prefix + name; nameStr = prefix + cardRef.name;
} }
painter->drawText(QRectF(3 * scaleFactor, 3 * scaleFactor, translatedSize.width() - 6 * scaleFactor, painter->drawText(QRectF(3 * scaleFactor, 3 * scaleFactor, translatedSize.width() - 6 * scaleFactor,
translatedSize.height() - 6 * scaleFactor), translatedSize.height() - 6 * scaleFactor),
@ -188,30 +184,17 @@ void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *
painter->restore(); painter->restore();
} }
void AbstractCardItem::setName(const QString &_name) void AbstractCardItem::setCardRef(const CardRef &_cardRef)
{ {
if (name == _name) if (cardRef == _cardRef) {
return;
emit deleteCardInfoPopup(name);
if (info)
disconnect(info.data(), nullptr, this, nullptr);
name = _name;
refreshCardInfo();
}
void AbstractCardItem::setProviderId(const QString &_providerId)
{
if (providerId == _providerId) {
return; return;
} }
emit deleteCardInfoPopup(name); emit deleteCardInfoPopup(cardRef.name);
if (info) { if (info) {
disconnect(info.data(), nullptr, this, nullptr); disconnect(info.data(), nullptr, this, nullptr);
} }
providerId = _providerId; cardRef = _cardRef;
refreshCardInfo(); refreshCardInfo();
} }
@ -299,7 +282,7 @@ void AbstractCardItem::setFaceDown(bool _facedown)
void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event) void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{ {
if ((event->modifiers() & Qt::AltModifier) && event->button() == Qt::LeftButton) { if ((event->modifiers() & Qt::AltModifier) && event->button() == Qt::LeftButton) {
emit cardShiftClicked(name); emit cardShiftClicked(cardRef.name);
} else if ((event->modifiers() & Qt::ControlModifier)) { } else if ((event->modifiers() & Qt::ControlModifier)) {
setSelected(!isSelected()); setSelected(!isSelected());
} else if (!isSelected()) { } else if (!isSelected()) {
@ -309,14 +292,14 @@ void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
if (event->button() == Qt::LeftButton) if (event->button() == Qt::LeftButton)
setCursor(Qt::ClosedHandCursor); setCursor(Qt::ClosedHandCursor);
else if (event->button() == Qt::MiddleButton) else if (event->button() == Qt::MiddleButton)
emit showCardInfoPopup(event->screenPos(), name, providerId); emit showCardInfoPopup(event->screenPos(), cardRef);
event->accept(); event->accept();
} }
void AbstractCardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void AbstractCardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{ {
if (event->button() == Qt::MiddleButton) if (event->button() == Qt::MiddleButton)
emit deleteCardInfoPopup(name); emit deleteCardInfoPopup(cardRef.name);
// This function ensures the parent function doesn't mess around with our selection. // This function ensures the parent function doesn't mess around with our selection.
event->accept(); event->accept();

View file

@ -3,6 +3,7 @@
#include "../cards/card_info.h" #include "../cards/card_info.h"
#include "arrow_target.h" #include "arrow_target.h"
#include "card_ref.h"
class Player; class Player;
@ -15,8 +16,7 @@ class AbstractCardItem : public ArrowTarget
protected: protected:
CardInfoPtr info; CardInfoPtr info;
int id; int id;
QString name; CardRef cardRef;
QString providerId;
bool tapped; bool tapped;
bool facedown; bool facedown;
int tapAngle; int tapAngle;
@ -34,7 +34,7 @@ public slots:
signals: signals:
void hovered(AbstractCardItem *card); void hovered(AbstractCardItem *card);
void showCardInfoPopup(const QPoint &pos, const QString &cardName, const QString &providerId); void showCardInfoPopup(const QPoint &pos, const CardRef &cardRef);
void deleteCardInfoPopup(QString cardName); void deleteCardInfoPopup(QString cardName);
void sigPixmapUpdated(); void sigPixmapUpdated();
void cardShiftClicked(QString cardName); void cardShiftClicked(QString cardName);
@ -49,8 +49,7 @@ public:
return Type; return Type;
} }
explicit AbstractCardItem(QGraphicsItem *parent = nullptr, explicit AbstractCardItem(QGraphicsItem *parent = nullptr,
const QString &_name = QString(), const CardRef &cardRef = {},
const QString &_providerId = QString(),
Player *_owner = nullptr, Player *_owner = nullptr,
int _id = -1); int _id = -1);
~AbstractCardItem() override; ~AbstractCardItem() override;
@ -73,14 +72,17 @@ public:
} }
QString getName() const QString getName() const
{ {
return name; return cardRef.name;
} }
void setName(const QString &_name = QString());
QString getProviderId() const QString getProviderId() const
{ {
return providerId; return cardRef.providerId;
}
void setCardRef(const CardRef &_cardRef);
CardRef getCardRef() const
{
return cardRef;
} }
void setProviderId(const QString &_providerId = QString());
qreal getRealZValue() const qreal getRealZValue() const
{ {
return realZValue; return realZValue;
@ -105,7 +107,7 @@ public:
void processHoverEvent(); void processHoverEvent();
void deleteCardInfoPopup() void deleteCardInfoPopup()
{ {
emit deleteCardInfoPopup(name); emit deleteCardInfoPopup(cardRef.name);
} }
protected: protected:

View file

@ -18,14 +18,9 @@
#include <QMenu> #include <QMenu>
#include <QPainter> #include <QPainter>
CardItem::CardItem(Player *_owner, CardItem::CardItem(Player *_owner, QGraphicsItem *parent, const CardRef &cardRef, int _cardid, CardZone *_zone)
QGraphicsItem *parent, : AbstractCardItem(parent, cardRef, _owner, _cardid), zone(_zone), attacking(false), destroyOnZoneChange(false),
const QString &_name, doesntUntap(false), dragItem(nullptr), attachedTo(nullptr)
const QString &_providerId,
int _cardid,
CardZone *_zone)
: AbstractCardItem(parent, _name, _providerId, _owner, _cardid), zone(_zone), attacking(false),
destroyOnZoneChange(false), doesntUntap(false), dragItem(nullptr), attachedTo(nullptr)
{ {
owner->addCard(this); owner->addCard(this);
@ -246,8 +241,7 @@ void CardItem::processCardInfo(const ServerInfo_Card &_info)
} }
setId(_info.id()); setId(_info.id());
setProviderId(QString::fromStdString(_info.provider_id())); setCardRef({QString::fromStdString(_info.name()), QString::fromStdString(_info.provider_id())});
setName(QString::fromStdString(_info.name()));
setAttacking(_info.attacking()); setAttacking(_info.attacking());
setFaceDown(_info.face_down()); setFaceDown(_info.face_down());
setPT(QString::fromStdString(_info.pt())); setPT(QString::fromStdString(_info.pt()));

View file

@ -51,8 +51,7 @@ public:
} }
explicit CardItem(Player *_owner, explicit CardItem(Player *_owner,
QGraphicsItem *parent = nullptr, QGraphicsItem *parent = nullptr,
const QString &_name = QString(), const CardRef &cardRef = {},
const QString &_providerId = QString(),
int _cardid = -1, int _cardid = -1,
CardZone *_zone = nullptr); CardZone *_zone = nullptr);
~CardItem() override; ~CardItem() override;

View file

@ -109,12 +109,25 @@ void CardDatabase::removeCard(CardInfoPtr card)
emit cardRemoved(card); emit cardRemoved(card);
} }
CardInfoPtr CardDatabase::getCard(const QString &cardName) const /**
* Looks up the generic cardInfo (the CardInfoPtr that does not refer to a specific printing) corresponding to the
* cardName.
*
* @param cardName The card name to look up
* @return A generic CardInfoPtr, or null if not corresponding CardInfo is found.
*/
CardInfoPtr CardDatabase::getCardInfo(const QString &cardName) const
{ {
return cards.value(cardName); return cards.value(cardName);
} }
QList<CardInfoPtr> CardDatabase::getCards(const QStringList &cardNames) const /**
* Looks up the generic cardInfos (the CardInfoPtr that does not refer to a specific printing) for a list of card names.
*
* @param cardNames The card names to look up
* @return A List of generic CardInfoPtr. Any failed lookups will be ignored and dropped from the resulting list
*/
QList<CardInfoPtr> CardDatabase::getCardInfos(const QStringList &cardNames) const
{ {
QList<CardInfoPtr> cardInfos; QList<CardInfoPtr> cardInfos;
for (const QString &cardName : cardNames) { for (const QString &cardName : cardNames) {
@ -126,11 +139,19 @@ QList<CardInfoPtr> CardDatabase::getCards(const QStringList &cardNames) const
return cardInfos; return cardInfos;
} }
QList<CardInfoPtr> CardDatabase::getCardsByNameAndProviderId(const QMap<QString, QString> &cardNames) const /**
* Looks up the CardInfoPtrs corresponding to the CardRefs
*
* @param cardRefs The cards to look up. If providerId is null for an entry, will look up the generic CardInfo for that
* entry's cardName.
* @return A list of specific printings of cards. Any failed lookups will be ignored and dropped from the resulting
* list.
*/
QList<CardInfoPtr> CardDatabase::getCards(const QList<CardRef> &cardRefs) const
{ {
QList<CardInfoPtr> cardInfos; QList<CardInfoPtr> cardInfos;
for (const QString &cardName : cardNames) { for (const auto &cardRef : cardRefs) {
CardInfoPtr ptr = getCardByNameAndProviderId(cardName, cardNames[cardName]); CardInfoPtr ptr = getCard(cardRef);
if (ptr) if (ptr)
cardInfos.append(ptr); cardInfos.append(ptr);
} }
@ -138,16 +159,22 @@ QList<CardInfoPtr> CardDatabase::getCardsByNameAndProviderId(const QMap<QString,
return cardInfos; return cardInfos;
} }
CardInfoPtr CardDatabase::getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const /**
* Looks up the CardInfoPtr corresponding to the CardRef
*
* @param cardRef The card to look up. If providerId is null, will look up the generic CardInfo for the cardName.
* @return A specific printing of a card, or null if not found.
*/
CardInfoPtr CardDatabase::getCard(const CardRef &cardRef) const
{ {
auto info = getCard(cardName); auto info = getCardInfo(cardRef.name);
if (providerId.isNull() || providerId.isEmpty() || info.isNull()) { if (cardRef.providerId.isNull() || cardRef.providerId.isEmpty() || info.isNull()) {
return info; return info;
} }
for (const auto &printings : info->getSets()) { for (const auto &printings : info->getSets()) {
for (const auto &printing : printings) { for (const auto &printing : printings) {
if (printing.getProperty("uuid") == providerId) { if (printing.getProperty("uuid") == cardRef.providerId) {
CardInfoPtr cardFromSpecificSet = info->clone(); CardInfoPtr cardFromSpecificSet = info->clone();
cardFromSpecificSet->setPixmapCacheKey(QLatin1String("card_") + QString(info->getName()) + cardFromSpecificSet->setPixmapCacheKey(QLatin1String("card_") + QString(info->getName()) +
QString("_") + QString(printing.getProperty("uuid"))); QString("_") + QString(printing.getProperty("uuid")));
@ -163,14 +190,20 @@ CardInfoPtr CardDatabase::getCardBySimpleName(const QString &cardName) const
return simpleNameCards.value(CardInfo::simplifyName(cardName)); return simpleNameCards.value(CardInfo::simplifyName(cardName));
} }
CardInfoPtr CardDatabase::guessCard(const QString &cardName, const QString &providerId) const /**
* Looks up the CardInfoPtr by CardRef, simplifying the name if required.
*
* @param cardRef The card to look up. If providerId is null, will look up the generic CardInfo for the cardName.
* @return A specific printing of a card, or null if not found.
*/
CardInfoPtr CardDatabase::guessCard(const CardRef &cardRef) const
{ {
CardInfoPtr temp = providerId.isEmpty() ? getCard(cardName) : getCardByNameAndProviderId(cardName, providerId); CardInfoPtr temp = getCard(cardRef);
if (temp == nullptr) { // get card by simple name instead if (temp == nullptr) { // get card by simple name instead
temp = getCardBySimpleName(cardName); temp = getCardBySimpleName(cardRef.name);
if (temp == nullptr) { // still could not find the card, so simplify the cardName too if (temp == nullptr) { // still could not find the card, so simplify the cardName too
const auto &simpleCardName = CardInfo::simplifyName(cardName); const auto &simpleCardName = CardInfo::simplifyName(cardRef.name);
temp = getCardBySimpleName(simpleCardName); temp = getCardBySimpleName(simpleCardName);
} }
} }
@ -293,13 +326,13 @@ void CardDatabase::refreshPreferredPrintings()
{ {
for (const CardInfoPtr &card : cards) { for (const CardInfoPtr &card : cards) {
card->setPixmapCacheKey(QLatin1String("card_") + QString(card->getName()) + QString("_") + card->setPixmapCacheKey(QLatin1String("card_") + QString(card->getName()) + QString("_") +
QString(getPreferredPrintingProviderIdForCard(card->getName()))); QString(getPreferredPrintingProviderId(card->getName())));
} }
} }
PrintingInfo CardDatabase::getPreferredPrinting(const QString &cardName) const PrintingInfo CardDatabase::getPreferredPrinting(const QString &cardName) const
{ {
CardInfoPtr cardInfo = getCard(cardName); CardInfoPtr cardInfo = getCardInfo(cardName);
return getPreferredPrinting(cardInfo); return getPreferredPrinting(cardInfo);
} }
@ -335,9 +368,9 @@ PrintingInfo CardDatabase::getPreferredPrinting(const CardInfoPtr &cardInfo) con
return PrintingInfo(nullptr); return PrintingInfo(nullptr);
} }
PrintingInfo CardDatabase::getSpecificPrinting(const QString &cardName, const QString &providerId) const PrintingInfo CardDatabase::getSpecificPrinting(const CardRef &cardRef) const
{ {
CardInfoPtr cardInfo = getCard(cardName); CardInfoPtr cardInfo = getCardInfo(cardRef.name);
if (!cardInfo) { if (!cardInfo) {
return PrintingInfo(nullptr); return PrintingInfo(nullptr);
} }
@ -349,14 +382,14 @@ PrintingInfo CardDatabase::getSpecificPrinting(const QString &cardName, const QS
for (const auto &printings : setMap) { for (const auto &printings : setMap) {
for (auto &cardInfoForSet : printings) { for (auto &cardInfoForSet : printings) {
if (cardInfoForSet.getProperty("uuid") == providerId) { if (cardInfoForSet.getProperty("uuid") == cardRef.providerId) {
return cardInfoForSet; return cardInfoForSet;
} }
} }
} }
if (providerId.isNull()) { if (cardRef.providerId.isNull()) {
return getPreferredPrinting(cardName); return getPreferredPrinting(cardRef.name);
} }
return PrintingInfo(nullptr); return PrintingInfo(nullptr);
@ -366,7 +399,7 @@ PrintingInfo CardDatabase::getSpecificPrinting(const QString &cardName,
const QString &setShortName, const QString &setShortName,
const QString &collectorNumber) const const QString &collectorNumber) const
{ {
CardInfoPtr cardInfo = getCard(cardName); CardInfoPtr cardInfo = getCardInfo(cardName);
if (!cardInfo) { if (!cardInfo) {
return PrintingInfo(nullptr); return PrintingInfo(nullptr);
} }
@ -394,7 +427,7 @@ PrintingInfo CardDatabase::getSpecificPrinting(const QString &cardName,
return PrintingInfo(nullptr); return PrintingInfo(nullptr);
} }
QString CardDatabase::getPreferredPrintingProviderIdForCard(const QString &cardName) QString CardDatabase::getPreferredPrintingProviderId(const QString &cardName) const
{ {
PrintingInfo preferredPrinting = getPreferredPrinting(cardName); PrintingInfo preferredPrinting = getPreferredPrinting(cardName);
QString uuid = preferredPrinting.getProperty("uuid"); QString uuid = preferredPrinting.getProperty("uuid");
@ -402,20 +435,20 @@ QString CardDatabase::getPreferredPrintingProviderIdForCard(const QString &cardN
return uuid; return uuid;
} }
CardInfoPtr defaultCardInfo = getCard(cardName); CardInfoPtr defaultCardInfo = getCardInfo(cardName);
if (defaultCardInfo.isNull()) { if (defaultCardInfo.isNull()) {
return cardName; return cardName;
} }
return defaultCardInfo->getName(); return defaultCardInfo->getName();
} }
bool CardDatabase::isProviderIdForPreferredPrinting(const QString &cardName, const QString &providerId) bool CardDatabase::isPreferredPrinting(const CardRef &cardRef) const
{ {
if (providerId.startsWith("card_")) { if (cardRef.providerId.startsWith("card_")) {
return providerId == return cardRef.providerId ==
QLatin1String("card_") + cardName + QString("_") + getPreferredPrintingProviderIdForCard(cardName); QLatin1String("card_") + cardRef.name + QString("_") + getPreferredPrintingProviderId(cardRef.name);
} }
return providerId == getPreferredPrintingProviderIdForCard(cardName); return cardRef.providerId == getPreferredPrintingProviderId(cardRef.name);
} }
PrintingInfo CardDatabase::getSetInfoForCard(const CardInfoPtr &_card) PrintingInfo CardDatabase::getSetInfoForCard(const CardInfoPtr &_card)

View file

@ -1,6 +1,7 @@
#ifndef CARDDATABASE_H #ifndef CARDDATABASE_H
#define CARDDATABASE_H #define CARDDATABASE_H
#include "../common/card_ref.h"
#include "card_info.h" #include "card_info.h"
#include <QBasicMutex> #include <QBasicMutex>
@ -65,20 +66,21 @@ public:
void clear(); void clear();
void removeCard(CardInfoPtr card); void removeCard(CardInfoPtr card);
[[nodiscard]] CardInfoPtr getCard(const QString &cardName) const; [[nodiscard]] CardInfoPtr getCardInfo(const QString &cardName) const;
[[nodiscard]] QList<CardInfoPtr> getCards(const QStringList &cardNames) const; [[nodiscard]] QList<CardInfoPtr> getCardInfos(const QStringList &cardNames) const;
QList<CardInfoPtr> getCardsByNameAndProviderId(const QMap<QString, QString> &cardNames) const;
[[nodiscard]] CardInfoPtr getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const; QList<CardInfoPtr> getCards(const QList<CardRef> &cardRefs) const;
[[nodiscard]] CardInfoPtr getCard(const CardRef &cardRef) const;
[[nodiscard]] PrintingInfo getPreferredPrinting(const QString &cardName) const; [[nodiscard]] PrintingInfo getPreferredPrinting(const QString &cardName) const;
[[nodiscard]] PrintingInfo getPreferredPrinting(const CardInfoPtr &cardInfo) const; [[nodiscard]] PrintingInfo getPreferredPrinting(const CardInfoPtr &cardInfo) const;
[[nodiscard]] PrintingInfo getSpecificPrinting(const QString &cardName, const QString &providerId) const; [[nodiscard]] PrintingInfo getSpecificPrinting(const CardRef &cardRef) const;
PrintingInfo PrintingInfo
getSpecificPrinting(const QString &cardName, const QString &setShortName, const QString &collectorNumber) const; getSpecificPrinting(const QString &cardName, const QString &setShortName, const QString &collectorNumber) const;
QString getPreferredPrintingProviderIdForCard(const QString &cardName); QString getPreferredPrintingProviderId(const QString &cardName) const;
bool isProviderIdForPreferredPrinting(const QString &cardName, const QString &providerId); bool isPreferredPrinting(const CardRef &cardRef) const;
[[nodiscard]] CardInfoPtr guessCard(const QString &cardName, const QString &providerId = QString()) const; [[nodiscard]] CardInfoPtr guessCard(const CardRef &cardRef) const;
/* /*
* Get a card by its simple name. The name will be simplified in this * Get a card by its simple name. The name will be simplified in this

View file

@ -67,11 +67,8 @@ void DeckViewCardDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
event->accept(); event->accept();
} }
DeckViewCard::DeckViewCard(QGraphicsItem *parent, DeckViewCard::DeckViewCard(QGraphicsItem *parent, const CardRef &cardRef, const QString &_originZone)
const QString &_name, : AbstractCardItem(parent, cardRef, 0, -1), originZone(_originZone), dragItem(0)
const QString &_providerId,
const QString &_originZone)
: AbstractCardItem(parent, _name, _providerId, 0, -1), originZone(_originZone), dragItem(0)
{ {
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
@ -362,8 +359,7 @@ void DeckViewScene::rebuildTree()
continue; continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
DeckViewCard *newCard = new DeckViewCard(container, currentCard->getName(), DeckViewCard *newCard = new DeckViewCard(container, currentCard->toCardRef(), currentZone->getName());
currentCard->getCardProviderId(), currentZone->getName());
container->addCard(newCard); container->addCard(newCard);
emit newCardAdded(newCard); emit newCardAdded(newCard);
} }

View file

@ -25,8 +25,7 @@ private:
public: public:
explicit DeckViewCard(QGraphicsItem *parent = nullptr, explicit DeckViewCard(QGraphicsItem *parent = nullptr,
const QString &_name = QString(), const CardRef &cardRef = {},
const QString &_providerId = QString(),
const QString &_originZone = QString()); const QString &_originZone = QString());
~DeckViewCard() override; ~DeckViewCard() override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;

View file

@ -332,8 +332,7 @@ void DeckViewContainer::deckSelectFinished(const Response &r)
{ {
const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext);
DeckLoader newDeck(QString::fromStdString(resp.deck())); DeckLoader newDeck(QString::fromStdString(resp.deck()));
PictureLoader::cacheCardPixmaps( PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList()));
CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(newDeck.getCardListWithProviderId()));
setDeck(newDeck); setDeck(newDeck);
switchToDeckLoadedView(); switchToDeckLoadedView();
} }

View file

@ -118,7 +118,7 @@ static void setupParserRules()
return [=](const DeckPreviewWidget *deck, const ExtraDeckSearchInfo &) -> bool { return [=](const DeckPreviewWidget *deck, const ExtraDeckSearchInfo &) -> bool {
int count = 0; int count = 0;
deck->deckLoader->forEachCard([&](InnerDecklistNode *, const DecklistCardNode *node) { deck->deckLoader->forEachCard([&](InnerDecklistNode *, const DecklistCardNode *node) {
auto cardInfoPtr = CardDatabaseManager::getInstance()->getCard(node->getName()); auto cardInfoPtr = CardDatabaseManager::getInstance()->getCardInfo(node->getName());
if (!cardInfoPtr.isNull() && cardFilter.check(cardInfoPtr)) { if (!cardInfoPtr.isNull() && cardFilter.check(cardInfoPtr)) {
count += node->getNumber(); count += node->getNumber();
} }

View file

@ -1849,7 +1849,7 @@ void Player::actCreateToken()
lastTokenInfo = dlg.getTokenInfo(); lastTokenInfo = dlg.getTokenInfo();
CardInfoPtr correctedCard = CardDatabaseManager::getInstance()->guessCard(lastTokenInfo.name); CardInfoPtr correctedCard = CardDatabaseManager::getInstance()->guessCard({lastTokenInfo.name});
if (correctedCard) { if (correctedCard) {
lastTokenInfo.name = correctedCard->getName(); lastTokenInfo.name = correctedCard->getName();
lastTokenTableRow = TableZone::clampValidTableRow(2 - correctedCard->getTableRow()); lastTokenTableRow = TableZone::clampValidTableRow(2 - correctedCard->getTableRow());
@ -1886,7 +1886,7 @@ void Player::actCreateAnotherToken()
void Player::actCreatePredefinedToken() void Player::actCreatePredefinedToken()
{ {
auto *action = static_cast<QAction *>(sender()); auto *action = static_cast<QAction *>(sender());
CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard(action->text()); CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardInfo(action->text());
if (!cardInfo) { if (!cardInfo) {
return; return;
} }
@ -1912,8 +1912,8 @@ void Player::actCreateRelatedCard()
* then let's allow it to be created via "create another token" * then let's allow it to be created via "create another token"
*/ */
if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) { if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) {
CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr cardInfo =
cardRelation->getName(), sourceCard->getProviderId()); CardDatabaseManager::getInstance()->getCard({cardRelation->getName(), sourceCard->getProviderId()});
setLastToken(cardInfo); setLastToken(cardInfo);
} }
} }
@ -1993,7 +1993,7 @@ void Player::actCreateAllRelatedCards()
* then assign the first to the "Create another" shortcut. * then assign the first to the "Create another" shortcut.
*/ */
if (cardRelation != nullptr && cardRelation->getCanCreateAnother()) { if (cardRelation != nullptr && cardRelation->getCanCreateAnother()) {
CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardInfo(cardRelation->getName());
setLastToken(cardInfo); setLastToken(cardInfo);
} }
} }
@ -2040,7 +2040,7 @@ void Player::createCard(const CardItem *sourceCard,
CardRelation::AttachType attachType, CardRelation::AttachType attachType,
bool persistent) bool persistent)
{ {
CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard(dbCardName); CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardInfo(dbCardName);
if (cardInfo == nullptr || sourceCard == nullptr) { if (cardInfo == nullptr || sourceCard == nullptr) {
return; return;
@ -2197,7 +2197,7 @@ void Player::eventShuffle(const Event_Shuffle &event)
// remove revealed card name on top of decks // remove revealed card name on top of decks
if (absStart == 0 && !cardList.isEmpty()) { if (absStart == 0 && !cardList.isEmpty()) {
cardList.first()->setName(""); cardList.first()->setCardRef({});
zone->update(); zone->update();
} }
@ -2253,8 +2253,8 @@ void Player::eventCreateToken(const Event_CreateToken &event)
return; return;
} }
CardItem *card = new CardItem(this, nullptr, QString::fromStdString(event.card_name()), CardRef cardRef = {QString::fromStdString(event.card_name()), QString::fromStdString(event.card_provider_id())};
QString::fromStdString(event.card_provider_id()), event.card_id()); CardItem *card = new CardItem(this, nullptr, cardRef, event.card_id());
// use db PT if not provided in event and not face-down // use db PT if not provided in event and not face-down
if (!QString::fromStdString(event.pt()).isEmpty()) { if (!QString::fromStdString(event.pt()).isEmpty()) {
card->setPT(QString::fromStdString(event.pt())); card->setPT(QString::fromStdString(event.pt()));
@ -2392,10 +2392,10 @@ void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext &
card->deleteCardInfoPopup(); card->deleteCardInfoPopup();
} }
if (event.has_card_name()) { if (event.has_card_name()) {
card->setName(QString::fromStdString(event.card_name())); QString name = QString::fromStdString(event.card_name());
} QString providerId =
if (event.has_new_card_provider_id()) { event.has_new_card_provider_id() ? QString::fromStdString(event.new_card_provider_id()) : "";
card->setProviderId(QString::fromStdString(event.new_card_provider_id())); card->setCardRef({name, providerId});
} }
if (card->getAttachedTo() && (startZone != targetZone)) { if (card->getAttachedTo() && (startZone != targetZone)) {
@ -2555,8 +2555,9 @@ void Player::eventDrawCards(const Event_DrawCards &event)
for (int i = 0; i < listSize; ++i) { for (int i = 0; i < listSize; ++i) {
const ServerInfo_Card &cardInfo = event.cards(i); const ServerInfo_Card &cardInfo = event.cards(i);
CardItem *card = _deck->takeCard(0, cardInfo.id()); CardItem *card = _deck->takeCard(0, cardInfo.id());
card->setProviderId(QString::fromStdString(cardInfo.provider_id())); QString cardName = QString::fromStdString(cardInfo.name());
card->setName(QString::fromStdString(cardInfo.name())); QString providerId = QString::fromStdString(cardInfo.provider_id());
card->setCardRef({cardName, providerId});
_hand->addCard(card, false, -1); _hand->addCard(card, false, -1);
} }
} else { } else {
@ -2599,11 +2600,12 @@ void Player::eventRevealCards(const Event_RevealCards &event, EventProcessingOpt
if (peeking) { if (peeking) {
for (const auto &card : cardList) { for (const auto &card : cardList) {
QString cardName = QString::fromStdString(card->name()); QString cardName = QString::fromStdString(card->name());
QString providerId = QString::fromStdString(card->provider_id());
CardItem *cardItem = zone->getCard(card->id(), QString()); CardItem *cardItem = zone->getCard(card->id(), QString());
if (!cardItem) { if (!cardItem) {
continue; continue;
} }
cardItem->setName(cardName); cardItem->setCardRef({cardName, providerId});
emit logRevealCards(this, zone, card->id(), cardName, this, true, 1); emit logRevealCards(this, zone, card->id(), cardName, this, true, 1);
} }
} else { } else {
@ -2616,8 +2618,8 @@ void Player::eventRevealCards(const Event_RevealCards &event, EventProcessingOpt
// Handle case of revealing top card of library in-place // Handle case of revealing top card of library in-place
if (cardId == 0 && dynamic_cast<PileZone *>(zone)) { if (cardId == 0 && dynamic_cast<PileZone *>(zone)) {
auto card = zone->getCards().first(); auto card = zone->getCards().first();
card->setName(cardName); QString providerId = QString::fromStdString(cardList.first()->provider_id());
card->setProviderId(QString::fromStdString(cardList.first()->provider_id())); card->setCardRef({cardName, providerId});
zone->update(); zone->update();
showZoneView = false; showZoneView = false;
} }
@ -4076,7 +4078,7 @@ void Player::addRelatedCardView(const CardItem *card, QMenu *cardMenu)
bool atLeastOneGoodRelationFound = false; bool atLeastOneGoodRelationFound = false;
QList<CardRelation *> relatedCards = cardInfo->getAllRelatedCards(); QList<CardRelation *> relatedCards = cardInfo->getAllRelatedCards();
for (const CardRelation *cardRelation : relatedCards) { for (const CardRelation *cardRelation : relatedCards) {
CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCardInfo(cardRelation->getName());
if (relatedCard != nullptr) { if (relatedCard != nullptr) {
atLeastOneGoodRelationFound = true; atLeastOneGoodRelationFound = true;
break; break;
@ -4096,7 +4098,7 @@ void Player::addRelatedCardView(const CardItem *card, QMenu *cardMenu)
QString relatedCardName = relatedCard->getName(); QString relatedCardName = relatedCard->getName();
QAction *viewCard = viewRelatedCards->addAction(relatedCardName); QAction *viewCard = viewRelatedCards->addAction(relatedCardName);
connect(viewCard, &QAction::triggered, game, [this, relatedCardName, currentCardSet] { connect(viewCard, &QAction::triggered, game, [this, relatedCardName, currentCardSet] {
game->viewCardInfo(relatedCardName, currentCardSet.getProperty("uuid")); game->viewCardInfo({relatedCardName, currentCardSet.getProperty("uuid")});
}); });
} }
} }
@ -4122,10 +4124,10 @@ void Player::addRelatedCardActions(const CardItem *card, QMenu *cardMenu)
int index = 0; int index = 0;
QAction *createRelatedCards = nullptr; QAction *createRelatedCards = nullptr;
for (const CardRelation *cardRelation : relatedCards) { for (const CardRelation *cardRelation : relatedCards) {
CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( CardInfoPtr relatedCard =
cardRelation->getName(), currentCardSet.getProperty("uuid")); CardDatabaseManager::getInstance()->getCard({cardRelation->getName(), currentCardSet.getProperty("uuid")});
if (relatedCard == nullptr) { if (relatedCard == nullptr) {
relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); relatedCard = CardDatabaseManager::getInstance()->getCardInfo(cardRelation->getName());
} }
if (relatedCard == nullptr) { if (relatedCard == nullptr) {
continue; continue;

View file

@ -141,8 +141,7 @@ void CardZone::addCard(CardItem *card, const bool reorganize, const int x, const
for (auto *view : views) { for (auto *view : views) {
if (view->prepareAddCard(x)) { if (view->prepareAddCard(x)) {
view->addCard(new CardItem(player, nullptr, card->getName(), card->getProviderId(), card->getId()), view->addCard(new CardItem(player, nullptr, card->getCardRef(), card->getId()), reorganize, x, y);
reorganize, x, y);
} }
} }
@ -167,7 +166,8 @@ CardItem *CardZone::getCard(int cardId, const QString &cardName)
// It can be assumed that in an invisible zone, all cards are equal. // It can be assumed that in an invisible zone, all cards are equal.
if ((c->getId() == -1) || (c->getName().isEmpty())) { if ((c->getId() == -1) || (c->getName().isEmpty())) {
c->setId(cardId); c->setId(cardId);
c->setName(cardName); // TODO: also set providerId
c->setCardRef({cardName});
} }
return c; return c;
} }

View file

@ -32,7 +32,7 @@ void HandZone::addCardImpl(CardItem *card, int x, int /*y*/)
if (!cards.getContentsKnown()) { if (!cards.getContentsKnown()) {
card->setId(-1); card->setId(-1);
card->setName(); card->setCardRef({});
} }
card->setParentItem(this); card->setParentItem(this);
card->resetState(); card->resetState();

View file

@ -66,11 +66,11 @@ void PileZone::addCardImpl(CardItem *card, int x, int /*y*/)
cards.insert(x, card); cards.insert(x, card);
card->setPos(0, 0); card->setPos(0, 0);
if (!contentsKnown()) { if (!contentsKnown()) {
card->setName(QString()); card->setCardRef({});
card->setId(-1); card->setId(-1);
// If we obscure a previously revealed card, its name has to be forgotten // If we obscure a previously revealed card, its name has to be forgotten
if (cards.size() > x + 1) if (cards.size() > x + 1)
cards.at(x + 1)->setName(QString()); cards.at(x + 1)->setCardRef({});
} }
card->setVisible(false); card->setVisible(false);
card->resetState(); card->resetState();

View file

@ -34,7 +34,7 @@ void StackZone::addCardImpl(CardItem *card, int x, int /*y*/)
if (!cards.getContentsKnown()) { if (!cards.getContentsKnown()) {
card->setId(-1); card->setId(-1);
card->setName(); card->setCardRef({});
} }
card->setParentItem(this); card->setParentItem(this);
card->resetState(true); card->resetState(true);

View file

@ -68,10 +68,11 @@ void ZoneViewZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*o
void ZoneViewZone::initializeCards(const QList<const ServerInfo_Card *> &cardList) void ZoneViewZone::initializeCards(const QList<const ServerInfo_Card *> &cardList)
{ {
if (!cardList.isEmpty()) { if (!cardList.isEmpty()) {
for (int i = 0; i < cardList.size(); ++i) for (int i = 0; i < cardList.size(); ++i) {
addCard(new CardItem(player, this, QString::fromStdString(cardList[i]->name()), auto card = cardList[i];
QString::fromStdString(cardList[i]->provider_id()), cardList[i]->id()), CardRef cardRef = {QString::fromStdString(card->name()), QString::fromStdString(card->provider_id())};
false, i); addCard(new CardItem(player, this, cardRef, card->id()), false, i);
}
reorganizeCards(); reorganizeCards();
} else if (!origZone->contentsKnown()) { } else if (!origZone->contentsKnown()) {
Command_DumpZone cmd; Command_DumpZone cmd;
@ -88,7 +89,7 @@ void ZoneViewZone::initializeCards(const QList<const ServerInfo_Card *> &cardLis
int number = numberCards == -1 ? c.size() : (numberCards < c.size() ? numberCards : c.size()); int number = numberCards == -1 ? c.size() : (numberCards < c.size() ? numberCards : c.size());
for (int i = 0; i < number; i++) { for (int i = 0; i < number; i++) {
CardItem *card = c.at(i); CardItem *card = c.at(i);
addCard(new CardItem(player, this, card->getName(), card->getProviderId(), card->getId()), false, i); addCard(new CardItem(player, this, card->getCardRef(), card->getId()), false, i);
} }
reorganizeCards(); reorganizeCards();
} }
@ -102,7 +103,7 @@ void ZoneViewZone::zoneDumpReceived(const Response &r)
const ServerInfo_Card &cardInfo = resp.zone_info().card_list(i); const ServerInfo_Card &cardInfo = resp.zone_info().card_list(i);
auto cardName = QString::fromStdString(cardInfo.name()); auto cardName = QString::fromStdString(cardInfo.name());
auto cardProviderId = QString::fromStdString(cardInfo.provider_id()); auto cardProviderId = QString::fromStdString(cardInfo.provider_id());
auto *card = new CardItem(player, this, cardName, cardProviderId, cardInfo.id(), this); auto *card = new CardItem(player, this, {cardName, cardProviderId}, cardInfo.id(), this);
cards.insert(i, card); cards.insert(i, card);
} }

View file

@ -582,9 +582,9 @@ void ChatView::mousePressEvent(QMouseEvent *event)
case HoveredCard: { case HoveredCard: {
if ((event->button() == Qt::MiddleButton) || (event->button() == Qt::LeftButton)) if ((event->button() == Qt::MiddleButton) || (event->button() == Qt::LeftButton))
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
emit showCardInfoPopup(event->globalPosition().toPoint(), hoveredContent, QString()); emit showCardInfoPopup(event->globalPosition().toPoint(), {hoveredContent});
#else #else
emit showCardInfoPopup(event->globalPos(), hoveredContent, QString()); emit showCardInfoPopup(event->globalPos(), {hoveredContent});
#endif #endif
break; break;
} }

View file

@ -109,7 +109,7 @@ protected:
signals: signals:
void openMessageDialog(const QString &userName, bool focus); void openMessageDialog(const QString &userName, bool focus);
void cardNameHovered(QString cardName); void cardNameHovered(QString cardName);
void showCardInfoPopup(const QPoint &pos, const QString &cardName, const QString &providerId); void showCardInfoPopup(const QPoint &pos, const CardRef &cardRef);
void deleteCardInfoPopup(QString cardName); void deleteCardInfoPopup(QString cardName);
void addMentionTag(QString mentionTag); void addMentionTag(QString mentionTag);
void messageClickedSignal(); void messageClickedSignal();

View file

@ -5,9 +5,9 @@ CardOverrideSettings::CardOverrideSettings(const QString &settingPath, QObject *
{ {
} }
void CardOverrideSettings::setCardPreferenceOverride(const QString &cardName, const QString &providerId) void CardOverrideSettings::setCardPreferenceOverride(const CardRef &cardRef)
{ {
setValue(providerId, cardName, "cards"); setValue(cardRef.providerId, cardRef.name, "cards");
} }
void CardOverrideSettings::deleteCardPreferenceOverride(const QString &cardName) void CardOverrideSettings::deleteCardPreferenceOverride(const QString &cardName)

View file

@ -1,6 +1,7 @@
#ifndef COCKATRICE_CARD_OVERRIDE_SETTINGS_H #ifndef COCKATRICE_CARD_OVERRIDE_SETTINGS_H
#define COCKATRICE_CARD_OVERRIDE_SETTINGS_H #define COCKATRICE_CARD_OVERRIDE_SETTINGS_H
#include "../common/card_ref.h"
#include "settings_manager.h" #include "settings_manager.h"
#include <QObject> #include <QObject>
@ -11,7 +12,7 @@ class CardOverrideSettings : public SettingsManager
friend class SettingsCache; friend class SettingsCache;
public: public:
void setCardPreferenceOverride(const QString &cardName, const QString &providerId); void setCardPreferenceOverride(const CardRef &cardRef);
void deleteCardPreferenceOverride(const QString &cardName); void deleteCardPreferenceOverride(const QString &cardName);

24
common/card_ref.h Normal file
View file

@ -0,0 +1,24 @@
#ifndef CARD_REF_H
#define CARD_REF_H
#include <QString>
/**
* The information passed over the server that is required to identify the exact card to display.
*
* @param name The name of the card. Should not be empty, unless to indicate the lack of a card.
* @param providerId Determines which printing of the card to use. Can be empty, in which case Cockatrice should default
* to using the preferred set.
*/
struct CardRef
{
QString name;
QString providerId = QString();
bool operator==(const CardRef &other) const
{
return name == other.name && providerId == other.providerId;
}
};
#endif // CARD_REF_H

View file

@ -424,7 +424,7 @@ bool DeckList::readElement(QXmlStreamReader *xml)
} else if (childName == "bannerCard") { } else if (childName == "bannerCard") {
QString providerId = xml->attributes().value("providerId").toString(); QString providerId = xml->attributes().value("providerId").toString();
QString cardName = xml->readElementText(); QString cardName = xml->readElementText();
bannerCard = QPair<QString, QString>(cardName, providerId); bannerCard = {cardName, providerId};
} else if (childName == "tags") { } else if (childName == "tags") {
tags.clear(); // Clear existing tags tags.clear(); // Clear existing tags
while (xml->readNextStartElement()) { while (xml->readNextStartElement()) {
@ -456,8 +456,8 @@ void DeckList::write(QXmlStreamWriter *xml) const
xml->writeTextElement("lastLoadedTimestamp", lastLoadedTimestamp); xml->writeTextElement("lastLoadedTimestamp", lastLoadedTimestamp);
xml->writeTextElement("deckname", name); xml->writeTextElement("deckname", name);
xml->writeStartElement("bannerCard"); xml->writeStartElement("bannerCard");
xml->writeAttribute("providerId", bannerCard.second); xml->writeAttribute("providerId", bannerCard.providerId);
xml->writeCharacters(bannerCard.first); xml->writeCharacters(bannerCard.name);
xml->writeEndElement(); xml->writeEndElement();
xml->writeTextElement("comments", comments); xml->writeTextElement("comments", comments);
@ -805,7 +805,7 @@ void DeckList::cleanList(bool preserveMetadata)
refreshDeckHash(); refreshDeckHash();
} }
void DeckList::getCardListHelper(InnerDecklistNode *item, QSet<QString> &result) const void DeckList::getCardListHelper(InnerDecklistNode *item, QSet<QString> &result)
{ {
for (int i = 0; i < item->size(); ++i) { for (int i = 0; i < item->size(); ++i) {
auto *node = dynamic_cast<DecklistCardNode *>(item->at(i)); auto *node = dynamic_cast<DecklistCardNode *>(item->at(i));
@ -818,15 +818,15 @@ void DeckList::getCardListHelper(InnerDecklistNode *item, QSet<QString> &result)
} }
} }
void DeckList::getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap<QString, QString> &result) const void DeckList::getCardRefListHelper(InnerDecklistNode *item, QList<CardRef> &result)
{ {
for (int i = 0; i < item->size(); ++i) { for (int i = 0; i < item->size(); ++i) {
auto *node = dynamic_cast<DecklistCardNode *>(item->at(i)); auto *node = dynamic_cast<DecklistCardNode *>(item->at(i));
if (node) { if (node) {
result.insert(node->getName(), node->getCardProviderId()); result.append(node->toCardRef());
} else { } else {
getCardListWithProviderIdHelper(dynamic_cast<InnerDecklistNode *>(item->at(i)), result); getCardRefListHelper(dynamic_cast<InnerDecklistNode *>(item->at(i)), result);
} }
} }
} }
@ -838,10 +838,10 @@ QStringList DeckList::getCardList() const
return result.values(); return result.values();
} }
QMap<QString, QString> DeckList::getCardListWithProviderId() const QList<CardRef> DeckList::getCardRefList() const
{ {
QMap<QString, QString> result; QList<CardRef> result;
getCardListWithProviderIdHelper(root, result); getCardRefListHelper(root, result);
return result; return result;
} }

View file

@ -1,6 +1,8 @@
#ifndef DECKLIST_H #ifndef DECKLIST_H
#define DECKLIST_H #define DECKLIST_H
#include "card_ref.h"
#include <QMap> #include <QMap>
#include <QVector> #include <QVector>
@ -246,6 +248,10 @@ public:
{ {
return false; return false;
} }
CardRef toCardRef() const
{
return {name, cardProviderId};
}
}; };
class DeckList : public QObject class DeckList : public QObject
@ -253,13 +259,13 @@ class DeckList : public QObject
Q_OBJECT Q_OBJECT
private: private:
QString name, comments; QString name, comments;
QPair<QString, QString> bannerCard; CardRef bannerCard;
QString lastLoadedTimestamp; QString lastLoadedTimestamp;
QStringList tags; QStringList tags;
QMap<QString, SideboardPlan *> sideboardPlans; QMap<QString, SideboardPlan *> sideboardPlans;
InnerDecklistNode *root; InnerDecklistNode *root;
void getCardListHelper(InnerDecklistNode *node, QSet<QString> &result) const; static void getCardListHelper(InnerDecklistNode *node, QSet<QString> &result);
void getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap<QString, QString> &result) const; static void getCardRefListHelper(InnerDecklistNode *item, QList<CardRef> &result);
InnerDecklistNode *getZoneObjFromName(const QString &zoneName); InnerDecklistNode *getZoneObjFromName(const QString &zoneName);
/** /**
@ -305,7 +311,7 @@ public slots:
tags.clear(); tags.clear();
emit deckTagsChanged(); emit deckTagsChanged();
} }
void setBannerCard(const QPair<QString, QString> &_bannerCard = QPair<QString, QString>()) void setBannerCard(const CardRef &_bannerCard = {})
{ {
bannerCard = _bannerCard; bannerCard = _bannerCard;
} }
@ -331,7 +337,7 @@ public:
{ {
return tags; return tags;
} }
QPair<QString, QString> getBannerCard() const CardRef getBannerCard() const
{ {
return bannerCard; return bannerCard;
} }
@ -365,7 +371,7 @@ public:
return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty();
} }
QStringList getCardList() const; QStringList getCardList() const;
QMap<QString, QString> getCardListWithProviderId() const; QList<CardRef> getCardRefList() const;
int getSideboardSize() const; int getSideboardSize() const;

View file

@ -27,15 +27,9 @@
#include <QVariant> #include <QVariant>
Server_Card::Server_Card(QString _name, Server_Card::Server_Card(const CardRef &cardRef, int _id, int _coord_x, int _coord_y, Server_CardZone *_zone)
QString _provider_id, : zone(_zone), id(_id), coord_x(_coord_x), coord_y(_coord_y), cardRef(cardRef), tapped(false), attacking(false),
int _id, facedown(false), destroyOnZoneChange(false), doesntUntap(false), parentCard(0), stashedCard(nullptr)
int _coord_x,
int _coord_y,
Server_CardZone *_zone)
: zone(_zone), id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), provider_id(_provider_id), tapped(false),
attacking(false), facedown(false), color(), ptString(), annotation(), destroyOnZoneChange(false),
doesntUntap(false), parentCard(0), stashedCard(nullptr)
{ {
} }
@ -134,10 +128,10 @@ void Server_Card::setParentCard(Server_Card *_parentCard)
void Server_Card::getInfo(ServerInfo_Card *info) void Server_Card::getInfo(ServerInfo_Card *info)
{ {
QString displayedName = facedown ? QString() : name; QString displayedName = facedown ? QString() : cardRef.name;
info->set_id(id); info->set_id(id);
info->set_provider_id(provider_id.toStdString()); info->set_provider_id(cardRef.providerId.toStdString());
info->set_name(displayedName.toStdString()); info->set_name(displayedName.toStdString());
info->set_x(coord_x); info->set_x(coord_x);
info->set_y(coord_y); info->set_y(coord_y);

View file

@ -20,6 +20,7 @@
#ifndef SERVER_CARD_H #ifndef SERVER_CARD_H
#define SERVER_CARD_H #define SERVER_CARD_H
#include "card_ref.h"
#include "pb/card_attributes.pb.h" #include "pb/card_attributes.pb.h"
#include "pb/serverinfo_card.pb.h" #include "pb/serverinfo_card.pb.h"
#include "server_arrowtarget.h" #include "server_arrowtarget.h"
@ -38,8 +39,7 @@ private:
Server_CardZone *zone; Server_CardZone *zone;
int id; int id;
int coord_x, coord_y; int coord_x, coord_y;
QString name; CardRef cardRef;
QString provider_id;
QMap<int, int> counters; QMap<int, int> counters;
bool tapped; bool tapped;
bool attacking; bool attacking;
@ -55,12 +55,7 @@ private:
Server_Card *stashedCard; Server_Card *stashedCard;
public: public:
Server_Card(QString _name, Server_Card(const CardRef &cardRef, int _id, int _coord_x, int _coord_y, Server_CardZone *_zone = nullptr);
QString _provider_id,
int _id,
int _coord_x,
int _coord_y,
Server_CardZone *_zone = nullptr);
~Server_Card() override; ~Server_Card() override;
Server_CardZone *getZone() const Server_CardZone *getZone() const
@ -76,9 +71,13 @@ public:
{ {
return id; return id;
} }
CardRef getCardRef() const
{
return cardRef;
}
QString getProviderId() const QString getProviderId() const
{ {
return provider_id; return cardRef.providerId;
} }
int getX() const int getX() const
{ {
@ -90,7 +89,7 @@ public:
} }
QString getName() const QString getName() const
{ {
return name; return cardRef.name;
} }
const QMap<int, int> &getCounters() const const QMap<int, int> &getCounters() const
{ {
@ -150,9 +149,9 @@ public:
coord_x = x; coord_x = x;
coord_y = y; coord_y = y;
} }
void setName(const QString &_name) void setCardRef(const CardRef &_cardRef)
{ {
name = _name; cardRef = _cardRef;
} }
void setCounter(int _id, int value, Event_SetCardCounter *event = nullptr); void setCounter(int _id, int value, Event_SetCardCounter *event = nullptr);
void setTapped(bool _tapped) void setTapped(bool _tapped)

View file

@ -210,9 +210,7 @@ void Server_Player::setupZones()
continue; continue;
} }
for (int k = 0; k < currentCard->getNumber(); ++k) { for (int k = 0; k < currentCard->getNumber(); ++k) {
z->insertCard( z->insertCard(new Server_Card(currentCard->toCardRef(), nextCardId++, 0, 0, z), -1, 0);
new Server_Card(currentCard->getName(), currentCard->getCardProviderId(), nextCardId++, 0, 0, z),
-1, 0);
} }
} }
} }
@ -1517,7 +1515,7 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer
yCoord = 0; yCoord = 0;
} }
auto *card = new Server_Card(cardName, cardProviderId, newCardId(), xCoord, yCoord); auto *card = new Server_Card({cardName, cardProviderId}, newCardId(), xCoord, yCoord);
card->moveToThread(thread()); card->moveToThread(thread());
// Client should already prevent face-down tokens from having attributes; this just an extra server-side check // Client should already prevent face-down tokens from having attributes; this just an extra server-side check
if (!cmd.face_down()) { if (!cmd.face_down()) {

View file

@ -26,6 +26,9 @@ elseif(Qt5_FOUND)
) )
endif() endif()
# Include directories
include_directories(../common) # Required due to card_ref.h
# Build servatrice binary and link it # Build servatrice binary and link it
add_executable(dbconverter MACOSX_BUNDLE ${dbconverter_MOC_SRCS} ${dbconverter_SOURCES}) add_executable(dbconverter MACOSX_BUNDLE ${dbconverter_MOC_SRCS} ${dbconverter_SOURCES})

View file

@ -79,6 +79,7 @@ elseif(Qt5_FOUND)
endif() endif()
include_directories(../cockatrice/src) include_directories(../cockatrice/src)
include_directories(../common)
# Libz is required to support zipped files # Libz is required to support zipped files
find_package(ZLIB) find_package(ZLIB)

View file

@ -49,8 +49,8 @@ if(NOT GTEST_FOUND)
add_dependencies(filter_string_test gtest) add_dependencies(filter_string_test gtest)
endif() endif()
target_link_libraries(carddatabase_test Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES}) target_link_libraries(carddatabase_test cockatrice_common Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES})
target_link_libraries(filter_string_test Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES}) target_link_libraries(filter_string_test cockatrice_common Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES})
add_test(NAME carddatabase_test COMMAND carddatabase_test) add_test(NAME carddatabase_test COMMAND carddatabase_test)
add_test(NAME filter_string_test COMMAND filter_string_test) add_test(NAME filter_string_test COMMAND filter_string_test)