diff --git a/cockatrice/src/abstractcarditem.cpp b/cockatrice/src/abstractcarditem.cpp index e42626e0..251eaace 100644 --- a/cockatrice/src/abstractcarditem.cpp +++ b/cockatrice/src/abstractcarditem.cpp @@ -46,7 +46,7 @@ void AbstractCardItem::cardInfoUpdated() { info = db->getCard(name); if (info) - connect(info, SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated())); + connect(info.data(), SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated())); cacheBgColor(); update(); @@ -182,7 +182,7 @@ void AbstractCardItem::setName(const QString &_name) emit deleteCardInfoPopup(name); if (info) - disconnect(info, nullptr, this, nullptr); + disconnect(info.data(), nullptr, this, nullptr); name = _name; cardInfoUpdated(); diff --git a/cockatrice/src/abstractcarditem.h b/cockatrice/src/abstractcarditem.h index c649d986..4f29fac4 100644 --- a/cockatrice/src/abstractcarditem.h +++ b/cockatrice/src/abstractcarditem.h @@ -2,8 +2,8 @@ #define ABSTRACTCARDITEM_H #include "arrowtarget.h" +#include "carddatabase.h" -class CardInfo; class Player; const int CARD_WIDTH = 72; @@ -13,7 +13,7 @@ class AbstractCardItem : public ArrowTarget { Q_OBJECT protected: - CardInfo *info; + CardInfoPtr info; int id; QString name; bool tapped; @@ -54,7 +54,7 @@ public: QSizeF getTranslatedSize(QPainter *painter) const; void paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); - CardInfo *getInfo() const + CardInfoPtr getInfo() const { return info; } diff --git a/cockatrice/src/arrowitem.cpp b/cockatrice/src/arrowitem.cpp index 1862aada..d571eaa0 100644 --- a/cockatrice/src/arrowitem.cpp +++ b/cockatrice/src/arrowitem.cpp @@ -239,7 +239,7 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) } if (startZone->getName().compare("hand") == 0) { startCard->playCard(false); - CardInfo *ci = startCard->getInfo(); + CardInfoPtr ci = startCard->getInfo(); if (ci && (((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) || ((settingsCache->getPlayToStack() && ci->getTableRow() != 0) && startCard->getZone()->getName().toStdString() != "stack")))) diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index b52bee4e..a84cea18 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -8,13 +8,14 @@ #include #include #include +#include const int CardDatabase::versionNeeded = 3; const char *CardDatabase::TOKENS_SETNAME = "TK"; -static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardSet *set) +static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardSetPtr &set) { - if (set == nullptr) { + if (set.isNull()) { qDebug() << "&operator<< set is nullptr"; return xml; } @@ -38,6 +39,16 @@ CardSet::CardSet(const QString &_shortName, loadSetOptions(); } +CardSetPtr CardSet::newInstance(const QString &_shortName, + const QString &_longName, + const QString &_setType, + const QDate &_releaseDate) +{ + CardSetPtr ptr(new CardSet(_shortName, _longName, _setType, _releaseDate)); + // ptr->setSmartPointer(ptr); + return ptr; +} + QString CardSet::getCorrectedShortName() const { // For Windows machines. @@ -96,9 +107,9 @@ void CardSet::setIsKnown(bool _isknown) class SetList::KeyCompareFunctor { public: - inline bool operator()(CardSet *a, CardSet *b) const + inline bool operator()(const CardSetPtr &a, const CardSetPtr &b) const { - if (a == nullptr || b == nullptr) { + if (a.isNull() || b.isNull()) { qDebug() << "SetList::KeyCompareFunctor a or b is null"; return false; } @@ -116,7 +127,7 @@ int SetList::getEnabledSetsNum() { int num = 0; for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); + CardSetPtr set = at(i); if (set && set->getEnabled()) { ++num; } @@ -128,7 +139,7 @@ int SetList::getUnknownSetsNum() { int num = 0; for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); + CardSetPtr set = at(i); if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { ++num; } @@ -140,7 +151,7 @@ QStringList SetList::getUnknownSetsNames() { QStringList sets = QStringList(); for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); + CardSetPtr set = at(i); if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { sets << set->getShortName(); } @@ -151,7 +162,7 @@ QStringList SetList::getUnknownSetsNames() void SetList::enableAllUnknown() { for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); + CardSetPtr set = at(i); if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { set->setIsKnown(true); set->setEnabled(true); @@ -164,7 +175,7 @@ void SetList::enableAllUnknown() void SetList::enableAll() { for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); + CardSetPtr set = at(i); if (set == nullptr) { qDebug() << "enabledAll has null"; @@ -182,7 +193,7 @@ void SetList::enableAll() void SetList::markAllAsKnown() { for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); + CardSetPtr set = at(i); if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { set->setIsKnown(true); set->setEnabled(false); @@ -198,8 +209,8 @@ void SetList::guessSortKeys() QDate distantFuture(2050, 1, 1); int aHundredYears = 36500; for (int i = 0; i < size(); ++i) { - CardSet *set = at(i); - if (set == nullptr) { + CardSetPtr set = at(i); + if (set.isNull()) { qDebug() << "guessSortKeys set is null"; continue; } @@ -241,16 +252,45 @@ CardInfo::CardInfo(const QString &_name, pixmapCacheKey = QLatin1String("card_") + name; simpleName = CardInfo::simplifyName(name); - for (int i = 0; i < sets.size(); i++) { - sets[i]->append(this); - } - refreshCachedSetNames(); } CardInfo::~CardInfo() { - PictureLoader::clearPixmapCache(this); + PictureLoader::clearPixmapCache(smartThis); +} + +CardInfoPtr CardInfo::newInstance(const QString &_name, + bool _isToken, + const QString &_manacost, + const QString &_cmc, + const QString &_cardtype, + const QString &_powtough, + const QString &_text, + const QStringList &_colors, + const QList &_relatedCards, + const QList &_reverseRelatedCards, + bool _upsideDownArt, + int _loyalty, + bool _cipt, + int _tableRow, + const SetList &_sets, + const QStringMap &_customPicURLs, + MuidMap _muIds, + QStringMap _collectorNumbers, + QStringMap _rarities) +{ + CardInfoPtr ptr(new CardInfo(_name, _isToken, _manacost, _cmc, _cardtype, _powtough, _text, _colors, _relatedCards, + _reverseRelatedCards, _upsideDownArt, _loyalty, _cipt, _tableRow, _sets, + _customPicURLs, std::move(_muIds), std::move(_collectorNumbers), + std::move(_rarities))); + ptr->setSmartPointer(ptr); + + for (int i = 0; i < _sets.size(); i++) { + _sets[i]->append(ptr); + } + + return ptr; } QString CardInfo::getMainCardType() const @@ -298,14 +338,14 @@ QString CardInfo::getCorrectedName() const return result.remove(" // ").remove(':').remove('"').remove('?').replace('/', ' '); } -void CardInfo::addToSet(CardSet *set) +void CardInfo::addToSet(CardSetPtr set) { - if (set == nullptr) { + if (set.isNull()) { qDebug() << "addToSet(nullptr)"; return; } - set->append(this); + set->append(smartThis); sets << set; refreshCachedSetNames(); @@ -356,9 +396,9 @@ const QChar CardInfo::getColorChar() const } } -static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info) +static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfoPtr &info) { - if (info == nullptr) { + if (info.isNull()) { qDebug() << "operator<< info is nullptr"; return xml; } @@ -467,6 +507,7 @@ static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info) CardDatabase::CardDatabase(QObject *parent) : QObject(parent), loadStatus(NotLoaded) { + qRegisterMetaType("CardInfoPtr"); connect(settingsCache, SIGNAL(cardDatabasePathChanged()), this, SLOT(loadCardDatabases())); } @@ -479,24 +520,17 @@ void CardDatabase::clear() { clearDatabaseMutex->lock(); - QHashIterator i(cards); + QHashIterator i(cards); while (i.hasNext()) { i.next(); if (i.value()) { removeCard(i.value()); - i.value()->deleteLater(); } } - // The pointers themselves were already deleted, so we don't delete them again. cards.clear(); simpleNameCards.clear(); - QHashIterator setIt(sets); - while (setIt.hasNext()) { - setIt.next(); - delete setIt.value(); - } sets.clear(); loadStatus = NotLoaded; @@ -504,7 +538,7 @@ void CardDatabase::clear() clearDatabaseMutex->unlock(); } -void CardDatabase::addCard(CardInfo *card) +void CardDatabase::addCard(CardInfoPtr card) { if (card == nullptr) { qDebug() << "addCard(nullptr)"; @@ -518,9 +552,9 @@ void CardDatabase::addCard(CardInfo *card) emit cardAdded(card); } -void CardDatabase::removeCard(CardInfo *card) +void CardDatabase::removeCard(CardInfoPtr card) { - if (card == nullptr) { + if (card.isNull()) { qDebug() << "removeCard(nullptr)"; return; } @@ -537,35 +571,39 @@ void CardDatabase::removeCard(CardInfo *card) removeCardMutex->lock(); cards.remove(card->getName()); simpleNameCards.remove(card->getSimpleName()); + card.clear(); removeCardMutex->unlock(); emit cardRemoved(card); } -CardInfo *CardDatabase::getCard(const QString &cardName) const +CardInfoPtr CardDatabase::getCard(const QString &cardName) const { return getCardFromMap(cards, cardName); } -QList CardDatabase::getCards(const QStringList &cardNames) const +QList CardDatabase::getCards(const QStringList &cardNames) const { - QList cardInfos; - foreach (QString cardName, cardNames) - cardInfos.append(getCardFromMap(cards, cardName)); + QList cardInfos; + foreach (QString cardName, cardNames) { + CardInfoPtr ptr = getCardFromMap(cards, cardName); + if (ptr) + cardInfos.append(ptr); + } return cardInfos; } -CardInfo *CardDatabase::getCardBySimpleName(const QString &cardName) const +CardInfoPtr CardDatabase::getCardBySimpleName(const QString &cardName) const { return getCardFromMap(simpleNameCards, CardInfo::simplifyName(cardName)); } -CardSet *CardDatabase::getSet(const QString &setName) +CardSetPtr CardDatabase::getSet(const QString &setName) { if (sets.contains(setName)) { return sets.value(setName); } else { - CardSet *newSet = new CardSet(setName); + CardSetPtr newSet = CardSet::newInstance(setName); sets.insert(setName, newSet); return newSet; } @@ -574,7 +612,7 @@ CardSet *CardDatabase::getSet(const QString &setName) SetList CardDatabase::getSetList() const { SetList result; - QHashIterator i(sets); + QHashIterator i(sets); while (i.hasNext()) { i.next(); result << i.value(); @@ -611,7 +649,7 @@ void CardDatabase::loadSetsFromXml(QXmlStreamReader &xml) } } - CardSet *newSet = getSet(shortName); + CardSetPtr newSet = getSet(shortName); newSet->setLongName(longName); newSet->setSetType(setType); newSet->setReleaseDate(releaseDate); @@ -729,20 +767,19 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml) } } - addCard(new CardInfo(name, isToken, manacost, cmc, type, pt, text, colors, relatedCards, - reverseRelatedCards, upsideDown, loyalty, cipt, tableRow, sets, customPicURLs, muids, - collectorNumbers, rarities)); + addCard(CardInfo::newInstance(name, isToken, manacost, cmc, type, pt, text, colors, relatedCards, + reverseRelatedCards, upsideDown, loyalty, cipt, tableRow, sets, customPicURLs, + muids, collectorNumbers, rarities)); } } } -CardInfo *CardDatabase::getCardFromMap(const CardNameMap &cardMap, const QString &cardName) const +CardInfoPtr CardDatabase::getCardFromMap(const CardNameMap &cardMap, const QString &cardName) const { - if (cardMap.contains(cardName)) { + if (cardMap.contains(cardName)) return cardMap.value(cardName); - } - return nullptr; + return {}; } LoadStatus CardDatabase::loadFromFile(const QString &fileName) @@ -806,7 +843,7 @@ bool CardDatabase::saveToFile(const QString &fileName, bool tokens) if (!tokens) { xml.writeStartElement("sets"); - QHashIterator setIterator(sets); + QHashIterator setIterator(sets); while (setIterator.hasNext()) { xml << setIterator.next().value(); } @@ -815,9 +852,9 @@ bool CardDatabase::saveToFile(const QString &fileName, bool tokens) } xml.writeStartElement("cards"); - QHashIterator cardIterator(cards); + QHashIterator cardIterator(cards); while (cardIterator.hasNext()) { - CardInfo *card = cardIterator.next().value(); + CardInfoPtr card = cardIterator.next().value(); if (tokens == card->getIsToken()) { xml << card; } @@ -868,7 +905,7 @@ LoadStatus CardDatabase::loadCardDatabases() // reorder sets (TODO: refactor, this smells) SetList allSets; - QHashIterator setsIterator(sets); + QHashIterator setsIterator(sets); while (setsIterator.hasNext()) { allSets.append(setsIterator.next().value()); } @@ -891,10 +928,10 @@ LoadStatus CardDatabase::loadCardDatabases() void CardDatabase::refreshCachedReverseRelatedCards() { - foreach (CardInfo *card, cards) + for (const CardInfoPtr &card : cards) card->resetReverseRelatedCards2Me(); - foreach (CardInfo *card, cards) { + for (const CardInfoPtr &card : cards) { if (card->getReverseRelatedCards().isEmpty()) { continue; } @@ -923,7 +960,7 @@ void CardDatabase::refreshCachedReverseRelatedCards() QStringList CardDatabase::getAllColors() const { QSet colors; - QHashIterator cardIterator(cards); + QHashIterator cardIterator(cards); while (cardIterator.hasNext()) { const QStringList &cardColors = cardIterator.next().value()->getColors(); if (cardColors.isEmpty()) { @@ -940,7 +977,7 @@ QStringList CardDatabase::getAllColors() const QStringList CardDatabase::getAllMainCardTypes() const { QSet types; - QHashIterator cardIterator(cards); + QHashIterator cardIterator(cards); while (cardIterator.hasNext()) { types.insert(cardIterator.next().value()->getMainCardType()); } @@ -986,7 +1023,7 @@ void CardDatabase::markAllSetsAsKnown() void CardDatabase::notifyEnabledSetsChanged() { // refresh the list of cached set names - foreach (CardInfo *card, cards) + for (const CardInfoPtr &card : cards) card->refreshCachedSetNames(); // inform the carddatabasemodels that they need to re-check their list of cards @@ -995,7 +1032,7 @@ void CardDatabase::notifyEnabledSetsChanged() bool CardDatabase::saveCustomTokensToFile() { - CardSet *customTokensSet = getSet(CardDatabase::TOKENS_SETNAME); + CardSetPtr customTokensSet = getSet(CardDatabase::TOKENS_SETNAME); QString fileName = settingsCache->getCustomCardDatabasePath() + "/" + CardDatabase::TOKENS_SETNAME + ".xml"; QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { @@ -1010,9 +1047,9 @@ bool CardDatabase::saveCustomTokensToFile() xml.writeAttribute("version", QString::number(versionNeeded)); xml.writeStartElement("cards"); - QHashIterator cardIterator(cards); + QHashIterator cardIterator(cards); while (cardIterator.hasNext()) { - CardInfo *card = cardIterator.next().value(); + CardInfoPtr card = cardIterator.next().value(); if (card->getSets().contains(customTokensSet)) { xml << card; } diff --git a/cockatrice/src/carddatabase.h b/cockatrice/src/carddatabase.h index 43b48f66..a660c396 100644 --- a/cockatrice/src/carddatabase.h +++ b/cockatrice/src/carddatabase.h @@ -7,19 +7,23 @@ #include #include #include +#include #include #include class CardDatabase; class CardInfo; +class CardSet; class CardRelation; typedef QMap QStringMap; - -// If we don't typedef this, CardInfo::CardInfo will refuse to compile on OS X < 10.9 typedef QMap MuidMap; +typedef QSharedPointer CardInfoPtr; +typedef QSharedPointer CardSetPtr; -class CardSet : public QList +Q_DECLARE_METATYPE(CardInfoPtr) + +class CardSet : public QList { private: QString shortName, longName; @@ -33,6 +37,10 @@ public: const QString &_longName = QString(), const QString &_setType = QString(), const QDate &_releaseDate = QDate()); + static CardSetPtr newInstance(const QString &_shortName = QString(), + const QString &_longName = QString(), + const QString &_setType = QString(), + const QDate &_releaseDate = QDate()); QString getCorrectedShortName() const; QString getShortName() const { @@ -87,7 +95,7 @@ public: } }; -class SetList : public QList +class SetList : public QList { private: class KeyCompareFunctor; @@ -107,6 +115,7 @@ class CardInfo : public QObject { Q_OBJECT private: + CardInfoPtr smartThis; QString name; /* @@ -167,6 +176,31 @@ public: QStringMap _rarities = QStringMap()); ~CardInfo() override; + static CardInfoPtr newInstance(const QString &_name = QString(), + bool _isToken = false, + const QString &_manacost = QString(), + const QString &_cmc = QString(), + const QString &_cardtype = QString(), + const QString &_powtough = QString(), + const QString &_text = QString(), + const QStringList &_colors = QStringList(), + const QList &_relatedCards = QList(), + const QList &_reverseRelatedCards = QList(), + bool _upsideDownArt = false, + int _loyalty = 0, + bool _cipt = false, + int _tableRow = 0, + const SetList &_sets = SetList(), + const QStringMap &_customPicURLs = QStringMap(), + MuidMap muids = MuidMap(), + QStringMap _collectorNumbers = QStringMap(), + QStringMap _rarities = QStringMap()); + + void setSmartPointer(CardInfoPtr _ptr) + { + smartThis = _ptr; + } + inline const QString &getName() const { return name; @@ -219,27 +253,27 @@ public: { return cipt; } - // void setManaCost(const QString &_manaCost) { manacost = _manaCost; emit cardInfoChanged(this); } - // void setCmc(const QString &_cmc) { cmc = _cmc; emit cardInfoChanged(this); } + // void setManaCost(const QString &_manaCost) { manacost = _manaCost; emit cardInfoChanged(smartThis); } + // void setCmc(const QString &_cmc) { cmc = _cmc; emit cardInfoChanged(smartThis); } void setCardType(const QString &_cardType) { cardtype = _cardType; - emit cardInfoChanged(this); + emit cardInfoChanged(smartThis); } void setPowTough(const QString &_powTough) { powtough = _powTough; - emit cardInfoChanged(this); + emit cardInfoChanged(smartThis); } void setText(const QString &_text) { text = _text; - emit cardInfoChanged(this); + emit cardInfoChanged(smartThis); } void setColors(const QStringList &_colors) { colors = _colors; - emit cardInfoChanged(this); + emit cardInfoChanged(smartThis); } const QChar getColorChar() const; const QStringList &getColors() const @@ -297,7 +331,7 @@ public: { tableRow = _tableRow; } - // void setLoyalty(int _loyalty) { loyalty = _loyalty; emit cardInfoChanged(this); } + // void setLoyalty(int _loyalty) { loyalty = _loyalty; emit cardInfoChanged(smartThis); } // void setCustomPicURL(const QString &_set, const QString &_customPicURL) { customPicURLs.insert(_set, // _customPicURL); } void setMuId(const QString &_set, const int &_muId) @@ -312,7 +346,7 @@ public: { rarities.insert(_set, _setNumber); } - void addToSet(CardSet *set); + void addToSet(CardSetPtr set); void emitPixmapUpdated() { emit pixmapUpdated(); @@ -327,7 +361,7 @@ public: signals: void pixmapUpdated(); - void cardInfoChanged(CardInfo *card); + void cardInfoChanged(CardInfoPtr card); }; enum LoadStatus @@ -340,8 +374,8 @@ enum LoadStatus NoCards }; -typedef QHash CardNameMap; -typedef QHash SetNameMap; +typedef QHash CardNameMap; +typedef QHash SetNameMap; class CardDatabase : public QObject { @@ -369,7 +403,7 @@ private: void loadCardsFromXml(QXmlStreamReader &xml); void loadSetsFromXml(QXmlStreamReader &xml); - CardInfo *getCardFromMap(const CardNameMap &cardMap, const QString &cardName) const; + CardInfoPtr getCardFromMap(const CardNameMap &cardMap, const QString &cardName) const; void checkUnknownSets(); void refreshCachedReverseRelatedCards(); @@ -383,19 +417,19 @@ public: explicit CardDatabase(QObject *parent = nullptr); ~CardDatabase() override; void clear(); - void addCard(CardInfo *card); - void removeCard(CardInfo *card); - CardInfo *getCard(const QString &cardName) const; - QList getCards(const QStringList &cardNames) const; + void addCard(CardInfoPtr card); + void removeCard(CardInfoPtr card); + CardInfoPtr getCard(const QString &cardName) const; + QList getCards(const QStringList &cardNames) const; /* * Get a card by its simple name. The name will be simplified in this * function, so you don't need to simplify it beforehand. */ - CardInfo *getCardBySimpleName(const QString &cardName) const; + CardInfoPtr getCardBySimpleName(const QString &cardName) const; - CardSet *getSet(const QString &setName); - QList getCardList() const + CardSetPtr getSet(const QString &setName); + QList getCardList() const { return cards.values(); } @@ -422,8 +456,8 @@ signals: void cardDatabaseNewSetsFound(int numUnknownSets, QStringList unknownSetsNames); void cardDatabaseAllNewSetsEnabled(); void cardDatabaseEnabledSetsChanged(); - void cardAdded(CardInfo *card); - void cardRemoved(CardInfo *card); + void cardAdded(CardInfoPtr card); + void cardRemoved(CardInfoPtr card); }; class CardRelation : public QObject diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index ed66397a..bba3722f 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -6,8 +6,8 @@ CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent) : QAbstractListModel(parent), db(_db), showOnlyCardsFromEnabledSets(_showOnlyCardsFromEnabledSets) { - connect(db, SIGNAL(cardAdded(CardInfo *)), this, SLOT(cardAdded(CardInfo *))); - connect(db, SIGNAL(cardRemoved(CardInfo *)), this, SLOT(cardRemoved(CardInfo *))); + connect(db, SIGNAL(cardAdded(CardInfoPtr)), this, SLOT(cardAdded(CardInfoPtr))); + connect(db, SIGNAL(cardRemoved(CardInfoPtr)), this, SLOT(cardRemoved(CardInfoPtr))); connect(db, SIGNAL(cardDatabaseEnabledSetsChanged()), this, SLOT(cardDatabaseEnabledSetsChanged())); cardDatabaseEnabledSetsChanged(); @@ -33,7 +33,7 @@ QVariant CardDatabaseModel::data(const QModelIndex &index, int role) const (role != Qt::DisplayRole && role != SortRole)) return QVariant(); - CardInfo *card = cardList.at(index.row()); + CardInfoPtr card = cardList.at(index.row()); switch (index.column()) { case NameColumn: return card->getName(); @@ -77,7 +77,7 @@ QVariant CardDatabaseModel::headerData(int section, Qt::Orientation orientation, } } -void CardDatabaseModel::cardInfoChanged(CardInfo *card) +void CardDatabaseModel::cardInfoChanged(CardInfoPtr card) { const int row = cardList.indexOf(card); if (row == -1) @@ -86,12 +86,12 @@ void CardDatabaseModel::cardInfoChanged(CardInfo *card) emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1)); } -bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfo *card) +bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfoPtr card) { if (!showOnlyCardsFromEnabledSets) return true; - foreach (CardSet *set, card->getSets()) { + for (CardSetPtr set : card->getSets()) { if (set->getEnabled()) return true; } @@ -102,44 +102,46 @@ bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfo *card) void CardDatabaseModel::cardDatabaseEnabledSetsChanged() { // remove all the cards no more present in at least one enabled set - foreach (CardInfo *card, cardList) { + foreach (CardInfoPtr card, cardList) { if (!checkCardHasAtLeastOneEnabledSet(card)) cardRemoved(card); } // re-check all the card currently not shown, maybe their part of a newly-enabled set - foreach (CardInfo *card, db->getCardList()) { + foreach (CardInfoPtr card, db->getCardList()) { if (!cardList.contains(card)) cardAdded(card); } } -void CardDatabaseModel::cardAdded(CardInfo *card) +void CardDatabaseModel::cardAdded(CardInfoPtr card) { if (checkCardHasAtLeastOneEnabledSet(card)) { // add the card if it's present in at least one enabled set beginInsertRows(QModelIndex(), cardList.size(), cardList.size()); cardList.append(card); - connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); + connect(card.data(), SIGNAL(cardInfoChanged(CardInfoPtr)), this, SLOT(cardInfoChanged(CardInfoPtr))); endInsertRows(); } } -void CardDatabaseModel::cardRemoved(CardInfo *card) +void CardDatabaseModel::cardRemoved(CardInfoPtr card) { const int row = cardList.indexOf(card); - if (row == -1) + if (row == -1) { return; + } beginRemoveRows(QModelIndex(), row, row); - disconnect(card, 0, this, 0); + disconnect(card.data(), nullptr, this, nullptr); + card.clear(); cardList.removeAt(row); endRemoveRows(); } CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) : QSortFilterProxyModel(parent), isToken(ShowAll) { - filterTree = NULL; + filterTree = nullptr; setFilterCaseSensitivity(Qt::CaseInsensitive); setSortCaseSensitivity(Qt::CaseInsensitive); @@ -274,7 +276,7 @@ int CardDatabaseDisplayModel::lessThanNumerically(const QString &left, const QSt } bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const { - CardInfo const *info = static_cast(sourceModel())->getCard(sourceRow); + CardInfoPtr info = static_cast(sourceModel())->getCard(sourceRow); if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken())) return false; @@ -282,7 +284,7 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex return rowMatchesCardName(info); } -bool CardDatabaseDisplayModel::rowMatchesCardName(CardInfo const *info) const +bool CardDatabaseDisplayModel::rowMatchesCardName(CardInfoPtr info) const { if (!cardName.isEmpty() && !info->getName().contains(cardName, Qt::CaseInsensitive)) return false; @@ -290,7 +292,7 @@ bool CardDatabaseDisplayModel::rowMatchesCardName(CardInfo const *info) const if (!cardNameSet.isEmpty() && !cardNameSet.contains(info->getName())) return false; - if (filterTree != NULL) + if (filterTree != nullptr) return filterTree->acceptsCard(info); return true; @@ -302,15 +304,15 @@ void CardDatabaseDisplayModel::clearFilterAll() cardText.clear(); cardTypes.clear(); cardColors.clear(); - if (filterTree != NULL) + if (filterTree != nullptr) filterTree->clear(); invalidateFilter(); } void CardDatabaseDisplayModel::setFilterTree(FilterTree *filterTree) { - if (this->filterTree != NULL) - disconnect(this->filterTree, 0, this, 0); + if (this->filterTree != nullptr) + disconnect(this->filterTree, nullptr, this, nullptr); this->filterTree = filterTree; connect(this->filterTree, SIGNAL(changed()), this, SLOT(filterTreeChanged())); @@ -328,7 +330,7 @@ TokenDisplayModel::TokenDisplayModel(QObject *parent) : CardDatabaseDisplayModel bool TokenDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const { - CardInfo const *info = static_cast(sourceModel())->getCard(sourceRow); + CardInfoPtr info = static_cast(sourceModel())->getCard(sourceRow); return info->getIsToken() && rowMatchesCardName(info); } diff --git a/cockatrice/src/carddatabasemodel.h b/cockatrice/src/carddatabasemodel.h index a12e221f..a89c1f30 100644 --- a/cockatrice/src/carddatabasemodel.h +++ b/cockatrice/src/carddatabasemodel.h @@ -36,21 +36,21 @@ public: { return db; } - CardInfo *getCard(int index) const + CardInfoPtr getCard(int index) const { return cardList[index]; } private: - QList cardList; + QList cardList; CardDatabase *db; bool showOnlyCardsFromEnabledSets; - inline bool checkCardHasAtLeastOneEnabledSet(CardInfo *card); + inline bool checkCardHasAtLeastOneEnabledSet(CardInfoPtr card); private slots: - void cardAdded(CardInfo *card); - void cardRemoved(CardInfo *card); - void cardInfoChanged(CardInfo *card); + void cardAdded(CardInfoPtr card); + void cardRemoved(CardInfoPtr card); + void cardInfoChanged(CardInfoPtr card); void cardDatabaseEnabledSetsChanged(); }; @@ -122,7 +122,7 @@ protected: bool lessThan(const QModelIndex &left, const QModelIndex &right) const; static int lessThanNumerically(const QString &left, const QString &right); bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; - bool rowMatchesCardName(CardInfo const *info) const; + bool rowMatchesCardName(CardInfoPtr info) const; bool canFetchMore(const QModelIndex &parent) const; void fetchMore(const QModelIndex &parent); private slots: diff --git a/cockatrice/src/cardframe.cpp b/cockatrice/src/cardframe.cpp index 3e3373a2..eecbc328 100644 --- a/cockatrice/src/cardframe.cpp +++ b/cockatrice/src/cardframe.cpp @@ -1,6 +1,5 @@ #include "cardframe.h" -#include "carddatabase.h" #include "cardinfopicture.h" #include "cardinfotext.h" #include "carditem.h" @@ -88,16 +87,16 @@ void CardFrame::setViewMode(int mode) settingsCache->setCardInfoViewMode(mode); } -void CardFrame::setCard(CardInfo *card) +void CardFrame::setCard(CardInfoPtr card) { if (info) { - disconnect(info, nullptr, this, nullptr); + disconnect(info.data(), nullptr, this, nullptr); } info = card; if (info) { - connect(info, SIGNAL(destroyed()), this, SLOT(clear())); + connect(info.data(), SIGNAL(destroyed()), this, SLOT(clear())); } text->setCard(info); @@ -118,5 +117,5 @@ void CardFrame::setCard(AbstractCardItem *card) void CardFrame::clear() { - setCard((CardInfo *)nullptr); + setCard((CardInfoPtr) nullptr); } diff --git a/cockatrice/src/cardframe.h b/cockatrice/src/cardframe.h index 63a849ee..cf8b2ad0 100644 --- a/cockatrice/src/cardframe.h +++ b/cockatrice/src/cardframe.h @@ -3,8 +3,9 @@ #include +#include "carddatabase.h" + class AbstractCardItem; -class CardInfo; class CardInfoPicture; class CardInfoText; class QVBoxLayout; @@ -14,7 +15,7 @@ class CardFrame : public QTabWidget { Q_OBJECT private: - CardInfo *info; + CardInfoPtr info; CardInfoPicture *pic; CardInfoText *text; bool cardTextOnly; @@ -33,7 +34,7 @@ public: void retranslateUi(); public slots: - void setCard(CardInfo *card); + void setCard(CardInfoPtr card); void setCard(const QString &cardName); void setCard(AbstractCardItem *card); void clear(); diff --git a/cockatrice/src/cardinfopicture.cpp b/cockatrice/src/cardinfopicture.cpp index be06903e..8db9a912 100644 --- a/cockatrice/src/cardinfopicture.cpp +++ b/cockatrice/src/cardinfopicture.cpp @@ -4,7 +4,6 @@ #include #include -#include "carddatabase.h" #include "carditem.h" #include "main.h" #include "pictureloader.h" @@ -14,16 +13,16 @@ CardInfoPicture::CardInfoPicture(QWidget *parent) : QWidget(parent), info(nullpt setMinimumHeight(100); } -void CardInfoPicture::setCard(CardInfo *card) +void CardInfoPicture::setCard(CardInfoPtr card) { if (info) { - disconnect(info, nullptr, this, nullptr); + disconnect(info.data(), nullptr, this, nullptr); } info = card; if (info) { - connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); + connect(info.data(), SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); } updatePixmap(); diff --git a/cockatrice/src/cardinfopicture.h b/cockatrice/src/cardinfopicture.h index 9544b26d..6a415f45 100644 --- a/cockatrice/src/cardinfopicture.h +++ b/cockatrice/src/cardinfopicture.h @@ -3,15 +3,16 @@ #include +#include "carddatabase.h" + class AbstractCardItem; -class CardInfo; class CardInfoPicture : public QWidget { Q_OBJECT private: - CardInfo *info; + CardInfoPtr info; QPixmap resizedPixmap; bool pixmapDirty; @@ -23,7 +24,7 @@ protected: void paintEvent(QPaintEvent *); void loadPixmap(); public slots: - void setCard(CardInfo *card); + void setCard(CardInfoPtr card); void updatePixmap(); }; diff --git a/cockatrice/src/cardinfotext.cpp b/cockatrice/src/cardinfotext.cpp index 46b4c6d6..b785ed0a 100644 --- a/cockatrice/src/cardinfotext.cpp +++ b/cockatrice/src/cardinfotext.cpp @@ -1,6 +1,5 @@ #include "cardinfotext.h" -#include "carddatabase.h" #include "carditem.h" #include "main.h" #include @@ -56,7 +55,7 @@ CardInfoText::CardInfoText(QWidget *parent) : QFrame(parent), info(nullptr) retranslateUi(); } -void CardInfoText::setCard(CardInfo *card) +void CardInfoText::setCard(CardInfoPtr card) { if (card) { nameLabel2->setText(card->getName()); diff --git a/cockatrice/src/cardinfotext.h b/cockatrice/src/cardinfotext.h index 0a9f5dc5..140d48b2 100644 --- a/cockatrice/src/cardinfotext.h +++ b/cockatrice/src/cardinfotext.h @@ -3,9 +3,9 @@ #include +#include "carddatabase.h" class QLabel; class QTextEdit; -class CardInfo; class CardInfoText : public QFrame { @@ -20,14 +20,14 @@ private: QLabel *loyaltyLabel1, *loyaltyLabel2; QTextEdit *textLabel; - CardInfo *info; + CardInfoPtr info; public: CardInfoText(QWidget *parent = 0); void retranslateUi(); public slots: - void setCard(CardInfo *card); + void setCard(CardInfoPtr card); }; #endif diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index c5c09b89..86377990 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -1,5 +1,4 @@ #include "cardinfowidget.h" -#include "carddatabase.h" #include "cardinfopicture.h" #include "cardinfotext.h" #include "carditem.h" @@ -38,13 +37,13 @@ CardInfoWidget::CardInfoWidget(const QString &cardName, QWidget *parent, Qt::Win resize(width(), sizeHint().height()); } -void CardInfoWidget::setCard(CardInfo *card) +void CardInfoWidget::setCard(CardInfoPtr card) { if (info) - disconnect(info, nullptr, this, nullptr); + disconnect(info.data(), nullptr, this, nullptr); info = card; if (info) - connect(info, SIGNAL(destroyed()), this, SLOT(clear())); + connect(info.data(), SIGNAL(destroyed()), this, SLOT(clear())); text->setCard(info); pic->setCard(info); @@ -62,5 +61,5 @@ void CardInfoWidget::setCard(AbstractCardItem *card) void CardInfoWidget::clear() { - setCard((CardInfo *)nullptr); + setCard((CardInfoPtr) nullptr); } diff --git a/cockatrice/src/cardinfowidget.h b/cockatrice/src/cardinfowidget.h index d99af573..f89ca504 100644 --- a/cockatrice/src/cardinfowidget.h +++ b/cockatrice/src/cardinfowidget.h @@ -5,7 +5,8 @@ #include #include -class CardInfo; +#include "carddatabase.h" + class CardInfoPicture; class CardInfoText; class AbstractCardItem; @@ -16,7 +17,7 @@ class CardInfoWidget : public QFrame private: qreal aspectRatio; - CardInfo *info; + CardInfoPtr info; CardInfoPicture *pic; CardInfoText *text; @@ -24,7 +25,7 @@ public: CardInfoWidget(const QString &cardName, QWidget *parent = 0, Qt::WindowFlags f = 0); public slots: - void setCard(CardInfo *card); + void setCard(CardInfoPtr card); void setCard(const QString &cardName); void setCard(AbstractCardItem *card); diff --git a/cockatrice/src/deck_loader.cpp b/cockatrice/src/deck_loader.cpp index 0f47db8a..7f2ee90c 100644 --- a/cockatrice/src/deck_loader.cpp +++ b/cockatrice/src/deck_loader.cpp @@ -120,7 +120,7 @@ struct FormatDeckListForExport void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const { // Get the card name - CardInfo *dbCard = db->getCard(card->getName()); + CardInfoPtr dbCard = db->getCard(card->getName()); if (!dbCard || dbCard->getIsToken()) { // If it's a token, we don't care about the card. return; @@ -223,7 +223,7 @@ void DeckLoader::saveToStream_DeckZone(QTextStream &out, const InnerDecklistNode for (int j = 0; j < zoneNode->size(); j++) { auto *card = dynamic_cast(zoneNode->at(j)); - CardInfo *info = db->getCard(card->getName()); + CardInfoPtr info = db->getCard(card->getName()); QString cardType = info ? info->getMainCardType() : "unknown"; cardsByType.insert(cardType, card); @@ -276,7 +276,7 @@ void DeckLoader::saveToStream_DeckZoneCards(QTextStream &out, QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneName) { - CardInfo *card = db->getCard(cardName); + CardInfoPtr card = db->getCard(cardName); if (card && card->getIsToken()) { return DECK_ZONE_TOKENS; @@ -288,7 +288,7 @@ QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneNam QString DeckLoader::getCompleteCardName(const QString cardName) const { if (db) { - CardInfo *temp = db->getCardBySimpleName(cardName); + CardInfoPtr temp = db->getCardBySimpleName(cardName); if (temp) { return temp->getName(); } diff --git a/cockatrice/src/decklistmodel.cpp b/cockatrice/src/decklistmodel.cpp index cb3fe244..6e3228f7 100644 --- a/cockatrice/src/decklistmodel.cpp +++ b/cockatrice/src/decklistmodel.cpp @@ -47,7 +47,7 @@ void DeckListModel::rebuildTree() continue; } - CardInfo *info = db->getCard(currentCard->getName()); + CardInfoPtr info = db->getCard(currentCard->getName()); QString cardType = info ? info->getMainCardType() : "unknown"; auto *cardTypeNode = dynamic_cast(node->findChild(cardType)); @@ -276,7 +276,7 @@ InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerD DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName) const { InnerDecklistNode *zoneNode, *typeNode; - CardInfo *info; + CardInfoPtr info; QString cardType; zoneNode = dynamic_cast(root->findChild(zoneName)); @@ -312,16 +312,16 @@ QModelIndex DeckListModel::findCard(const QString &cardName, const QString &zone QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneName, bool abAddAnyway) { - CardInfo *info = db->getCard(cardName); + CardInfoPtr info = db->getCard(cardName); if (info == nullptr) { if (abAddAnyway) { // We need to keep this card added no matter what // This is usually called from tab_deck_editor // So we'll create a new CardInfo with the name // and default values for all fields - info = new CardInfo(cardName, false, nullptr, nullptr, "unknown", nullptr, nullptr, QStringList(), - QList(), QList(), false, 0, false, 0, SetList(), - QStringMap(), MuidMap(), QStringMap(), QStringMap()); + info = CardInfo::newInstance(cardName, false, nullptr, nullptr, "unknown", nullptr, nullptr, QStringList(), + QList(), QList(), false, 0, false, 0, + SetList(), QStringMap(), MuidMap(), QStringMap(), QStringMap()); } else { return {}; } diff --git a/cockatrice/src/deckstats_interface.cpp b/cockatrice/src/deckstats_interface.cpp index 1e038210..3b410ad2 100644 --- a/cockatrice/src/deckstats_interface.cpp +++ b/cockatrice/src/deckstats_interface.cpp @@ -74,7 +74,7 @@ struct CopyIfNotAToken void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const { - CardInfo *dbCard = cardDatabase.getCard(card->getName()); + CardInfoPtr dbCard = cardDatabase.getCard(card->getName()); if (dbCard && !dbCard->getIsToken()) { DecklistCardNode *addedCard = destination.addCard(card->getName(), node->getName()); addedCard->setNumber(card->getNumber()); diff --git a/cockatrice/src/dlg_create_token.cpp b/cockatrice/src/dlg_create_token.cpp index 378a2aac..290cca53 100644 --- a/cockatrice/src/dlg_create_token.cpp +++ b/cockatrice/src/dlg_create_token.cpp @@ -144,9 +144,14 @@ void DlgCreateToken::closeEvent(QCloseEvent *event) void DlgCreateToken::tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex & /*previous*/) { const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); - CardInfo *cardInfo = current.row() >= 0 ? cardDatabaseModel->getCard(realIndex.row()) : 0; - if (cardInfo) { + CardInfoPtr cardInfo; + + if (current.row() >= 0) { + cardInfo = cardDatabaseModel->getCard(realIndex.row()); + } + + if (!cardInfo) { updateSearchFieldWithoutUpdatingFilter(cardInfo->getName()); const QChar cardColor = cardInfo->getColorChar(); colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString)); diff --git a/cockatrice/src/dlg_edit_tokens.cpp b/cockatrice/src/dlg_edit_tokens.cpp index 7db03bb7..be910ff9 100644 --- a/cockatrice/src/dlg_edit_tokens.cpp +++ b/cockatrice/src/dlg_edit_tokens.cpp @@ -116,9 +116,14 @@ DlgEditTokens::DlgEditTokens(QWidget *parent) : QDialog(parent), currentCard(0) void DlgEditTokens::tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex & /* previous */) { const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); - currentCard = current.row() >= 0 ? databaseModel->getCard(realIndex.row()) : 0; - if (currentCard) { + if (current.row() >= 0) { + currentCard = databaseModel->getCard(realIndex.row()); + } else { + currentCard.clear(); + } + + if (!currentCard) { nameEdit->setText(currentCard->getName()); const QChar cardColor = currentCard->getColorChar(); colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString)); @@ -149,7 +154,7 @@ void DlgEditTokens::actAddToken() } } while (askAgain); - CardInfo *card = new CardInfo(name, true); + CardInfoPtr card = CardInfo::newInstance(name, true); card->addToSet(databaseModel->getDatabase()->getSet(CardDatabase::TOKENS_SETNAME)); card->setCardType("Token"); databaseModel->getDatabase()->addCard(card); @@ -158,10 +163,9 @@ void DlgEditTokens::actAddToken() void DlgEditTokens::actRemoveToken() { if (currentCard) { - CardInfo *cardToRemove = currentCard; // the currentCard property gets modified during db->removeCard() - currentCard = 0; + CardInfoPtr cardToRemove = currentCard; // the currentCard property gets modified during db->removeCard() + currentCard.clear(); databaseModel->getDatabase()->removeCard(cardToRemove); - delete cardToRemove; } } diff --git a/cockatrice/src/dlg_edit_tokens.h b/cockatrice/src/dlg_edit_tokens.h index 7717f922..6e9b3666 100644 --- a/cockatrice/src/dlg_edit_tokens.h +++ b/cockatrice/src/dlg_edit_tokens.h @@ -1,6 +1,7 @@ #ifndef DLG_EDIT_TOKENS_H #define DLG_EDIT_TOKENS_H +#include "carddatabase.h" #include class QModelIndex; @@ -10,7 +11,6 @@ class QLabel; class QComboBox; class QLineEdit; class QTreeView; -class CardInfo; class DlgEditTokens : public QDialog { @@ -25,7 +25,7 @@ private slots: void actRemoveToken(); private: - CardInfo *currentCard; + CardInfoPtr currentCard; CardDatabaseModel *databaseModel; TokenDisplayModel *cardDatabaseDisplayModel; QStringList predefinedTokens; @@ -35,7 +35,7 @@ private: QTreeView *chooseTokenView; public: - DlgEditTokens(QWidget *parent = 0); + DlgEditTokens(QWidget *parent = nullptr); }; #endif diff --git a/cockatrice/src/filtertree.cpp b/cockatrice/src/filtertree.cpp index ea4d4af5..84020876 100644 --- a/cockatrice/src/filtertree.cpp +++ b/cockatrice/src/filtertree.cpp @@ -1,5 +1,4 @@ #include "filtertree.h" -#include "carddatabase.h" #include "cardfilter.h" #include @@ -100,7 +99,7 @@ FilterTreeNode *FilterItemList::termNode(const QString &term) return childNodes.at(i); } -bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const +bool FilterItemList::testTypeAnd(const CardInfoPtr info, CardFilter::Attr attr) const { for (auto i = childNodes.constBegin(); i != childNodes.constEnd(); i++) { if (!(*i)->isEnabled()) { @@ -115,13 +114,13 @@ bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) co return true; } -bool FilterItemList::testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const +bool FilterItemList::testTypeAndNot(const CardInfoPtr info, CardFilter::Attr attr) const { // if any one in the list is true, return false return !testTypeOr(info, attr); } -bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) const +bool FilterItemList::testTypeOr(const CardInfoPtr info, CardFilter::Attr attr) const { bool noChildEnabledChild = true; @@ -142,23 +141,23 @@ bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) con return noChildEnabledChild; } -bool FilterItemList::testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const +bool FilterItemList::testTypeOrNot(const CardInfoPtr info, CardFilter::Attr attr) const { // if any one in the list is false, return true return !testTypeAnd(info, attr); } -bool FilterItem::acceptName(const CardInfo *info) const +bool FilterItem::acceptName(const CardInfoPtr info) const { return info->getName().contains(term, Qt::CaseInsensitive); } -bool FilterItem::acceptType(const CardInfo *info) const +bool FilterItem::acceptType(const CardInfoPtr info) const { return info->getCardType().contains(term, Qt::CaseInsensitive); } -bool FilterItem::acceptColor(const CardInfo *info) const +bool FilterItem::acceptColor(const CardInfoPtr info) const { QString converted_term = term.trimmed(); @@ -198,12 +197,12 @@ bool FilterItem::acceptColor(const CardInfo *info) const return match_count == converted_term.length(); } -bool FilterItem::acceptText(const CardInfo *info) const +bool FilterItem::acceptText(const CardInfoPtr info) const { return info->getText().contains(term, Qt::CaseInsensitive); } -bool FilterItem::acceptSet(const CardInfo *info) const +bool FilterItem::acceptSet(const CardInfoPtr info) const { bool status = false; for (auto i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) { @@ -217,7 +216,7 @@ bool FilterItem::acceptSet(const CardInfo *info) const return status; } -bool FilterItem::acceptManaCost(const CardInfo *info) const +bool FilterItem::acceptManaCost(const CardInfoPtr info) const { QString partialCost = term.toUpper(); QString fullManaCost = info->getManaCost(); @@ -230,24 +229,24 @@ bool FilterItem::acceptManaCost(const CardInfo *info) const return (fullManaCost.indexOf(partialCost) > -1); } -bool FilterItem::acceptCmc(const CardInfo *info) const +bool FilterItem::acceptCmc(const CardInfoPtr info) const { return (info->getCmc() == term); } -bool FilterItem::acceptPower(const CardInfo *info) const +bool FilterItem::acceptPower(const CardInfoPtr info) const { int slash = info->getPowTough().indexOf("/"); return (slash != -1) ? (info->getPowTough().mid(0, slash) == term) : false; } -bool FilterItem::acceptToughness(const CardInfo *info) const +bool FilterItem::acceptToughness(const CardInfoPtr info) const { int slash = info->getPowTough().indexOf("/"); return (slash != -1) ? (info->getPowTough().mid(slash + 1) == term) : false; } -bool FilterItem::acceptRarity(const CardInfo *info) const +bool FilterItem::acceptRarity(const CardInfoPtr info) const { QString converted_term = term.trimmed(); @@ -296,7 +295,7 @@ bool FilterItem::acceptRarity(const CardInfo *info) const return false; } -bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const +bool FilterItem::acceptCardAttr(const CardInfoPtr info, CardFilter::Attr attr) const { switch (attr) { case CardFilter::AttrName: @@ -383,7 +382,7 @@ FilterTreeNode *FilterTree::attrTypeNode(CardFilter::Attr attr, CardFilter::Type return attrTypeList(attr, type); } -bool FilterTree::testAttr(const CardInfo *info, const LogicMap *lm) const +bool FilterTree::testAttr(const CardInfoPtr info, const LogicMap *lm) const { const FilterItemList *fil; bool status = true; @@ -416,7 +415,7 @@ bool FilterTree::testAttr(const CardInfo *info, const LogicMap *lm) const return status; } -bool FilterTree::acceptsCard(const CardInfo *info) const +bool FilterTree::acceptsCard(const CardInfoPtr info) const { for (auto i = childNodes.constBegin(); i != childNodes.constEnd(); i++) { if ((*i)->isEnabled() && !testAttr(info, *i)) { diff --git a/cockatrice/src/filtertree.h b/cockatrice/src/filtertree.h index 30021669..f38f00e5 100644 --- a/cockatrice/src/filtertree.h +++ b/cockatrice/src/filtertree.h @@ -5,10 +5,9 @@ #include #include +#include "carddatabase.h" #include "cardfilter.h" -class CardInfo; - class FilterTreeNode { private: @@ -160,10 +159,10 @@ public: return CardFilter::typeName(type); } - bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; - bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const; - bool testTypeOr(const CardInfo *info, CardFilter::Attr attr) const; - bool testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeAnd(const CardInfoPtr info, CardFilter::Attr attr) const; + bool testTypeAndNot(const CardInfoPtr info, CardFilter::Attr attr) const; + bool testTypeOr(const CardInfoPtr info, CardFilter::Attr attr) const; + bool testTypeOrNot(const CardInfoPtr info, CardFilter::Attr attr) const; }; class FilterItem : public FilterTreeNode @@ -204,17 +203,17 @@ public: return true; } - bool acceptName(const CardInfo *info) const; - bool acceptType(const CardInfo *info) const; - bool acceptColor(const CardInfo *info) const; - bool acceptText(const CardInfo *info) const; - bool acceptSet(const CardInfo *info) const; - bool acceptManaCost(const CardInfo *info) const; - bool acceptCmc(const CardInfo *info) const; - bool acceptPower(const CardInfo *info) const; - bool acceptToughness(const CardInfo *info) const; - bool acceptRarity(const CardInfo *info) const; - bool acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const; + bool acceptName(const CardInfoPtr info) const; + bool acceptType(const CardInfoPtr info) const; + bool acceptColor(const CardInfoPtr info) const; + bool acceptText(const CardInfoPtr info) const; + bool acceptSet(const CardInfoPtr info) const; + bool acceptManaCost(const CardInfoPtr info) const; + bool acceptCmc(const CardInfoPtr info) const; + bool acceptPower(const CardInfoPtr info) const; + bool acceptToughness(const CardInfoPtr info) const; + bool acceptRarity(const CardInfoPtr info) const; + bool acceptCardAttr(const CardInfoPtr info, CardFilter::Attr attr) const; }; class FilterTree : public QObject, public FilterTreeBranch @@ -232,7 +231,7 @@ private: LogicMap *attrLogicMap(CardFilter::Attr attr); FilterItemList *attrTypeList(CardFilter::Attr attr, CardFilter::Type type); - bool testAttr(const CardInfo *info, const LogicMap *lm) const; + bool testAttr(const CardInfoPtr info, const LogicMap *lm) const; void nodeChanged() const { @@ -272,7 +271,7 @@ public: return 0; } - bool acceptsCard(const CardInfo *info) const; + bool acceptsCard(const CardInfoPtr info) const; void clear(); }; diff --git a/cockatrice/src/pictureloader.cpp b/cockatrice/src/pictureloader.cpp index 19f4deb5..791bb223 100644 --- a/cockatrice/src/pictureloader.cpp +++ b/cockatrice/src/pictureloader.cpp @@ -20,6 +20,7 @@ #include #include #include +#include // never cache more than 300 cards at once for a single deck #define CACHED_CARD_PER_DECK_MAX 300 @@ -32,29 +33,17 @@ public: * Enabled sets have priority over disabled sets * Both groups follows the user-defined order */ - inline bool operator()(CardSet *a, CardSet *b) const + inline bool operator()(const CardSetPtr &a, const CardSetPtr &b) const { if (a->getEnabled()) { - if (b->getEnabled()) { - // both enabled: sort by key - return a->getSortKey() < b->getSortKey(); - } else { - // only a enabled - return true; - } + return !b->getEnabled() || a->getSortKey() < b->getSortKey(); } else { - if (b->getEnabled()) { - // only b enabled - return false; - } else { - // both disabled: sort by key - return a->getSortKey() < b->getSortKey(); - } + return !b->getEnabled() && a->getSortKey() < b->getSortKey(); } } }; -PictureToLoad::PictureToLoad(CardInfo *_card) : card(_card), setIndex(0) +PictureToLoad::PictureToLoad(CardInfoPtr _card) : card(std::move(_card)), setIndex(0) { if (card) { sortedSets = card->getSets(); @@ -78,18 +67,18 @@ QString PictureToLoad::getSetName() const return QString(""); } -CardSet *PictureToLoad::getCurrentSet() const +CardSetPtr PictureToLoad::getCurrentSet() const { if (setIndex < sortedSets.size()) return sortedSets[setIndex]; else - return 0; + return {}; } QStringList PictureLoaderWorker::md5Blacklist = QStringList() << "db0c48db407a907c16ade38de048a441"; // card back returned by gatherer when card is not found -PictureLoaderWorker::PictureLoaderWorker() : QObject(0), downloadRunning(false), loadQueueRunning(false) +PictureLoaderWorker::PictureLoaderWorker() : QObject(nullptr), downloadRunning(false), loadQueueRunning(false) { picsPath = settingsCache->getPicsPath(); customPicsPath = settingsCache->getCustomPicsPath(); @@ -140,7 +129,7 @@ void PictureLoaderWorker::processLoadQueue() if (picDownload) { qDebug() << "Picture NOT found, trying to download (set: " << setName << " card: " << cardName << ")"; cardsToDownload.append(cardBeingLoaded); - cardBeingLoaded = 0; + cardBeingLoaded.clear(); if (!downloadRunning) startNextPicDownload(); } else { @@ -149,7 +138,7 @@ void PictureLoaderWorker::processLoadQueue() << " card: " << cardName << ")"; mutex.lock(); loadQueue.prepend(cardBeingLoaded); - cardBeingLoaded = 0; + cardBeingLoaded.clear(); mutex.unlock(); } else { qDebug() << "Picture NOT found, download disabled, no more sets to try: BAILING OUT (oldset: " @@ -213,8 +202,8 @@ QString PictureLoaderWorker::getPicUrl() if (!picDownload) return QString(); - CardInfo *card = cardBeingDownloaded.getCard(); - CardSet *set = cardBeingDownloaded.getCurrentSet(); + CardInfoPtr card = cardBeingDownloaded.getCard(); + CardSetPtr set = cardBeingDownloaded.getCurrentSet(); QString picUrl = QString(""); // if sets have been defined for the card, they can contain custom picUrls @@ -258,7 +247,7 @@ QString PictureLoaderWorker::getPicUrl() void PictureLoaderWorker::startNextPicDownload() { if (cardsToDownload.isEmpty()) { - cardBeingDownloaded = 0; + cardBeingDownloaded.clear(); downloadRunning = false; return; } @@ -292,7 +281,7 @@ void PictureLoaderWorker::picDownloadFailed() qDebug() << "Picture NOT found, download failed, no more sets to try: BAILING OUT (oldset: " << cardBeingDownloaded.getSetName() << " card: " << cardBeingDownloaded.getCard()->getName() << ")"; imageLoaded(cardBeingDownloaded.getCard(), QImage()); - cardBeingDownloaded = 0; + cardBeingDownloaded.clear(); } emit startLoadQueue(); } @@ -364,7 +353,7 @@ void PictureLoaderWorker::picDownloadFinished(QNetworkReply *reply) startNextPicDownload(); } -void PictureLoaderWorker::enqueueImageLoad(CardInfo *card) +void PictureLoaderWorker::enqueueImageLoad(CardInfoPtr card) { QMutexLocker locker(&mutex); @@ -405,8 +394,8 @@ PictureLoader::PictureLoader() : QObject(0) connect(settingsCache, SIGNAL(picsPathChanged()), this, SLOT(picsPathChanged())); connect(settingsCache, SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); - connect(worker, SIGNAL(imageLoaded(CardInfo *, const QImage &)), this, - SLOT(imageLoaded(CardInfo *, const QImage &))); + connect(worker, SIGNAL(imageLoaded(CardInfoPtr, const QImage &)), this, + SLOT(imageLoaded(CardInfoPtr, const QImage &))); } PictureLoader::~PictureLoader() @@ -424,7 +413,7 @@ void PictureLoader::getCardBackPixmap(QPixmap &pixmap, QSize size) } } -void PictureLoader::getPixmap(QPixmap &pixmap, CardInfo *card, QSize size) +void PictureLoader::getPixmap(QPixmap &pixmap, CardInfoPtr card, QSize size) { if (card == nullptr) return; @@ -447,7 +436,7 @@ void PictureLoader::getPixmap(QPixmap &pixmap, CardInfo *card, QSize size) getInstance().worker->enqueueImageLoad(card); } -void PictureLoader::imageLoaded(CardInfo *card, const QImage &image) +void PictureLoader::imageLoaded(CardInfoPtr card, const QImage &image) { if (image.isNull()) { QPixmapCache::insert(card->getPixmapCacheKey(), QPixmap()); @@ -463,7 +452,7 @@ void PictureLoader::imageLoaded(CardInfo *card, const QImage &image) card->emitPixmapUpdated(); } -void PictureLoader::clearPixmapCache(CardInfo *card) +void PictureLoader::clearPixmapCache(CardInfoPtr card) { if (card) QPixmapCache::remove(card->getPixmapCacheKey()); @@ -474,12 +463,12 @@ void PictureLoader::clearPixmapCache() QPixmapCache::clear(); } -void PictureLoader::cacheCardPixmaps(QList cards) +void PictureLoader::cacheCardPixmaps(QList cards) { QPixmap tmp; int max = qMin(cards.size(), CACHED_CARD_PER_DECK_MAX); for (int i = 0; i < max; ++i) { - CardInfo *card = cards.at(i); + CardInfoPtr card = cards.at(i); if (!card) continue; diff --git a/cockatrice/src/pictureloader.h b/cockatrice/src/pictureloader.h index 6878e5f9..d6bf1f08 100644 --- a/cockatrice/src/pictureloader.h +++ b/cockatrice/src/pictureloader.h @@ -6,8 +6,7 @@ #include #include -class CardInfo; -class CardSet; +#include "carddatabase.h" class QNetworkAccessManager; class QNetworkReply; class QThread; @@ -17,17 +16,21 @@ class PictureToLoad private: class SetDownloadPriorityComparator; - CardInfo *card; - QList sortedSets; + CardInfoPtr card; + QList sortedSets; int setIndex; public: - PictureToLoad(CardInfo *_card = 0); - CardInfo *getCard() const + PictureToLoad(CardInfoPtr _card = CardInfoPtr()); + CardInfoPtr getCard() const { return card; } - CardSet *getCurrentSet() const; + void clear() + { + card.clear(); + } + CardSetPtr getCurrentSet() const; QString getSetName() const; bool nextSet(); }; @@ -39,7 +42,7 @@ public: PictureLoaderWorker(); ~PictureLoaderWorker(); - void enqueueImageLoad(CardInfo *card); + void enqueueImageLoad(CardInfoPtr card); private: static QStringList md5Blacklist; @@ -67,7 +70,7 @@ public slots: void processLoadQueue(); signals: void startLoadQueue(); - void imageLoaded(CardInfo *card, const QImage &image); + void imageLoaded(CardInfoPtr card, const QImage &image); }; class PictureLoader : public QObject @@ -90,15 +93,15 @@ private: PictureLoaderWorker *worker; public: - static void getPixmap(QPixmap &pixmap, CardInfo *card, QSize size); + static void getPixmap(QPixmap &pixmap, CardInfoPtr card, QSize size); static void getCardBackPixmap(QPixmap &pixmap, QSize size); - static void clearPixmapCache(CardInfo *card); + static void clearPixmapCache(CardInfoPtr card); static void clearPixmapCache(); - static void cacheCardPixmaps(QList cards); + static void cacheCardPixmaps(QList cards); private slots: void picDownloadChanged(); void picsPathChanged(); public slots: - void imageLoaded(CardInfo *card, const QImage &image); + void imageLoaded(CardInfoPtr card, const QImage &image); }; #endif diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index f19679db..3e2e0eb0 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -1066,7 +1066,7 @@ void Player::actCreateToken() lastTokenName = dlg.getName(); lastTokenPT = dlg.getPT(); - CardInfo *correctedCard = db->getCardBySimpleName(lastTokenName); + CardInfoPtr correctedCard = db->getCardBySimpleName(lastTokenName); if (correctedCard) { lastTokenName = correctedCard->getName(); lastTokenTableRow = table->clampValidTableRow(2 - correctedCard->getTableRow()); @@ -1102,7 +1102,7 @@ void Player::actCreateAnotherToken() void Player::actCreatePredefinedToken() { QAction *action = static_cast(sender()); - CardInfo *cardInfo = db->getCard(action->text()); + CardInfoPtr cardInfo = db->getCard(action->text()); if (!cardInfo) return; @@ -1128,7 +1128,7 @@ void Player::actCreateRelatedCard() * then let's allow it to be created via "create another token" */ if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) { - CardInfo *cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName())); + CardInfoPtr cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName())); setLastToken(cardInfo); } } @@ -1207,7 +1207,7 @@ void Player::actCreateAllRelatedCards() * then assign the first to the "Create another" shortcut. */ if (cardRelation != nullptr && cardRelation->getCanCreateAnother()) { - CardInfo *cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName())); + CardInfoPtr cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName())); setLastToken(cardInfo); } } @@ -1244,7 +1244,7 @@ bool Player::createRelatedFromRelation(const CardItem *sourceCard, const CardRel void Player::createCard(const CardItem *sourceCard, const QString &dbCardName, bool attach) { - CardInfo *cardInfo = db->getCard(dbCardName); + CardInfoPtr cardInfo = db->getCard(dbCardName); if (cardInfo == nullptr || sourceCard == nullptr) return; @@ -1407,7 +1407,7 @@ void Player::eventCreateToken(const Event_CreateToken &event) if (!QString::fromStdString(event.pt()).isEmpty()) { card->setPT(QString::fromStdString(event.pt())); } else { - CardInfo *dbCard = db->getCard(QString::fromStdString(event.card_name())); + CardInfoPtr dbCard = db->getCard(QString::fromStdString(event.card_name())); if (dbCard) card->setPT(dbCard->getPowTough()); } @@ -1909,7 +1909,7 @@ void Player::playCard(CardItem *c, bool faceDown, bool tapped) CardToMove *cardToMove = cmd.mutable_cards_to_move()->add_card(); cardToMove->set_card_id(c->getId()); - CardInfo *ci = c->getInfo(); + CardInfoPtr ci = c->getInfo(); if (!ci) return; if (!faceDown && ((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) || @@ -2820,7 +2820,7 @@ void Player::processSceneSizeChange(int newPlayerWidth) hand->setWidth(tableWidth + stack->boundingRect().width()); } -void Player::setLastToken(CardInfo *cardInfo) +void Player::setLastToken(CardInfoPtr cardInfo) { if (cardInfo == nullptr || aCreateAnotherToken == nullptr) return; diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 04c06b84..70edd2cf 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -403,7 +403,7 @@ public: void sendGameCommand(PendingCommand *pend); void sendGameCommand(const google::protobuf::Message &command); - void setLastToken(CardInfo *cardInfo); + void setLastToken(CardInfoPtr cardInfo); }; #endif diff --git a/cockatrice/src/setsmodel.cpp b/cockatrice/src/setsmodel.cpp index e83b0233..e77790c5 100644 --- a/cockatrice/src/setsmodel.cpp +++ b/cockatrice/src/setsmodel.cpp @@ -3,15 +3,13 @@ SetsModel::SetsModel(CardDatabase *_db, QObject *parent) : QAbstractTableModel(parent), sets(_db->getSetList()) { sets.sortByKey(); - foreach (CardSet *set, sets) { + for (const CardSetPtr &set : sets) { if (set->getEnabled()) enabledSets.insert(set); } } -SetsModel::~SetsModel() -{ -} +SetsModel::~SetsModel() = default; int SetsModel::rowCount(const QModelIndex &parent) const { @@ -26,7 +24,7 @@ QVariant SetsModel::data(const QModelIndex &index, int role) const if (!index.isValid() || (index.column() >= NUM_COLS) || (index.row() >= rowCount())) return QVariant(); - CardSet *set = sets[index.row()]; + CardSetPtr set = sets[index.row()]; if (index.column() == EnabledCol) { switch (role) { @@ -146,7 +144,7 @@ bool SetsModel::dropMimeData(const QMimeData *data, void SetsModel::toggleRow(int row, bool enable) { - CardSet *temp = sets.at(row); + CardSetPtr temp = sets.at(row); if (enable) enabledSets.insert(temp); @@ -158,7 +156,7 @@ void SetsModel::toggleRow(int row, bool enable) void SetsModel::toggleRow(int row) { - CardSet *tmp = sets.at(row); + CardSetPtr tmp = sets.at(row); if (tmp == nullptr) return; @@ -176,7 +174,7 @@ void SetsModel::toggleAll(bool enabled) enabledSets.clear(); if (enabled) - foreach (CardSet *set, sets) + for (CardSetPtr set : sets) enabledSets.insert(set); emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); @@ -185,7 +183,7 @@ void SetsModel::toggleAll(bool enabled) void SetsModel::swapRows(int oldRow, int newRow) { beginRemoveRows(QModelIndex(), oldRow, oldRow); - CardSet *temp = sets.takeAt(oldRow); + CardSetPtr temp = sets.takeAt(oldRow); endRemoveRows(); beginInsertRows(QModelIndex(), newRow, newRow); @@ -197,14 +195,14 @@ void SetsModel::swapRows(int oldRow, int newRow) void SetsModel::sort(int column, Qt::SortOrder order) { - QMap setMap; + QMap setMap; int numRows = rowCount(); int row; for (row = 0; row < numRows; ++row) setMap.insertMulti(index(row, column).data(SetsModel::SortRole).toString(), sets.at(row)); - QList tmp = setMap.values(); + QList tmp = setMap.values(); sets.clear(); if (order == Qt::AscendingOrder) { for (row = 0; row < tmp.size(); row++) { @@ -222,11 +220,11 @@ void SetsModel::sort(int column, Qt::SortOrder order) void SetsModel::save(CardDatabase *db) { // order - for (int i = 0; i < sets.size(); i++) + for (unsigned int i = 0; i < sets.size(); i++) sets[i]->setSortKey(i + 1); // enabled sets - foreach (CardSet *set, sets) + for (const CardSetPtr &set : sets) set->setEnabled(enabledSets.contains(set)); sets.sortByKey(); @@ -242,7 +240,7 @@ void SetsModel::restore(CardDatabase *db) // enabled sets enabledSets.clear(); - foreach (CardSet *set, sets) { + for (const CardSetPtr &set : sets) { if (set->getEnabled()) enabledSets.insert(set); } diff --git a/cockatrice/src/setsmodel.h b/cockatrice/src/setsmodel.h index 96687aaf..eae9a003 100644 --- a/cockatrice/src/setsmodel.h +++ b/cockatrice/src/setsmodel.h @@ -36,7 +36,7 @@ class SetsModel : public QAbstractTableModel private: static const int NUM_COLS = 7; SetList sets; - QSet enabledSets; + QSet enabledSets; public: enum SetsColumns diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index c56de05e..de443671 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -1,6 +1,5 @@ #include "tab_deck_editor.h" #include "abstractclient.h" -#include "carddatabase.h" #include "carddatabasemodel.h" #include "cardframe.h" #include "decklistmodel.h" @@ -872,11 +871,13 @@ void TabDeckEditor::recursiveExpand(const QModelIndex &index) deckView->expand(index); } -CardInfo *TabDeckEditor::currentCardInfo() const +CardInfoPtr TabDeckEditor::currentCardInfo() const { const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex(); - if (!currentIndex.isValid()) - return NULL; + if (!currentIndex.isValid()) { + return {}; + } + const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); return db->getCard(cardName); @@ -884,9 +885,7 @@ CardInfo *TabDeckEditor::currentCardInfo() const void TabDeckEditor::addCardHelper(QString zoneName) { - const CardInfo *info; - - info = currentCardInfo(); + const CardInfoPtr info = currentCardInfo(); if (!info) return; if (info->getIsToken()) @@ -961,10 +960,9 @@ void TabDeckEditor::offsetCountAtIndex(const QModelIndex &idx, int offset) void TabDeckEditor::decrementCardHelper(QString zoneName) { - const CardInfo *info; + const CardInfoPtr info = currentCardInfo(); QModelIndex idx; - info = currentCardInfo(); if (!info) return; if (info->getIsToken()) diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 75a0db1b..955b657d 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -7,6 +7,8 @@ #include #include +#include "carddatabase.h" + class CardDatabaseModel; class CardDatabaseDisplayModel; class DeckListModel; @@ -19,7 +21,6 @@ class DeckLoader; class Response; class FilterTreeModel; class FilterBuilder; -class CardInfo; class QGroupBox; class QHBoxLayout; class QVBoxLayout; @@ -95,7 +96,7 @@ private slots: void saveDbHeaderState(); private: - CardInfo *currentCardInfo() const; + CardInfoPtr currentCardInfo() const; void addCardHelper(QString zoneName); void offsetCountAtIndex(const QModelIndex &idx, int offset); void decrementCardHelper(QString zoneName); diff --git a/cockatrice/src/tappedout_interface.cpp b/cockatrice/src/tappedout_interface.cpp index 77e1b83f..f2ea6790 100644 --- a/cockatrice/src/tappedout_interface.cpp +++ b/cockatrice/src/tappedout_interface.cpp @@ -100,7 +100,7 @@ struct CopyMainOrSide void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const { - CardInfo *dbCard = cardDatabase.getCard(card->getName()); + CardInfoPtr dbCard = cardDatabase.getCard(card->getName()); if (!dbCard || dbCard->getIsToken()) return; diff --git a/oracle/src/oracleimporter.cpp b/oracle/src/oracleimporter.cpp index 16c45e69..6cb19fa8 100644 --- a/oracle/src/oracleimporter.cpp +++ b/oracle/src/oracleimporter.cpp @@ -51,22 +51,22 @@ bool OracleImporter::readSetsFromByteArray(const QByteArray &data) return true; } -CardInfo *OracleImporter::addCard(const QString &setName, - QString cardName, - bool isToken, - int cardId, - QString &setNumber, - QString &cardCost, - QString &cmc, - const QString &cardType, - const QString &cardPT, - int cardLoyalty, - const QString &cardText, - const QStringList &colors, - const QList &relatedCards, - const QList &reverseRelatedCards, - bool upsideDown, - QString &rarity) +CardInfoPtr OracleImporter::addCard(const QString &setName, + QString cardName, + bool isToken, + int cardId, + QString &setNumber, + QString &cardCost, + QString &cmc, + const QString &cardType, + const QString &cardPT, + int cardLoyalty, + const QString &cardText, + const QStringList &colors, + const QList &relatedCards, + const QList &reverseRelatedCards, + bool upsideDown, + QString &rarity) { QStringList cardTextRows = cardText.split("\n"); @@ -74,7 +74,7 @@ CardInfo *OracleImporter::addCard(const QString &setName, cardName = cardName.replace("Æ", "AE"); cardName = cardName.replace("’", "'"); - CardInfo *card; + CardInfoPtr card; if (cards.contains(cardName)) { card = cards.value(cardName); } else { @@ -95,8 +95,8 @@ CardInfo *OracleImporter::addCard(const QString &setName, !cardText.contains(cardName + " enters the battlefield tapped unless")); // insert the card and its properties - card = new CardInfo(cardName, isToken, cardCost, cmc, cardType, cardPT, cardText, colors, relatedCards, - reverseRelatedCards, upsideDown, cardLoyalty, cipt); + card = CardInfo::newInstance(cardName, isToken, cardCost, cmc, cardType, cardPT, cardText, colors, relatedCards, + reverseRelatedCards, upsideDown, cardLoyalty, cipt); int tableRow = 1; QString mainCardType = card->getMainCardType(); if ((mainCardType == "Land") || mArtifact) @@ -134,7 +134,7 @@ void OracleImporter::extractColors(const QStringList &in, QStringList &out) } } -int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) +int OracleImporter::importTextSpoiler(CardSetPtr set, const QVariant &data) { int cards = 0; @@ -202,7 +202,7 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) colors.clear(); extractColors(map.value("colors").toStringList(), colors); - CardInfo *card = + CardInfoPtr card = addCard(set->getShortName(), cardName, false, cardId, setNumber, cardCost, cmc, cardType, cardPT, cardLoyalty, cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity); @@ -290,8 +290,9 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) upsideDown = false; // add the card - CardInfo *card = addCard(set->getShortName(), cardName, false, muid, setNumber, cardCost, cmc, cardType, cardPT, - cardLoyalty, cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity); + CardInfoPtr card = + addCard(set->getShortName(), cardName, false, muid, setNumber, cardCost, cmc, cardType, cardPT, cardLoyalty, + cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity); if (!set->contains(card)) { card->addToSet(set); @@ -311,21 +312,21 @@ int OracleImporter::startImport() const SetToDownload *curSet; // add an empty set for tokens - CardSet *tokenSet = new CardSet(TOKENS_SETNAME, tr("Dummy set containing tokens"), "Tokens"); + CardSetPtr tokenSet = CardSet::newInstance(TOKENS_SETNAME, tr("Dummy set containing tokens"), "Tokens"); sets.insert(TOKENS_SETNAME, tokenSet); while (it.hasNext()) { curSet = &it.next(); - CardSet *set = - new CardSet(curSet->getShortName(), curSet->getLongName(), curSet->getSetType(), curSet->getReleaseDate()); + CardSetPtr set = CardSet::newInstance(curSet->getShortName(), curSet->getLongName(), curSet->getSetType(), + curSet->getReleaseDate()); if (!sets.contains(set->getShortName())) sets.insert(set->getShortName(), set); - int setCards = importTextSpoiler(set, curSet->getCards()); + int setCardsHere = importTextSpoiler(set, curSet->getCards()); ++setIndex; - emit setIndexChanged(setCards, setIndex, curSet->getLongName()); + emit setIndexChanged(setCardsHere, setIndex, curSet->getLongName()); } emit setIndexChanged(setCards, setIndex, QString()); diff --git a/oracle/src/oracleimporter.h b/oracle/src/oracleimporter.h index 4c9e4637..4c044b86 100644 --- a/oracle/src/oracleimporter.h +++ b/oracle/src/oracleimporter.h @@ -57,22 +57,22 @@ private: QVariantMap setsMap; QString dataDir; - CardInfo *addCard(const QString &setName, - QString cardName, - bool isToken, - int cardId, - QString &setNumber, - QString &cardCost, - QString &cmc, - const QString &cardType, - const QString &cardPT, - int cardLoyalty, - const QString &cardText, - const QStringList &colors, - const QList &relatedCards, - const QList &reverseRelatedCards, - bool upsideDown, - QString &rarity); + CardInfoPtr addCard(const QString &setName, + QString cardName, + bool isToken, + int cardId, + QString &setNumber, + QString &cardCost, + QString &cmc, + const QString &cardType, + const QString &cardPT, + int cardLoyalty, + const QString &cardText, + const QStringList &colors, + const QList &relatedCards, + const QList &reverseRelatedCards, + bool upsideDown, + QString &rarity); signals: void setIndexChanged(int cardsImported, int setIndex, const QString &setName); void dataReadProgress(int bytesRead, int totalBytes); @@ -81,7 +81,7 @@ public: OracleImporter(const QString &_dataDir, QObject *parent = 0); bool readSetsFromByteArray(const QByteArray &data); int startImport(); - int importTextSpoiler(CardSet *set, const QVariant &data); + int importTextSpoiler(CardSetPtr set, const QVariant &data); QList &getSets() { return allSets; diff --git a/oracle/src/oraclewizard.cpp b/oracle/src/oraclewizard.cpp index 33d9b78f..e61cae8d 100644 --- a/oracle/src/oraclewizard.cpp +++ b/oracle/src/oraclewizard.cpp @@ -145,7 +145,7 @@ IntroPage::IntroPage(QWidget *parent) : OracleWizardPage(parent) layout->addWidget(label, 0, 0, 1, 2); layout->addWidget(languageLabel, 1, 0); layout->addWidget(languageBox, 1, 1); - layout->addWidget(versionLabel, 4, 0); + layout->addWidget(versionLabel, 2, 0, 1, 2); setLayout(layout); } diff --git a/tests/carddatabase/carddatabase_test.cpp b/tests/carddatabase/carddatabase_test.cpp index 20772ba1..e0e413f0 100644 --- a/tests/carddatabase/carddatabase_test.cpp +++ b/tests/carddatabase/carddatabase_test.cpp @@ -19,10 +19,7 @@ CardDatabaseSettings& SettingsCache::cardDatabase() const { return *cardDatabase SettingsCache *settingsCache; -void PictureLoader::clearPixmapCache(CardInfo * /* card */) { } - -// include out main header file _after_ the hack is complete -#include "../../cockatrice/src/carddatabase.h" +void PictureLoader::clearPixmapCache(CardInfoPtr /* card */) { } namespace { diff --git a/tests/carddatabase/carddatabase_test.h b/tests/carddatabase/carddatabase_test.h index 28086e4d..4d7e63f3 100644 --- a/tests/carddatabase/carddatabase_test.h +++ b/tests/carddatabase/carddatabase_test.h @@ -6,6 +6,8 @@ #include #include +#include "../../cockatrice/src/carddatabase.h" + #define SETTINGSCACHE_H class CardDatabaseSettings @@ -38,8 +40,7 @@ signals: #define PICTURELOADER_H -class CardInfo; class PictureLoader { - void clearPixmapCache(CardInfo *card); + void clearPixmapCache(CardInfoPtr card); };