Replace CardInfo* and Carset* with smart pointers (#3053)

* Replace CardInfo* and Carset* with smart pointers

* fixes to help memory & c++11 stuff
This commit is contained in:
ctrlaltca 2018-02-02 18:52:47 +01:00 committed by Zach H
parent 3e418ba3c6
commit 517420cccb
37 changed files with 409 additions and 342 deletions

View file

@ -46,7 +46,7 @@ void AbstractCardItem::cardInfoUpdated()
{ {
info = db->getCard(name); info = db->getCard(name);
if (info) if (info)
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated())); connect(info.data(), SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated()));
cacheBgColor(); cacheBgColor();
update(); update();
@ -182,7 +182,7 @@ void AbstractCardItem::setName(const QString &_name)
emit deleteCardInfoPopup(name); emit deleteCardInfoPopup(name);
if (info) if (info)
disconnect(info, nullptr, this, nullptr); disconnect(info.data(), nullptr, this, nullptr);
name = _name; name = _name;
cardInfoUpdated(); cardInfoUpdated();

View file

@ -2,8 +2,8 @@
#define ABSTRACTCARDITEM_H #define ABSTRACTCARDITEM_H
#include "arrowtarget.h" #include "arrowtarget.h"
#include "carddatabase.h"
class CardInfo;
class Player; class Player;
const int CARD_WIDTH = 72; const int CARD_WIDTH = 72;
@ -13,7 +13,7 @@ class AbstractCardItem : public ArrowTarget
{ {
Q_OBJECT Q_OBJECT
protected: protected:
CardInfo *info; CardInfoPtr info;
int id; int id;
QString name; QString name;
bool tapped; bool tapped;
@ -54,7 +54,7 @@ public:
QSizeF getTranslatedSize(QPainter *painter) const; QSizeF getTranslatedSize(QPainter *painter) const;
void paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle); void paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
CardInfo *getInfo() const CardInfoPtr getInfo() const
{ {
return info; return info;
} }

View file

@ -239,7 +239,7 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
} }
if (startZone->getName().compare("hand") == 0) { if (startZone->getName().compare("hand") == 0) {
startCard->playCard(false); startCard->playCard(false);
CardInfo *ci = startCard->getInfo(); CardInfoPtr ci = startCard->getInfo();
if (ci && (((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) || if (ci && (((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) ||
((settingsCache->getPlayToStack() && ci->getTableRow() != 0) && ((settingsCache->getPlayToStack() && ci->getTableRow() != 0) &&
startCard->getZone()->getName().toStdString() != "stack")))) startCard->getZone()->getName().toStdString() != "stack"))))

View file

@ -8,13 +8,14 @@
#include <QDir> #include <QDir>
#include <QFile> #include <QFile>
#include <QMessageBox> #include <QMessageBox>
#include <utility>
const int CardDatabase::versionNeeded = 3; const int CardDatabase::versionNeeded = 3;
const char *CardDatabase::TOKENS_SETNAME = "TK"; 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"; qDebug() << "&operator<< set is nullptr";
return xml; return xml;
} }
@ -38,6 +39,16 @@ CardSet::CardSet(const QString &_shortName,
loadSetOptions(); 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 QString CardSet::getCorrectedShortName() const
{ {
// For Windows machines. // For Windows machines.
@ -96,9 +107,9 @@ void CardSet::setIsKnown(bool _isknown)
class SetList::KeyCompareFunctor class SetList::KeyCompareFunctor
{ {
public: 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"; qDebug() << "SetList::KeyCompareFunctor a or b is null";
return false; return false;
} }
@ -116,7 +127,7 @@ int SetList::getEnabledSetsNum()
{ {
int num = 0; int num = 0;
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set && set->getEnabled()) { if (set && set->getEnabled()) {
++num; ++num;
} }
@ -128,7 +139,7 @@ int SetList::getUnknownSetsNum()
{ {
int num = 0; int num = 0;
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) {
++num; ++num;
} }
@ -140,7 +151,7 @@ QStringList SetList::getUnknownSetsNames()
{ {
QStringList sets = QStringList(); QStringList sets = QStringList();
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) {
sets << set->getShortName(); sets << set->getShortName();
} }
@ -151,7 +162,7 @@ QStringList SetList::getUnknownSetsNames()
void SetList::enableAllUnknown() void SetList::enableAllUnknown()
{ {
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) {
set->setIsKnown(true); set->setIsKnown(true);
set->setEnabled(true); set->setEnabled(true);
@ -164,7 +175,7 @@ void SetList::enableAllUnknown()
void SetList::enableAll() void SetList::enableAll()
{ {
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set == nullptr) { if (set == nullptr) {
qDebug() << "enabledAll has null"; qDebug() << "enabledAll has null";
@ -182,7 +193,7 @@ void SetList::enableAll()
void SetList::markAllAsKnown() void SetList::markAllAsKnown()
{ {
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) {
set->setIsKnown(true); set->setIsKnown(true);
set->setEnabled(false); set->setEnabled(false);
@ -198,8 +209,8 @@ void SetList::guessSortKeys()
QDate distantFuture(2050, 1, 1); QDate distantFuture(2050, 1, 1);
int aHundredYears = 36500; int aHundredYears = 36500;
for (int i = 0; i < size(); ++i) { for (int i = 0; i < size(); ++i) {
CardSet *set = at(i); CardSetPtr set = at(i);
if (set == nullptr) { if (set.isNull()) {
qDebug() << "guessSortKeys set is null"; qDebug() << "guessSortKeys set is null";
continue; continue;
} }
@ -241,16 +252,45 @@ CardInfo::CardInfo(const QString &_name,
pixmapCacheKey = QLatin1String("card_") + name; pixmapCacheKey = QLatin1String("card_") + name;
simpleName = CardInfo::simplifyName(name); simpleName = CardInfo::simplifyName(name);
for (int i = 0; i < sets.size(); i++) {
sets[i]->append(this);
}
refreshCachedSetNames(); refreshCachedSetNames();
} }
CardInfo::~CardInfo() 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<CardRelation *> &_relatedCards,
const QList<CardRelation *> &_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 QString CardInfo::getMainCardType() const
@ -298,14 +338,14 @@ QString CardInfo::getCorrectedName() const
return result.remove(" // ").remove(':').remove('"').remove('?').replace('/', ' '); 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)"; qDebug() << "addToSet(nullptr)";
return; return;
} }
set->append(this); set->append(smartThis);
sets << set; sets << set;
refreshCachedSetNames(); 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"; qDebug() << "operator<< info is nullptr";
return xml; return xml;
} }
@ -467,6 +507,7 @@ static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info)
CardDatabase::CardDatabase(QObject *parent) : QObject(parent), loadStatus(NotLoaded) CardDatabase::CardDatabase(QObject *parent) : QObject(parent), loadStatus(NotLoaded)
{ {
qRegisterMetaType<CardInfoPtr>("CardInfoPtr");
connect(settingsCache, SIGNAL(cardDatabasePathChanged()), this, SLOT(loadCardDatabases())); connect(settingsCache, SIGNAL(cardDatabasePathChanged()), this, SLOT(loadCardDatabases()));
} }
@ -479,24 +520,17 @@ void CardDatabase::clear()
{ {
clearDatabaseMutex->lock(); clearDatabaseMutex->lock();
QHashIterator<QString, CardInfo *> i(cards); QHashIterator<QString, CardInfoPtr> i(cards);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
if (i.value()) { if (i.value()) {
removeCard(i.value()); removeCard(i.value());
i.value()->deleteLater();
} }
} }
// The pointers themselves were already deleted, so we don't delete them again.
cards.clear(); cards.clear();
simpleNameCards.clear(); simpleNameCards.clear();
QHashIterator<QString, CardSet *> setIt(sets);
while (setIt.hasNext()) {
setIt.next();
delete setIt.value();
}
sets.clear(); sets.clear();
loadStatus = NotLoaded; loadStatus = NotLoaded;
@ -504,7 +538,7 @@ void CardDatabase::clear()
clearDatabaseMutex->unlock(); clearDatabaseMutex->unlock();
} }
void CardDatabase::addCard(CardInfo *card) void CardDatabase::addCard(CardInfoPtr card)
{ {
if (card == nullptr) { if (card == nullptr) {
qDebug() << "addCard(nullptr)"; qDebug() << "addCard(nullptr)";
@ -518,9 +552,9 @@ void CardDatabase::addCard(CardInfo *card)
emit cardAdded(card); emit cardAdded(card);
} }
void CardDatabase::removeCard(CardInfo *card) void CardDatabase::removeCard(CardInfoPtr card)
{ {
if (card == nullptr) { if (card.isNull()) {
qDebug() << "removeCard(nullptr)"; qDebug() << "removeCard(nullptr)";
return; return;
} }
@ -537,35 +571,39 @@ void CardDatabase::removeCard(CardInfo *card)
removeCardMutex->lock(); removeCardMutex->lock();
cards.remove(card->getName()); cards.remove(card->getName());
simpleNameCards.remove(card->getSimpleName()); simpleNameCards.remove(card->getSimpleName());
card.clear();
removeCardMutex->unlock(); removeCardMutex->unlock();
emit cardRemoved(card); emit cardRemoved(card);
} }
CardInfo *CardDatabase::getCard(const QString &cardName) const CardInfoPtr CardDatabase::getCard(const QString &cardName) const
{ {
return getCardFromMap(cards, cardName); return getCardFromMap(cards, cardName);
} }
QList<CardInfo *> CardDatabase::getCards(const QStringList &cardNames) const QList<CardInfoPtr> CardDatabase::getCards(const QStringList &cardNames) const
{ {
QList<CardInfo *> cardInfos; QList<CardInfoPtr> cardInfos;
foreach (QString cardName, cardNames) foreach (QString cardName, cardNames) {
cardInfos.append(getCardFromMap(cards, cardName)); CardInfoPtr ptr = getCardFromMap(cards, cardName);
if (ptr)
cardInfos.append(ptr);
}
return cardInfos; return cardInfos;
} }
CardInfo *CardDatabase::getCardBySimpleName(const QString &cardName) const CardInfoPtr CardDatabase::getCardBySimpleName(const QString &cardName) const
{ {
return getCardFromMap(simpleNameCards, CardInfo::simplifyName(cardName)); return getCardFromMap(simpleNameCards, CardInfo::simplifyName(cardName));
} }
CardSet *CardDatabase::getSet(const QString &setName) CardSetPtr CardDatabase::getSet(const QString &setName)
{ {
if (sets.contains(setName)) { if (sets.contains(setName)) {
return sets.value(setName); return sets.value(setName);
} else { } else {
CardSet *newSet = new CardSet(setName); CardSetPtr newSet = CardSet::newInstance(setName);
sets.insert(setName, newSet); sets.insert(setName, newSet);
return newSet; return newSet;
} }
@ -574,7 +612,7 @@ CardSet *CardDatabase::getSet(const QString &setName)
SetList CardDatabase::getSetList() const SetList CardDatabase::getSetList() const
{ {
SetList result; SetList result;
QHashIterator<QString, CardSet *> i(sets); QHashIterator<QString, CardSetPtr> i(sets);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
result << i.value(); result << i.value();
@ -611,7 +649,7 @@ void CardDatabase::loadSetsFromXml(QXmlStreamReader &xml)
} }
} }
CardSet *newSet = getSet(shortName); CardSetPtr newSet = getSet(shortName);
newSet->setLongName(longName); newSet->setLongName(longName);
newSet->setSetType(setType); newSet->setSetType(setType);
newSet->setReleaseDate(releaseDate); newSet->setReleaseDate(releaseDate);
@ -729,20 +767,19 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml)
} }
} }
addCard(new CardInfo(name, isToken, manacost, cmc, type, pt, text, colors, relatedCards, addCard(CardInfo::newInstance(name, isToken, manacost, cmc, type, pt, text, colors, relatedCards,
reverseRelatedCards, upsideDown, loyalty, cipt, tableRow, sets, customPicURLs, muids, reverseRelatedCards, upsideDown, loyalty, cipt, tableRow, sets, customPicURLs,
collectorNumbers, rarities)); 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 cardMap.value(cardName);
}
return nullptr; return {};
} }
LoadStatus CardDatabase::loadFromFile(const QString &fileName) LoadStatus CardDatabase::loadFromFile(const QString &fileName)
@ -806,7 +843,7 @@ bool CardDatabase::saveToFile(const QString &fileName, bool tokens)
if (!tokens) { if (!tokens) {
xml.writeStartElement("sets"); xml.writeStartElement("sets");
QHashIterator<QString, CardSet *> setIterator(sets); QHashIterator<QString, CardSetPtr> setIterator(sets);
while (setIterator.hasNext()) { while (setIterator.hasNext()) {
xml << setIterator.next().value(); xml << setIterator.next().value();
} }
@ -815,9 +852,9 @@ bool CardDatabase::saveToFile(const QString &fileName, bool tokens)
} }
xml.writeStartElement("cards"); xml.writeStartElement("cards");
QHashIterator<QString, CardInfo *> cardIterator(cards); QHashIterator<QString, CardInfoPtr> cardIterator(cards);
while (cardIterator.hasNext()) { while (cardIterator.hasNext()) {
CardInfo *card = cardIterator.next().value(); CardInfoPtr card = cardIterator.next().value();
if (tokens == card->getIsToken()) { if (tokens == card->getIsToken()) {
xml << card; xml << card;
} }
@ -868,7 +905,7 @@ LoadStatus CardDatabase::loadCardDatabases()
// reorder sets (TODO: refactor, this smells) // reorder sets (TODO: refactor, this smells)
SetList allSets; SetList allSets;
QHashIterator<QString, CardSet *> setsIterator(sets); QHashIterator<QString, CardSetPtr> setsIterator(sets);
while (setsIterator.hasNext()) { while (setsIterator.hasNext()) {
allSets.append(setsIterator.next().value()); allSets.append(setsIterator.next().value());
} }
@ -891,10 +928,10 @@ LoadStatus CardDatabase::loadCardDatabases()
void CardDatabase::refreshCachedReverseRelatedCards() void CardDatabase::refreshCachedReverseRelatedCards()
{ {
foreach (CardInfo *card, cards) for (const CardInfoPtr &card : cards)
card->resetReverseRelatedCards2Me(); card->resetReverseRelatedCards2Me();
foreach (CardInfo *card, cards) { for (const CardInfoPtr &card : cards) {
if (card->getReverseRelatedCards().isEmpty()) { if (card->getReverseRelatedCards().isEmpty()) {
continue; continue;
} }
@ -923,7 +960,7 @@ void CardDatabase::refreshCachedReverseRelatedCards()
QStringList CardDatabase::getAllColors() const QStringList CardDatabase::getAllColors() const
{ {
QSet<QString> colors; QSet<QString> colors;
QHashIterator<QString, CardInfo *> cardIterator(cards); QHashIterator<QString, CardInfoPtr> cardIterator(cards);
while (cardIterator.hasNext()) { while (cardIterator.hasNext()) {
const QStringList &cardColors = cardIterator.next().value()->getColors(); const QStringList &cardColors = cardIterator.next().value()->getColors();
if (cardColors.isEmpty()) { if (cardColors.isEmpty()) {
@ -940,7 +977,7 @@ QStringList CardDatabase::getAllColors() const
QStringList CardDatabase::getAllMainCardTypes() const QStringList CardDatabase::getAllMainCardTypes() const
{ {
QSet<QString> types; QSet<QString> types;
QHashIterator<QString, CardInfo *> cardIterator(cards); QHashIterator<QString, CardInfoPtr> cardIterator(cards);
while (cardIterator.hasNext()) { while (cardIterator.hasNext()) {
types.insert(cardIterator.next().value()->getMainCardType()); types.insert(cardIterator.next().value()->getMainCardType());
} }
@ -986,7 +1023,7 @@ void CardDatabase::markAllSetsAsKnown()
void CardDatabase::notifyEnabledSetsChanged() void CardDatabase::notifyEnabledSetsChanged()
{ {
// refresh the list of cached set names // refresh the list of cached set names
foreach (CardInfo *card, cards) for (const CardInfoPtr &card : cards)
card->refreshCachedSetNames(); card->refreshCachedSetNames();
// inform the carddatabasemodels that they need to re-check their list of cards // inform the carddatabasemodels that they need to re-check their list of cards
@ -995,7 +1032,7 @@ void CardDatabase::notifyEnabledSetsChanged()
bool CardDatabase::saveCustomTokensToFile() bool CardDatabase::saveCustomTokensToFile()
{ {
CardSet *customTokensSet = getSet(CardDatabase::TOKENS_SETNAME); CardSetPtr customTokensSet = getSet(CardDatabase::TOKENS_SETNAME);
QString fileName = settingsCache->getCustomCardDatabasePath() + "/" + CardDatabase::TOKENS_SETNAME + ".xml"; QString fileName = settingsCache->getCustomCardDatabasePath() + "/" + CardDatabase::TOKENS_SETNAME + ".xml";
QFile file(fileName); QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) { if (!file.open(QIODevice::WriteOnly)) {
@ -1010,9 +1047,9 @@ bool CardDatabase::saveCustomTokensToFile()
xml.writeAttribute("version", QString::number(versionNeeded)); xml.writeAttribute("version", QString::number(versionNeeded));
xml.writeStartElement("cards"); xml.writeStartElement("cards");
QHashIterator<QString, CardInfo *> cardIterator(cards); QHashIterator<QString, CardInfoPtr> cardIterator(cards);
while (cardIterator.hasNext()) { while (cardIterator.hasNext()) {
CardInfo *card = cardIterator.next().value(); CardInfoPtr card = cardIterator.next().value();
if (card->getSets().contains(customTokensSet)) { if (card->getSets().contains(customTokensSet)) {
xml << card; xml << card;
} }

View file

@ -7,19 +7,23 @@
#include <QHash> #include <QHash>
#include <QList> #include <QList>
#include <QMap> #include <QMap>
#include <QMetaType>
#include <QPixmap> #include <QPixmap>
#include <QXmlStreamReader> #include <QXmlStreamReader>
class CardDatabase; class CardDatabase;
class CardInfo; class CardInfo;
class CardSet;
class CardRelation; class CardRelation;
typedef QMap<QString, QString> QStringMap; typedef QMap<QString, QString> QStringMap;
// If we don't typedef this, CardInfo::CardInfo will refuse to compile on OS X < 10.9
typedef QMap<QString, int> MuidMap; typedef QMap<QString, int> MuidMap;
typedef QSharedPointer<CardInfo> CardInfoPtr;
typedef QSharedPointer<CardSet> CardSetPtr;
class CardSet : public QList<CardInfo *> Q_DECLARE_METATYPE(CardInfoPtr)
class CardSet : public QList<CardInfoPtr>
{ {
private: private:
QString shortName, longName; QString shortName, longName;
@ -33,6 +37,10 @@ public:
const QString &_longName = QString(), const QString &_longName = QString(),
const QString &_setType = QString(), const QString &_setType = QString(),
const QDate &_releaseDate = QDate()); 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 getCorrectedShortName() const;
QString getShortName() const QString getShortName() const
{ {
@ -87,7 +95,7 @@ public:
} }
}; };
class SetList : public QList<CardSet *> class SetList : public QList<CardSetPtr>
{ {
private: private:
class KeyCompareFunctor; class KeyCompareFunctor;
@ -107,6 +115,7 @@ class CardInfo : public QObject
{ {
Q_OBJECT Q_OBJECT
private: private:
CardInfoPtr smartThis;
QString name; QString name;
/* /*
@ -167,6 +176,31 @@ public:
QStringMap _rarities = QStringMap()); QStringMap _rarities = QStringMap());
~CardInfo() override; ~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<CardRelation *> &_relatedCards = QList<CardRelation *>(),
const QList<CardRelation *> &_reverseRelatedCards = QList<CardRelation *>(),
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 inline const QString &getName() const
{ {
return name; return name;
@ -219,27 +253,27 @@ public:
{ {
return cipt; return cipt;
} }
// void setManaCost(const QString &_manaCost) { manacost = _manaCost; emit cardInfoChanged(this); } // void setManaCost(const QString &_manaCost) { manacost = _manaCost; emit cardInfoChanged(smartThis); }
// void setCmc(const QString &_cmc) { cmc = _cmc; emit cardInfoChanged(this); } // void setCmc(const QString &_cmc) { cmc = _cmc; emit cardInfoChanged(smartThis); }
void setCardType(const QString &_cardType) void setCardType(const QString &_cardType)
{ {
cardtype = _cardType; cardtype = _cardType;
emit cardInfoChanged(this); emit cardInfoChanged(smartThis);
} }
void setPowTough(const QString &_powTough) void setPowTough(const QString &_powTough)
{ {
powtough = _powTough; powtough = _powTough;
emit cardInfoChanged(this); emit cardInfoChanged(smartThis);
} }
void setText(const QString &_text) void setText(const QString &_text)
{ {
text = _text; text = _text;
emit cardInfoChanged(this); emit cardInfoChanged(smartThis);
} }
void setColors(const QStringList &_colors) void setColors(const QStringList &_colors)
{ {
colors = _colors; colors = _colors;
emit cardInfoChanged(this); emit cardInfoChanged(smartThis);
} }
const QChar getColorChar() const; const QChar getColorChar() const;
const QStringList &getColors() const const QStringList &getColors() const
@ -297,7 +331,7 @@ public:
{ {
tableRow = _tableRow; 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, // void setCustomPicURL(const QString &_set, const QString &_customPicURL) { customPicURLs.insert(_set,
// _customPicURL); } // _customPicURL); }
void setMuId(const QString &_set, const int &_muId) void setMuId(const QString &_set, const int &_muId)
@ -312,7 +346,7 @@ public:
{ {
rarities.insert(_set, _setNumber); rarities.insert(_set, _setNumber);
} }
void addToSet(CardSet *set); void addToSet(CardSetPtr set);
void emitPixmapUpdated() void emitPixmapUpdated()
{ {
emit pixmapUpdated(); emit pixmapUpdated();
@ -327,7 +361,7 @@ public:
signals: signals:
void pixmapUpdated(); void pixmapUpdated();
void cardInfoChanged(CardInfo *card); void cardInfoChanged(CardInfoPtr card);
}; };
enum LoadStatus enum LoadStatus
@ -340,8 +374,8 @@ enum LoadStatus
NoCards NoCards
}; };
typedef QHash<QString, CardInfo *> CardNameMap; typedef QHash<QString, CardInfoPtr> CardNameMap;
typedef QHash<QString, CardSet *> SetNameMap; typedef QHash<QString, CardSetPtr> SetNameMap;
class CardDatabase : public QObject class CardDatabase : public QObject
{ {
@ -369,7 +403,7 @@ private:
void loadCardsFromXml(QXmlStreamReader &xml); void loadCardsFromXml(QXmlStreamReader &xml);
void loadSetsFromXml(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 checkUnknownSets();
void refreshCachedReverseRelatedCards(); void refreshCachedReverseRelatedCards();
@ -383,19 +417,19 @@ public:
explicit CardDatabase(QObject *parent = nullptr); explicit CardDatabase(QObject *parent = nullptr);
~CardDatabase() override; ~CardDatabase() override;
void clear(); void clear();
void addCard(CardInfo *card); void addCard(CardInfoPtr card);
void removeCard(CardInfo *card); void removeCard(CardInfoPtr card);
CardInfo *getCard(const QString &cardName) const; CardInfoPtr getCard(const QString &cardName) const;
QList<CardInfo *> getCards(const QStringList &cardNames) const; QList<CardInfoPtr> getCards(const QStringList &cardNames) 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
* function, so you don't need to simplify it beforehand. * 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); CardSetPtr getSet(const QString &setName);
QList<CardInfo *> getCardList() const QList<CardInfoPtr> getCardList() const
{ {
return cards.values(); return cards.values();
} }
@ -422,8 +456,8 @@ signals:
void cardDatabaseNewSetsFound(int numUnknownSets, QStringList unknownSetsNames); void cardDatabaseNewSetsFound(int numUnknownSets, QStringList unknownSetsNames);
void cardDatabaseAllNewSetsEnabled(); void cardDatabaseAllNewSetsEnabled();
void cardDatabaseEnabledSetsChanged(); void cardDatabaseEnabledSetsChanged();
void cardAdded(CardInfo *card); void cardAdded(CardInfoPtr card);
void cardRemoved(CardInfo *card); void cardRemoved(CardInfoPtr card);
}; };
class CardRelation : public QObject class CardRelation : public QObject

View file

@ -6,8 +6,8 @@
CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent) CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent)
: QAbstractListModel(parent), db(_db), showOnlyCardsFromEnabledSets(_showOnlyCardsFromEnabledSets) : QAbstractListModel(parent), db(_db), showOnlyCardsFromEnabledSets(_showOnlyCardsFromEnabledSets)
{ {
connect(db, SIGNAL(cardAdded(CardInfo *)), this, SLOT(cardAdded(CardInfo *))); connect(db, SIGNAL(cardAdded(CardInfoPtr)), this, SLOT(cardAdded(CardInfoPtr)));
connect(db, SIGNAL(cardRemoved(CardInfo *)), this, SLOT(cardRemoved(CardInfo *))); connect(db, SIGNAL(cardRemoved(CardInfoPtr)), this, SLOT(cardRemoved(CardInfoPtr)));
connect(db, SIGNAL(cardDatabaseEnabledSetsChanged()), this, SLOT(cardDatabaseEnabledSetsChanged())); connect(db, SIGNAL(cardDatabaseEnabledSetsChanged()), this, SLOT(cardDatabaseEnabledSetsChanged()));
cardDatabaseEnabledSetsChanged(); cardDatabaseEnabledSetsChanged();
@ -33,7 +33,7 @@ QVariant CardDatabaseModel::data(const QModelIndex &index, int role) const
(role != Qt::DisplayRole && role != SortRole)) (role != Qt::DisplayRole && role != SortRole))
return QVariant(); return QVariant();
CardInfo *card = cardList.at(index.row()); CardInfoPtr card = cardList.at(index.row());
switch (index.column()) { switch (index.column()) {
case NameColumn: case NameColumn:
return card->getName(); 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); const int row = cardList.indexOf(card);
if (row == -1) if (row == -1)
@ -86,12 +86,12 @@ void CardDatabaseModel::cardInfoChanged(CardInfo *card)
emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1)); emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1));
} }
bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfo *card) bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfoPtr card)
{ {
if (!showOnlyCardsFromEnabledSets) if (!showOnlyCardsFromEnabledSets)
return true; return true;
foreach (CardSet *set, card->getSets()) { for (CardSetPtr set : card->getSets()) {
if (set->getEnabled()) if (set->getEnabled())
return true; return true;
} }
@ -102,44 +102,46 @@ bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfo *card)
void CardDatabaseModel::cardDatabaseEnabledSetsChanged() void CardDatabaseModel::cardDatabaseEnabledSetsChanged()
{ {
// remove all the cards no more present in at least one enabled set // remove all the cards no more present in at least one enabled set
foreach (CardInfo *card, cardList) { foreach (CardInfoPtr card, cardList) {
if (!checkCardHasAtLeastOneEnabledSet(card)) if (!checkCardHasAtLeastOneEnabledSet(card))
cardRemoved(card); cardRemoved(card);
} }
// re-check all the card currently not shown, maybe their part of a newly-enabled set // 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)) if (!cardList.contains(card))
cardAdded(card); cardAdded(card);
} }
} }
void CardDatabaseModel::cardAdded(CardInfo *card) void CardDatabaseModel::cardAdded(CardInfoPtr card)
{ {
if (checkCardHasAtLeastOneEnabledSet(card)) { if (checkCardHasAtLeastOneEnabledSet(card)) {
// add the card if it's present in at least one enabled set // add the card if it's present in at least one enabled set
beginInsertRows(QModelIndex(), cardList.size(), cardList.size()); beginInsertRows(QModelIndex(), cardList.size(), cardList.size());
cardList.append(card); cardList.append(card);
connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); connect(card.data(), SIGNAL(cardInfoChanged(CardInfoPtr)), this, SLOT(cardInfoChanged(CardInfoPtr)));
endInsertRows(); endInsertRows();
} }
} }
void CardDatabaseModel::cardRemoved(CardInfo *card) void CardDatabaseModel::cardRemoved(CardInfoPtr card)
{ {
const int row = cardList.indexOf(card); const int row = cardList.indexOf(card);
if (row == -1) if (row == -1) {
return; return;
}
beginRemoveRows(QModelIndex(), row, row); beginRemoveRows(QModelIndex(), row, row);
disconnect(card, 0, this, 0); disconnect(card.data(), nullptr, this, nullptr);
card.clear();
cardList.removeAt(row); cardList.removeAt(row);
endRemoveRows(); endRemoveRows();
} }
CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) : QSortFilterProxyModel(parent), isToken(ShowAll) CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) : QSortFilterProxyModel(parent), isToken(ShowAll)
{ {
filterTree = NULL; filterTree = nullptr;
setFilterCaseSensitivity(Qt::CaseInsensitive); setFilterCaseSensitivity(Qt::CaseInsensitive);
setSortCaseSensitivity(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 bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
{ {
CardInfo const *info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow); CardInfoPtr info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken())) if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken()))
return false; return false;
@ -282,7 +284,7 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex
return rowMatchesCardName(info); 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)) if (!cardName.isEmpty() && !info->getName().contains(cardName, Qt::CaseInsensitive))
return false; return false;
@ -290,7 +292,7 @@ bool CardDatabaseDisplayModel::rowMatchesCardName(CardInfo const *info) const
if (!cardNameSet.isEmpty() && !cardNameSet.contains(info->getName())) if (!cardNameSet.isEmpty() && !cardNameSet.contains(info->getName()))
return false; return false;
if (filterTree != NULL) if (filterTree != nullptr)
return filterTree->acceptsCard(info); return filterTree->acceptsCard(info);
return true; return true;
@ -302,15 +304,15 @@ void CardDatabaseDisplayModel::clearFilterAll()
cardText.clear(); cardText.clear();
cardTypes.clear(); cardTypes.clear();
cardColors.clear(); cardColors.clear();
if (filterTree != NULL) if (filterTree != nullptr)
filterTree->clear(); filterTree->clear();
invalidateFilter(); invalidateFilter();
} }
void CardDatabaseDisplayModel::setFilterTree(FilterTree *filterTree) void CardDatabaseDisplayModel::setFilterTree(FilterTree *filterTree)
{ {
if (this->filterTree != NULL) if (this->filterTree != nullptr)
disconnect(this->filterTree, 0, this, 0); disconnect(this->filterTree, nullptr, this, nullptr);
this->filterTree = filterTree; this->filterTree = filterTree;
connect(this->filterTree, SIGNAL(changed()), this, SLOT(filterTreeChanged())); 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 bool TokenDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
{ {
CardInfo const *info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow); CardInfoPtr info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
return info->getIsToken() && rowMatchesCardName(info); return info->getIsToken() && rowMatchesCardName(info);
} }

View file

@ -36,21 +36,21 @@ public:
{ {
return db; return db;
} }
CardInfo *getCard(int index) const CardInfoPtr getCard(int index) const
{ {
return cardList[index]; return cardList[index];
} }
private: private:
QList<CardInfo *> cardList; QList<CardInfoPtr> cardList;
CardDatabase *db; CardDatabase *db;
bool showOnlyCardsFromEnabledSets; bool showOnlyCardsFromEnabledSets;
inline bool checkCardHasAtLeastOneEnabledSet(CardInfo *card); inline bool checkCardHasAtLeastOneEnabledSet(CardInfoPtr card);
private slots: private slots:
void cardAdded(CardInfo *card); void cardAdded(CardInfoPtr card);
void cardRemoved(CardInfo *card); void cardRemoved(CardInfoPtr card);
void cardInfoChanged(CardInfo *card); void cardInfoChanged(CardInfoPtr card);
void cardDatabaseEnabledSetsChanged(); void cardDatabaseEnabledSetsChanged();
}; };
@ -122,7 +122,7 @@ protected:
bool lessThan(const QModelIndex &left, const QModelIndex &right) const; bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
static int lessThanNumerically(const QString &left, const QString &right); static int lessThanNumerically(const QString &left, const QString &right);
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; 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; bool canFetchMore(const QModelIndex &parent) const;
void fetchMore(const QModelIndex &parent); void fetchMore(const QModelIndex &parent);
private slots: private slots:

View file

@ -1,6 +1,5 @@
#include "cardframe.h" #include "cardframe.h"
#include "carddatabase.h"
#include "cardinfopicture.h" #include "cardinfopicture.h"
#include "cardinfotext.h" #include "cardinfotext.h"
#include "carditem.h" #include "carditem.h"
@ -88,16 +87,16 @@ void CardFrame::setViewMode(int mode)
settingsCache->setCardInfoViewMode(mode); settingsCache->setCardInfoViewMode(mode);
} }
void CardFrame::setCard(CardInfo *card) void CardFrame::setCard(CardInfoPtr card)
{ {
if (info) { if (info) {
disconnect(info, nullptr, this, nullptr); disconnect(info.data(), nullptr, this, nullptr);
} }
info = card; info = card;
if (info) { if (info) {
connect(info, SIGNAL(destroyed()), this, SLOT(clear())); connect(info.data(), SIGNAL(destroyed()), this, SLOT(clear()));
} }
text->setCard(info); text->setCard(info);
@ -118,5 +117,5 @@ void CardFrame::setCard(AbstractCardItem *card)
void CardFrame::clear() void CardFrame::clear()
{ {
setCard((CardInfo *)nullptr); setCard((CardInfoPtr) nullptr);
} }

View file

@ -3,8 +3,9 @@
#include <QTabWidget> #include <QTabWidget>
#include "carddatabase.h"
class AbstractCardItem; class AbstractCardItem;
class CardInfo;
class CardInfoPicture; class CardInfoPicture;
class CardInfoText; class CardInfoText;
class QVBoxLayout; class QVBoxLayout;
@ -14,7 +15,7 @@ class CardFrame : public QTabWidget
{ {
Q_OBJECT Q_OBJECT
private: private:
CardInfo *info; CardInfoPtr info;
CardInfoPicture *pic; CardInfoPicture *pic;
CardInfoText *text; CardInfoText *text;
bool cardTextOnly; bool cardTextOnly;
@ -33,7 +34,7 @@ public:
void retranslateUi(); void retranslateUi();
public slots: public slots:
void setCard(CardInfo *card); void setCard(CardInfoPtr card);
void setCard(const QString &cardName); void setCard(const QString &cardName);
void setCard(AbstractCardItem *card); void setCard(AbstractCardItem *card);
void clear(); void clear();

View file

@ -4,7 +4,6 @@
#include <QStyle> #include <QStyle>
#include <QWidget> #include <QWidget>
#include "carddatabase.h"
#include "carditem.h" #include "carditem.h"
#include "main.h" #include "main.h"
#include "pictureloader.h" #include "pictureloader.h"
@ -14,16 +13,16 @@ CardInfoPicture::CardInfoPicture(QWidget *parent) : QWidget(parent), info(nullpt
setMinimumHeight(100); setMinimumHeight(100);
} }
void CardInfoPicture::setCard(CardInfo *card) void CardInfoPicture::setCard(CardInfoPtr card)
{ {
if (info) { if (info) {
disconnect(info, nullptr, this, nullptr); disconnect(info.data(), nullptr, this, nullptr);
} }
info = card; info = card;
if (info) { if (info) {
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); connect(info.data(), SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap()));
} }
updatePixmap(); updatePixmap();

View file

@ -3,15 +3,16 @@
#include <QWidget> #include <QWidget>
#include "carddatabase.h"
class AbstractCardItem; class AbstractCardItem;
class CardInfo;
class CardInfoPicture : public QWidget class CardInfoPicture : public QWidget
{ {
Q_OBJECT Q_OBJECT
private: private:
CardInfo *info; CardInfoPtr info;
QPixmap resizedPixmap; QPixmap resizedPixmap;
bool pixmapDirty; bool pixmapDirty;
@ -23,7 +24,7 @@ protected:
void paintEvent(QPaintEvent *); void paintEvent(QPaintEvent *);
void loadPixmap(); void loadPixmap();
public slots: public slots:
void setCard(CardInfo *card); void setCard(CardInfoPtr card);
void updatePixmap(); void updatePixmap();
}; };

View file

@ -1,6 +1,5 @@
#include "cardinfotext.h" #include "cardinfotext.h"
#include "carddatabase.h"
#include "carditem.h" #include "carditem.h"
#include "main.h" #include "main.h"
#include <QGridLayout> #include <QGridLayout>
@ -56,7 +55,7 @@ CardInfoText::CardInfoText(QWidget *parent) : QFrame(parent), info(nullptr)
retranslateUi(); retranslateUi();
} }
void CardInfoText::setCard(CardInfo *card) void CardInfoText::setCard(CardInfoPtr card)
{ {
if (card) { if (card) {
nameLabel2->setText(card->getName()); nameLabel2->setText(card->getName());

View file

@ -3,9 +3,9 @@
#include <QFrame> #include <QFrame>
#include "carddatabase.h"
class QLabel; class QLabel;
class QTextEdit; class QTextEdit;
class CardInfo;
class CardInfoText : public QFrame class CardInfoText : public QFrame
{ {
@ -20,14 +20,14 @@ private:
QLabel *loyaltyLabel1, *loyaltyLabel2; QLabel *loyaltyLabel1, *loyaltyLabel2;
QTextEdit *textLabel; QTextEdit *textLabel;
CardInfo *info; CardInfoPtr info;
public: public:
CardInfoText(QWidget *parent = 0); CardInfoText(QWidget *parent = 0);
void retranslateUi(); void retranslateUi();
public slots: public slots:
void setCard(CardInfo *card); void setCard(CardInfoPtr card);
}; };
#endif #endif

View file

@ -1,5 +1,4 @@
#include "cardinfowidget.h" #include "cardinfowidget.h"
#include "carddatabase.h"
#include "cardinfopicture.h" #include "cardinfopicture.h"
#include "cardinfotext.h" #include "cardinfotext.h"
#include "carditem.h" #include "carditem.h"
@ -38,13 +37,13 @@ CardInfoWidget::CardInfoWidget(const QString &cardName, QWidget *parent, Qt::Win
resize(width(), sizeHint().height()); resize(width(), sizeHint().height());
} }
void CardInfoWidget::setCard(CardInfo *card) void CardInfoWidget::setCard(CardInfoPtr card)
{ {
if (info) if (info)
disconnect(info, nullptr, this, nullptr); disconnect(info.data(), nullptr, this, nullptr);
info = card; info = card;
if (info) if (info)
connect(info, SIGNAL(destroyed()), this, SLOT(clear())); connect(info.data(), SIGNAL(destroyed()), this, SLOT(clear()));
text->setCard(info); text->setCard(info);
pic->setCard(info); pic->setCard(info);
@ -62,5 +61,5 @@ void CardInfoWidget::setCard(AbstractCardItem *card)
void CardInfoWidget::clear() void CardInfoWidget::clear()
{ {
setCard((CardInfo *)nullptr); setCard((CardInfoPtr) nullptr);
} }

View file

@ -5,7 +5,8 @@
#include <QFrame> #include <QFrame>
#include <QStringList> #include <QStringList>
class CardInfo; #include "carddatabase.h"
class CardInfoPicture; class CardInfoPicture;
class CardInfoText; class CardInfoText;
class AbstractCardItem; class AbstractCardItem;
@ -16,7 +17,7 @@ class CardInfoWidget : public QFrame
private: private:
qreal aspectRatio; qreal aspectRatio;
CardInfo *info; CardInfoPtr info;
CardInfoPicture *pic; CardInfoPicture *pic;
CardInfoText *text; CardInfoText *text;
@ -24,7 +25,7 @@ public:
CardInfoWidget(const QString &cardName, QWidget *parent = 0, Qt::WindowFlags f = 0); CardInfoWidget(const QString &cardName, QWidget *parent = 0, Qt::WindowFlags f = 0);
public slots: public slots:
void setCard(CardInfo *card); void setCard(CardInfoPtr card);
void setCard(const QString &cardName); void setCard(const QString &cardName);
void setCard(AbstractCardItem *card); void setCard(AbstractCardItem *card);

View file

@ -120,7 +120,7 @@ struct FormatDeckListForExport
void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const
{ {
// Get the card name // Get the card name
CardInfo *dbCard = db->getCard(card->getName()); CardInfoPtr dbCard = db->getCard(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;
@ -223,7 +223,7 @@ void DeckLoader::saveToStream_DeckZone(QTextStream &out, const InnerDecklistNode
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));
CardInfo *info = db->getCard(card->getName()); CardInfoPtr info = db->getCard(card->getName());
QString cardType = info ? info->getMainCardType() : "unknown"; QString cardType = info ? info->getMainCardType() : "unknown";
cardsByType.insert(cardType, card); cardsByType.insert(cardType, card);
@ -276,7 +276,7 @@ void DeckLoader::saveToStream_DeckZoneCards(QTextStream &out,
QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneName) QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneName)
{ {
CardInfo *card = db->getCard(cardName); CardInfoPtr card = db->getCard(cardName);
if (card && card->getIsToken()) { if (card && card->getIsToken()) {
return DECK_ZONE_TOKENS; return DECK_ZONE_TOKENS;
@ -288,7 +288,7 @@ QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneNam
QString DeckLoader::getCompleteCardName(const QString cardName) const QString DeckLoader::getCompleteCardName(const QString cardName) const
{ {
if (db) { if (db) {
CardInfo *temp = db->getCardBySimpleName(cardName); CardInfoPtr temp = db->getCardBySimpleName(cardName);
if (temp) { if (temp) {
return temp->getName(); return temp->getName();
} }

View file

@ -47,7 +47,7 @@ void DeckListModel::rebuildTree()
continue; continue;
} }
CardInfo *info = db->getCard(currentCard->getName()); CardInfoPtr info = db->getCard(currentCard->getName());
QString cardType = info ? info->getMainCardType() : "unknown"; QString cardType = info ? info->getMainCardType() : "unknown";
auto *cardTypeNode = dynamic_cast<InnerDecklistNode *>(node->findChild(cardType)); auto *cardTypeNode = dynamic_cast<InnerDecklistNode *>(node->findChild(cardType));
@ -276,7 +276,7 @@ InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerD
DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName) const DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName) const
{ {
InnerDecklistNode *zoneNode, *typeNode; InnerDecklistNode *zoneNode, *typeNode;
CardInfo *info; CardInfoPtr info;
QString cardType; QString cardType;
zoneNode = dynamic_cast<InnerDecklistNode *>(root->findChild(zoneName)); zoneNode = dynamic_cast<InnerDecklistNode *>(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) 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 (info == nullptr) {
if (abAddAnyway) { if (abAddAnyway) {
// We need to keep this card added no matter what // We need to keep this card added no matter what
// This is usually called from tab_deck_editor // This is usually called from tab_deck_editor
// So we'll create a new CardInfo with the name // So we'll create a new CardInfo with the name
// and default values for all fields // and default values for all fields
info = new CardInfo(cardName, false, nullptr, nullptr, "unknown", nullptr, nullptr, QStringList(), info = CardInfo::newInstance(cardName, false, nullptr, nullptr, "unknown", nullptr, nullptr, QStringList(),
QList<CardRelation *>(), QList<CardRelation *>(), false, 0, false, 0, SetList(), QList<CardRelation *>(), QList<CardRelation *>(), false, 0, false, 0,
QStringMap(), MuidMap(), QStringMap(), QStringMap()); SetList(), QStringMap(), MuidMap(), QStringMap(), QStringMap());
} else { } else {
return {}; return {};
} }

View file

@ -74,7 +74,7 @@ struct CopyIfNotAToken
void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const 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()) { if (dbCard && !dbCard->getIsToken()) {
DecklistCardNode *addedCard = destination.addCard(card->getName(), node->getName()); DecklistCardNode *addedCard = destination.addCard(card->getName(), node->getName());
addedCard->setNumber(card->getNumber()); addedCard->setNumber(card->getNumber());

View file

@ -144,9 +144,14 @@ void DlgCreateToken::closeEvent(QCloseEvent *event)
void DlgCreateToken::tokenSelectionChanged(const QModelIndex &current, const QModelIndex & /*previous*/) void DlgCreateToken::tokenSelectionChanged(const QModelIndex &current, const QModelIndex & /*previous*/)
{ {
const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); 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()); updateSearchFieldWithoutUpdatingFilter(cardInfo->getName());
const QChar cardColor = cardInfo->getColorChar(); const QChar cardColor = cardInfo->getColorChar();
colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString)); colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString));

View file

@ -116,9 +116,14 @@ DlgEditTokens::DlgEditTokens(QWidget *parent) : QDialog(parent), currentCard(0)
void DlgEditTokens::tokenSelectionChanged(const QModelIndex &current, const QModelIndex & /* previous */) void DlgEditTokens::tokenSelectionChanged(const QModelIndex &current, const QModelIndex & /* previous */)
{ {
const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); 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()); nameEdit->setText(currentCard->getName());
const QChar cardColor = currentCard->getColorChar(); const QChar cardColor = currentCard->getColorChar();
colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString)); colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString));
@ -149,7 +154,7 @@ void DlgEditTokens::actAddToken()
} }
} while (askAgain); } while (askAgain);
CardInfo *card = new CardInfo(name, true); CardInfoPtr card = CardInfo::newInstance(name, true);
card->addToSet(databaseModel->getDatabase()->getSet(CardDatabase::TOKENS_SETNAME)); card->addToSet(databaseModel->getDatabase()->getSet(CardDatabase::TOKENS_SETNAME));
card->setCardType("Token"); card->setCardType("Token");
databaseModel->getDatabase()->addCard(card); databaseModel->getDatabase()->addCard(card);
@ -158,10 +163,9 @@ void DlgEditTokens::actAddToken()
void DlgEditTokens::actRemoveToken() void DlgEditTokens::actRemoveToken()
{ {
if (currentCard) { if (currentCard) {
CardInfo *cardToRemove = currentCard; // the currentCard property gets modified during db->removeCard() CardInfoPtr cardToRemove = currentCard; // the currentCard property gets modified during db->removeCard()
currentCard = 0; currentCard.clear();
databaseModel->getDatabase()->removeCard(cardToRemove); databaseModel->getDatabase()->removeCard(cardToRemove);
delete cardToRemove;
} }
} }

View file

@ -1,6 +1,7 @@
#ifndef DLG_EDIT_TOKENS_H #ifndef DLG_EDIT_TOKENS_H
#define DLG_EDIT_TOKENS_H #define DLG_EDIT_TOKENS_H
#include "carddatabase.h"
#include <QDialog> #include <QDialog>
class QModelIndex; class QModelIndex;
@ -10,7 +11,6 @@ class QLabel;
class QComboBox; class QComboBox;
class QLineEdit; class QLineEdit;
class QTreeView; class QTreeView;
class CardInfo;
class DlgEditTokens : public QDialog class DlgEditTokens : public QDialog
{ {
@ -25,7 +25,7 @@ private slots:
void actRemoveToken(); void actRemoveToken();
private: private:
CardInfo *currentCard; CardInfoPtr currentCard;
CardDatabaseModel *databaseModel; CardDatabaseModel *databaseModel;
TokenDisplayModel *cardDatabaseDisplayModel; TokenDisplayModel *cardDatabaseDisplayModel;
QStringList predefinedTokens; QStringList predefinedTokens;
@ -35,7 +35,7 @@ private:
QTreeView *chooseTokenView; QTreeView *chooseTokenView;
public: public:
DlgEditTokens(QWidget *parent = 0); DlgEditTokens(QWidget *parent = nullptr);
}; };
#endif #endif

View file

@ -1,5 +1,4 @@
#include "filtertree.h" #include "filtertree.h"
#include "carddatabase.h"
#include "cardfilter.h" #include "cardfilter.h"
#include <QList> #include <QList>
@ -100,7 +99,7 @@ FilterTreeNode *FilterItemList::termNode(const QString &term)
return childNodes.at(i); 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++) { for (auto i = childNodes.constBegin(); i != childNodes.constEnd(); i++) {
if (!(*i)->isEnabled()) { if (!(*i)->isEnabled()) {
@ -115,13 +114,13 @@ bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) co
return true; 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 // if any one in the list is true, return false
return !testTypeOr(info, attr); 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; bool noChildEnabledChild = true;
@ -142,23 +141,23 @@ bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) con
return noChildEnabledChild; 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 // if any one in the list is false, return true
return !testTypeAnd(info, attr); 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); 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); 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(); QString converted_term = term.trimmed();
@ -198,12 +197,12 @@ bool FilterItem::acceptColor(const CardInfo *info) const
return match_count == converted_term.length(); 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); return info->getText().contains(term, Qt::CaseInsensitive);
} }
bool FilterItem::acceptSet(const CardInfo *info) const bool FilterItem::acceptSet(const CardInfoPtr info) const
{ {
bool status = false; bool status = false;
for (auto i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) { for (auto i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) {
@ -217,7 +216,7 @@ bool FilterItem::acceptSet(const CardInfo *info) const
return status; return status;
} }
bool FilterItem::acceptManaCost(const CardInfo *info) const bool FilterItem::acceptManaCost(const CardInfoPtr info) const
{ {
QString partialCost = term.toUpper(); QString partialCost = term.toUpper();
QString fullManaCost = info->getManaCost(); QString fullManaCost = info->getManaCost();
@ -230,24 +229,24 @@ bool FilterItem::acceptManaCost(const CardInfo *info) const
return (fullManaCost.indexOf(partialCost) > -1); return (fullManaCost.indexOf(partialCost) > -1);
} }
bool FilterItem::acceptCmc(const CardInfo *info) const bool FilterItem::acceptCmc(const CardInfoPtr info) const
{ {
return (info->getCmc() == term); return (info->getCmc() == term);
} }
bool FilterItem::acceptPower(const CardInfo *info) const bool FilterItem::acceptPower(const CardInfoPtr info) const
{ {
int slash = info->getPowTough().indexOf("/"); int slash = info->getPowTough().indexOf("/");
return (slash != -1) ? (info->getPowTough().mid(0, slash) == term) : false; 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("/"); int slash = info->getPowTough().indexOf("/");
return (slash != -1) ? (info->getPowTough().mid(slash + 1) == term) : false; 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(); QString converted_term = term.trimmed();
@ -296,7 +295,7 @@ bool FilterItem::acceptRarity(const CardInfo *info) const
return false; return false;
} }
bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const bool FilterItem::acceptCardAttr(const CardInfoPtr info, CardFilter::Attr attr) const
{ {
switch (attr) { switch (attr) {
case CardFilter::AttrName: case CardFilter::AttrName:
@ -383,7 +382,7 @@ FilterTreeNode *FilterTree::attrTypeNode(CardFilter::Attr attr, CardFilter::Type
return attrTypeList(attr, 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; const FilterItemList *fil;
bool status = true; bool status = true;
@ -416,7 +415,7 @@ bool FilterTree::testAttr(const CardInfo *info, const LogicMap *lm) const
return status; 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++) { for (auto i = childNodes.constBegin(); i != childNodes.constEnd(); i++) {
if ((*i)->isEnabled() && !testAttr(info, *i)) { if ((*i)->isEnabled() && !testAttr(info, *i)) {

View file

@ -5,10 +5,9 @@
#include <QMap> #include <QMap>
#include <QObject> #include <QObject>
#include "carddatabase.h"
#include "cardfilter.h" #include "cardfilter.h"
class CardInfo;
class FilterTreeNode class FilterTreeNode
{ {
private: private:
@ -160,10 +159,10 @@ public:
return CardFilter::typeName(type); return CardFilter::typeName(type);
} }
bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; bool testTypeAnd(const CardInfoPtr info, CardFilter::Attr attr) const;
bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const; bool testTypeAndNot(const CardInfoPtr info, CardFilter::Attr attr) const;
bool testTypeOr(const CardInfo *info, CardFilter::Attr attr) const; bool testTypeOr(const CardInfoPtr info, CardFilter::Attr attr) const;
bool testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const; bool testTypeOrNot(const CardInfoPtr info, CardFilter::Attr attr) const;
}; };
class FilterItem : public FilterTreeNode class FilterItem : public FilterTreeNode
@ -204,17 +203,17 @@ public:
return true; return true;
} }
bool acceptName(const CardInfo *info) const; bool acceptName(const CardInfoPtr info) const;
bool acceptType(const CardInfo *info) const; bool acceptType(const CardInfoPtr info) const;
bool acceptColor(const CardInfo *info) const; bool acceptColor(const CardInfoPtr info) const;
bool acceptText(const CardInfo *info) const; bool acceptText(const CardInfoPtr info) const;
bool acceptSet(const CardInfo *info) const; bool acceptSet(const CardInfoPtr info) const;
bool acceptManaCost(const CardInfo *info) const; bool acceptManaCost(const CardInfoPtr info) const;
bool acceptCmc(const CardInfo *info) const; bool acceptCmc(const CardInfoPtr info) const;
bool acceptPower(const CardInfo *info) const; bool acceptPower(const CardInfoPtr info) const;
bool acceptToughness(const CardInfo *info) const; bool acceptToughness(const CardInfoPtr info) const;
bool acceptRarity(const CardInfo *info) const; bool acceptRarity(const CardInfoPtr info) const;
bool acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const; bool acceptCardAttr(const CardInfoPtr info, CardFilter::Attr attr) const;
}; };
class FilterTree : public QObject, public FilterTreeBranch<LogicMap *> class FilterTree : public QObject, public FilterTreeBranch<LogicMap *>
@ -232,7 +231,7 @@ private:
LogicMap *attrLogicMap(CardFilter::Attr attr); LogicMap *attrLogicMap(CardFilter::Attr attr);
FilterItemList *attrTypeList(CardFilter::Attr attr, CardFilter::Type type); 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 void nodeChanged() const
{ {
@ -272,7 +271,7 @@ public:
return 0; return 0;
} }
bool acceptsCard(const CardInfo *info) const; bool acceptsCard(const CardInfoPtr info) const;
void clear(); void clear();
}; };

View file

@ -20,6 +20,7 @@
#include <QSvgRenderer> #include <QSvgRenderer>
#include <QThread> #include <QThread>
#include <QUrl> #include <QUrl>
#include <utility>
// never cache more than 300 cards at once for a single deck // never cache more than 300 cards at once for a single deck
#define CACHED_CARD_PER_DECK_MAX 300 #define CACHED_CARD_PER_DECK_MAX 300
@ -32,29 +33,17 @@ public:
* Enabled sets have priority over disabled sets * Enabled sets have priority over disabled sets
* Both groups follows the user-defined order * 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 (a->getEnabled()) {
if (b->getEnabled()) { return !b->getEnabled() || a->getSortKey() < b->getSortKey();
// both enabled: sort by key
return a->getSortKey() < b->getSortKey();
} else { } else {
// only a enabled return !b->getEnabled() && a->getSortKey() < b->getSortKey();
return true;
}
} else {
if (b->getEnabled()) {
// only b enabled
return false;
} else {
// both disabled: sort by key
return a->getSortKey() < b->getSortKey();
}
} }
} }
}; };
PictureToLoad::PictureToLoad(CardInfo *_card) : card(_card), setIndex(0) PictureToLoad::PictureToLoad(CardInfoPtr _card) : card(std::move(_card)), setIndex(0)
{ {
if (card) { if (card) {
sortedSets = card->getSets(); sortedSets = card->getSets();
@ -78,18 +67,18 @@ QString PictureToLoad::getSetName() const
return QString(""); return QString("");
} }
CardSet *PictureToLoad::getCurrentSet() const CardSetPtr PictureToLoad::getCurrentSet() const
{ {
if (setIndex < sortedSets.size()) if (setIndex < sortedSets.size())
return sortedSets[setIndex]; return sortedSets[setIndex];
else else
return 0; return {};
} }
QStringList PictureLoaderWorker::md5Blacklist = QStringList PictureLoaderWorker::md5Blacklist =
QStringList() << "db0c48db407a907c16ade38de048a441"; // card back returned by gatherer when card is not found 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(); picsPath = settingsCache->getPicsPath();
customPicsPath = settingsCache->getCustomPicsPath(); customPicsPath = settingsCache->getCustomPicsPath();
@ -140,7 +129,7 @@ void PictureLoaderWorker::processLoadQueue()
if (picDownload) { if (picDownload) {
qDebug() << "Picture NOT found, trying to download (set: " << setName << " card: " << cardName << ")"; qDebug() << "Picture NOT found, trying to download (set: " << setName << " card: " << cardName << ")";
cardsToDownload.append(cardBeingLoaded); cardsToDownload.append(cardBeingLoaded);
cardBeingLoaded = 0; cardBeingLoaded.clear();
if (!downloadRunning) if (!downloadRunning)
startNextPicDownload(); startNextPicDownload();
} else { } else {
@ -149,7 +138,7 @@ void PictureLoaderWorker::processLoadQueue()
<< " card: " << cardName << ")"; << " card: " << cardName << ")";
mutex.lock(); mutex.lock();
loadQueue.prepend(cardBeingLoaded); loadQueue.prepend(cardBeingLoaded);
cardBeingLoaded = 0; cardBeingLoaded.clear();
mutex.unlock(); mutex.unlock();
} else { } else {
qDebug() << "Picture NOT found, download disabled, no more sets to try: BAILING OUT (oldset: " qDebug() << "Picture NOT found, download disabled, no more sets to try: BAILING OUT (oldset: "
@ -213,8 +202,8 @@ QString PictureLoaderWorker::getPicUrl()
if (!picDownload) if (!picDownload)
return QString(); return QString();
CardInfo *card = cardBeingDownloaded.getCard(); CardInfoPtr card = cardBeingDownloaded.getCard();
CardSet *set = cardBeingDownloaded.getCurrentSet(); CardSetPtr set = cardBeingDownloaded.getCurrentSet();
QString picUrl = QString(""); QString picUrl = QString("");
// if sets have been defined for the card, they can contain custom picUrls // if sets have been defined for the card, they can contain custom picUrls
@ -258,7 +247,7 @@ QString PictureLoaderWorker::getPicUrl()
void PictureLoaderWorker::startNextPicDownload() void PictureLoaderWorker::startNextPicDownload()
{ {
if (cardsToDownload.isEmpty()) { if (cardsToDownload.isEmpty()) {
cardBeingDownloaded = 0; cardBeingDownloaded.clear();
downloadRunning = false; downloadRunning = false;
return; return;
} }
@ -292,7 +281,7 @@ void PictureLoaderWorker::picDownloadFailed()
qDebug() << "Picture NOT found, download failed, no more sets to try: BAILING OUT (oldset: " qDebug() << "Picture NOT found, download failed, no more sets to try: BAILING OUT (oldset: "
<< cardBeingDownloaded.getSetName() << " card: " << cardBeingDownloaded.getCard()->getName() << ")"; << cardBeingDownloaded.getSetName() << " card: " << cardBeingDownloaded.getCard()->getName() << ")";
imageLoaded(cardBeingDownloaded.getCard(), QImage()); imageLoaded(cardBeingDownloaded.getCard(), QImage());
cardBeingDownloaded = 0; cardBeingDownloaded.clear();
} }
emit startLoadQueue(); emit startLoadQueue();
} }
@ -364,7 +353,7 @@ void PictureLoaderWorker::picDownloadFinished(QNetworkReply *reply)
startNextPicDownload(); startNextPicDownload();
} }
void PictureLoaderWorker::enqueueImageLoad(CardInfo *card) void PictureLoaderWorker::enqueueImageLoad(CardInfoPtr card)
{ {
QMutexLocker locker(&mutex); QMutexLocker locker(&mutex);
@ -405,8 +394,8 @@ PictureLoader::PictureLoader() : QObject(0)
connect(settingsCache, SIGNAL(picsPathChanged()), this, SLOT(picsPathChanged())); connect(settingsCache, SIGNAL(picsPathChanged()), this, SLOT(picsPathChanged()));
connect(settingsCache, SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); connect(settingsCache, SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged()));
connect(worker, SIGNAL(imageLoaded(CardInfo *, const QImage &)), this, connect(worker, SIGNAL(imageLoaded(CardInfoPtr, const QImage &)), this,
SLOT(imageLoaded(CardInfo *, const QImage &))); SLOT(imageLoaded(CardInfoPtr, const QImage &)));
} }
PictureLoader::~PictureLoader() 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) if (card == nullptr)
return; return;
@ -447,7 +436,7 @@ void PictureLoader::getPixmap(QPixmap &pixmap, CardInfo *card, QSize size)
getInstance().worker->enqueueImageLoad(card); getInstance().worker->enqueueImageLoad(card);
} }
void PictureLoader::imageLoaded(CardInfo *card, const QImage &image) void PictureLoader::imageLoaded(CardInfoPtr card, const QImage &image)
{ {
if (image.isNull()) { if (image.isNull()) {
QPixmapCache::insert(card->getPixmapCacheKey(), QPixmap()); QPixmapCache::insert(card->getPixmapCacheKey(), QPixmap());
@ -463,7 +452,7 @@ void PictureLoader::imageLoaded(CardInfo *card, const QImage &image)
card->emitPixmapUpdated(); card->emitPixmapUpdated();
} }
void PictureLoader::clearPixmapCache(CardInfo *card) void PictureLoader::clearPixmapCache(CardInfoPtr card)
{ {
if (card) if (card)
QPixmapCache::remove(card->getPixmapCacheKey()); QPixmapCache::remove(card->getPixmapCacheKey());
@ -474,12 +463,12 @@ void PictureLoader::clearPixmapCache()
QPixmapCache::clear(); QPixmapCache::clear();
} }
void PictureLoader::cacheCardPixmaps(QList<CardInfo *> cards) void PictureLoader::cacheCardPixmaps(QList<CardInfoPtr> cards)
{ {
QPixmap tmp; QPixmap tmp;
int max = qMin(cards.size(), CACHED_CARD_PER_DECK_MAX); int max = qMin(cards.size(), CACHED_CARD_PER_DECK_MAX);
for (int i = 0; i < max; ++i) { for (int i = 0; i < max; ++i) {
CardInfo *card = cards.at(i); CardInfoPtr card = cards.at(i);
if (!card) if (!card)
continue; continue;

View file

@ -6,8 +6,7 @@
#include <QMutex> #include <QMutex>
#include <QNetworkRequest> #include <QNetworkRequest>
class CardInfo; #include "carddatabase.h"
class CardSet;
class QNetworkAccessManager; class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;
class QThread; class QThread;
@ -17,17 +16,21 @@ class PictureToLoad
private: private:
class SetDownloadPriorityComparator; class SetDownloadPriorityComparator;
CardInfo *card; CardInfoPtr card;
QList<CardSet *> sortedSets; QList<CardSetPtr> sortedSets;
int setIndex; int setIndex;
public: public:
PictureToLoad(CardInfo *_card = 0); PictureToLoad(CardInfoPtr _card = CardInfoPtr());
CardInfo *getCard() const CardInfoPtr getCard() const
{ {
return card; return card;
} }
CardSet *getCurrentSet() const; void clear()
{
card.clear();
}
CardSetPtr getCurrentSet() const;
QString getSetName() const; QString getSetName() const;
bool nextSet(); bool nextSet();
}; };
@ -39,7 +42,7 @@ public:
PictureLoaderWorker(); PictureLoaderWorker();
~PictureLoaderWorker(); ~PictureLoaderWorker();
void enqueueImageLoad(CardInfo *card); void enqueueImageLoad(CardInfoPtr card);
private: private:
static QStringList md5Blacklist; static QStringList md5Blacklist;
@ -67,7 +70,7 @@ public slots:
void processLoadQueue(); void processLoadQueue();
signals: signals:
void startLoadQueue(); void startLoadQueue();
void imageLoaded(CardInfo *card, const QImage &image); void imageLoaded(CardInfoPtr card, const QImage &image);
}; };
class PictureLoader : public QObject class PictureLoader : public QObject
@ -90,15 +93,15 @@ private:
PictureLoaderWorker *worker; PictureLoaderWorker *worker;
public: 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 getCardBackPixmap(QPixmap &pixmap, QSize size);
static void clearPixmapCache(CardInfo *card); static void clearPixmapCache(CardInfoPtr card);
static void clearPixmapCache(); static void clearPixmapCache();
static void cacheCardPixmaps(QList<CardInfo *> cards); static void cacheCardPixmaps(QList<CardInfoPtr> cards);
private slots: private slots:
void picDownloadChanged(); void picDownloadChanged();
void picsPathChanged(); void picsPathChanged();
public slots: public slots:
void imageLoaded(CardInfo *card, const QImage &image); void imageLoaded(CardInfoPtr card, const QImage &image);
}; };
#endif #endif

View file

@ -1066,7 +1066,7 @@ void Player::actCreateToken()
lastTokenName = dlg.getName(); lastTokenName = dlg.getName();
lastTokenPT = dlg.getPT(); lastTokenPT = dlg.getPT();
CardInfo *correctedCard = db->getCardBySimpleName(lastTokenName); CardInfoPtr correctedCard = db->getCardBySimpleName(lastTokenName);
if (correctedCard) { if (correctedCard) {
lastTokenName = correctedCard->getName(); lastTokenName = correctedCard->getName();
lastTokenTableRow = table->clampValidTableRow(2 - correctedCard->getTableRow()); lastTokenTableRow = table->clampValidTableRow(2 - correctedCard->getTableRow());
@ -1102,7 +1102,7 @@ void Player::actCreateAnotherToken()
void Player::actCreatePredefinedToken() void Player::actCreatePredefinedToken()
{ {
QAction *action = static_cast<QAction *>(sender()); QAction *action = static_cast<QAction *>(sender());
CardInfo *cardInfo = db->getCard(action->text()); CardInfoPtr cardInfo = db->getCard(action->text());
if (!cardInfo) if (!cardInfo)
return; return;
@ -1128,7 +1128,7 @@ 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()) {
CardInfo *cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName())); CardInfoPtr cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName()));
setLastToken(cardInfo); setLastToken(cardInfo);
} }
} }
@ -1207,7 +1207,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()) {
CardInfo *cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName())); CardInfoPtr cardInfo = db->getCard(dbNameFromTokenDisplayName(cardRelation->getName()));
setLastToken(cardInfo); 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) 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) if (cardInfo == nullptr || sourceCard == nullptr)
return; return;
@ -1407,7 +1407,7 @@ void Player::eventCreateToken(const Event_CreateToken &event)
if (!QString::fromStdString(event.pt()).isEmpty()) { if (!QString::fromStdString(event.pt()).isEmpty()) {
card->setPT(QString::fromStdString(event.pt())); card->setPT(QString::fromStdString(event.pt()));
} else { } else {
CardInfo *dbCard = db->getCard(QString::fromStdString(event.card_name())); CardInfoPtr dbCard = db->getCard(QString::fromStdString(event.card_name()));
if (dbCard) if (dbCard)
card->setPT(dbCard->getPowTough()); 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 *cardToMove = cmd.mutable_cards_to_move()->add_card();
cardToMove->set_card_id(c->getId()); cardToMove->set_card_id(c->getId());
CardInfo *ci = c->getInfo(); CardInfoPtr ci = c->getInfo();
if (!ci) if (!ci)
return; return;
if (!faceDown && ((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) || if (!faceDown && ((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) ||
@ -2820,7 +2820,7 @@ void Player::processSceneSizeChange(int newPlayerWidth)
hand->setWidth(tableWidth + stack->boundingRect().width()); hand->setWidth(tableWidth + stack->boundingRect().width());
} }
void Player::setLastToken(CardInfo *cardInfo) void Player::setLastToken(CardInfoPtr cardInfo)
{ {
if (cardInfo == nullptr || aCreateAnotherToken == nullptr) if (cardInfo == nullptr || aCreateAnotherToken == nullptr)
return; return;

View file

@ -403,7 +403,7 @@ public:
void sendGameCommand(PendingCommand *pend); void sendGameCommand(PendingCommand *pend);
void sendGameCommand(const google::protobuf::Message &command); void sendGameCommand(const google::protobuf::Message &command);
void setLastToken(CardInfo *cardInfo); void setLastToken(CardInfoPtr cardInfo);
}; };
#endif #endif

View file

@ -3,15 +3,13 @@
SetsModel::SetsModel(CardDatabase *_db, QObject *parent) : QAbstractTableModel(parent), sets(_db->getSetList()) SetsModel::SetsModel(CardDatabase *_db, QObject *parent) : QAbstractTableModel(parent), sets(_db->getSetList())
{ {
sets.sortByKey(); sets.sortByKey();
foreach (CardSet *set, sets) { for (const CardSetPtr &set : sets) {
if (set->getEnabled()) if (set->getEnabled())
enabledSets.insert(set); enabledSets.insert(set);
} }
} }
SetsModel::~SetsModel() SetsModel::~SetsModel() = default;
{
}
int SetsModel::rowCount(const QModelIndex &parent) const 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())) if (!index.isValid() || (index.column() >= NUM_COLS) || (index.row() >= rowCount()))
return QVariant(); return QVariant();
CardSet *set = sets[index.row()]; CardSetPtr set = sets[index.row()];
if (index.column() == EnabledCol) { if (index.column() == EnabledCol) {
switch (role) { switch (role) {
@ -146,7 +144,7 @@ bool SetsModel::dropMimeData(const QMimeData *data,
void SetsModel::toggleRow(int row, bool enable) void SetsModel::toggleRow(int row, bool enable)
{ {
CardSet *temp = sets.at(row); CardSetPtr temp = sets.at(row);
if (enable) if (enable)
enabledSets.insert(temp); enabledSets.insert(temp);
@ -158,7 +156,7 @@ void SetsModel::toggleRow(int row, bool enable)
void SetsModel::toggleRow(int row) void SetsModel::toggleRow(int row)
{ {
CardSet *tmp = sets.at(row); CardSetPtr tmp = sets.at(row);
if (tmp == nullptr) if (tmp == nullptr)
return; return;
@ -176,7 +174,7 @@ void SetsModel::toggleAll(bool enabled)
enabledSets.clear(); enabledSets.clear();
if (enabled) if (enabled)
foreach (CardSet *set, sets) for (CardSetPtr set : sets)
enabledSets.insert(set); enabledSets.insert(set);
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); 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) void SetsModel::swapRows(int oldRow, int newRow)
{ {
beginRemoveRows(QModelIndex(), oldRow, oldRow); beginRemoveRows(QModelIndex(), oldRow, oldRow);
CardSet *temp = sets.takeAt(oldRow); CardSetPtr temp = sets.takeAt(oldRow);
endRemoveRows(); endRemoveRows();
beginInsertRows(QModelIndex(), newRow, newRow); beginInsertRows(QModelIndex(), newRow, newRow);
@ -197,14 +195,14 @@ void SetsModel::swapRows(int oldRow, int newRow)
void SetsModel::sort(int column, Qt::SortOrder order) void SetsModel::sort(int column, Qt::SortOrder order)
{ {
QMap<QString, CardSet *> setMap; QMap<QString, CardSetPtr> setMap;
int numRows = rowCount(); int numRows = rowCount();
int row; int row;
for (row = 0; row < numRows; ++row) for (row = 0; row < numRows; ++row)
setMap.insertMulti(index(row, column).data(SetsModel::SortRole).toString(), sets.at(row)); setMap.insertMulti(index(row, column).data(SetsModel::SortRole).toString(), sets.at(row));
QList<CardSet *> tmp = setMap.values(); QList<CardSetPtr> tmp = setMap.values();
sets.clear(); sets.clear();
if (order == Qt::AscendingOrder) { if (order == Qt::AscendingOrder) {
for (row = 0; row < tmp.size(); row++) { for (row = 0; row < tmp.size(); row++) {
@ -222,11 +220,11 @@ void SetsModel::sort(int column, Qt::SortOrder order)
void SetsModel::save(CardDatabase *db) void SetsModel::save(CardDatabase *db)
{ {
// order // order
for (int i = 0; i < sets.size(); i++) for (unsigned int i = 0; i < sets.size(); i++)
sets[i]->setSortKey(i + 1); sets[i]->setSortKey(i + 1);
// enabled sets // enabled sets
foreach (CardSet *set, sets) for (const CardSetPtr &set : sets)
set->setEnabled(enabledSets.contains(set)); set->setEnabled(enabledSets.contains(set));
sets.sortByKey(); sets.sortByKey();
@ -242,7 +240,7 @@ void SetsModel::restore(CardDatabase *db)
// enabled sets // enabled sets
enabledSets.clear(); enabledSets.clear();
foreach (CardSet *set, sets) { for (const CardSetPtr &set : sets) {
if (set->getEnabled()) if (set->getEnabled())
enabledSets.insert(set); enabledSets.insert(set);
} }

View file

@ -36,7 +36,7 @@ class SetsModel : public QAbstractTableModel
private: private:
static const int NUM_COLS = 7; static const int NUM_COLS = 7;
SetList sets; SetList sets;
QSet<CardSet *> enabledSets; QSet<CardSetPtr> enabledSets;
public: public:
enum SetsColumns enum SetsColumns

View file

@ -1,6 +1,5 @@
#include "tab_deck_editor.h" #include "tab_deck_editor.h"
#include "abstractclient.h" #include "abstractclient.h"
#include "carddatabase.h"
#include "carddatabasemodel.h" #include "carddatabasemodel.h"
#include "cardframe.h" #include "cardframe.h"
#include "decklistmodel.h" #include "decklistmodel.h"
@ -872,11 +871,13 @@ void TabDeckEditor::recursiveExpand(const QModelIndex &index)
deckView->expand(index); deckView->expand(index);
} }
CardInfo *TabDeckEditor::currentCardInfo() const CardInfoPtr TabDeckEditor::currentCardInfo() const
{ {
const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex(); const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex();
if (!currentIndex.isValid()) if (!currentIndex.isValid()) {
return NULL; return {};
}
const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString();
return db->getCard(cardName); return db->getCard(cardName);
@ -884,9 +885,7 @@ CardInfo *TabDeckEditor::currentCardInfo() const
void TabDeckEditor::addCardHelper(QString zoneName) void TabDeckEditor::addCardHelper(QString zoneName)
{ {
const CardInfo *info; const CardInfoPtr info = currentCardInfo();
info = currentCardInfo();
if (!info) if (!info)
return; return;
if (info->getIsToken()) if (info->getIsToken())
@ -961,10 +960,9 @@ void TabDeckEditor::offsetCountAtIndex(const QModelIndex &idx, int offset)
void TabDeckEditor::decrementCardHelper(QString zoneName) void TabDeckEditor::decrementCardHelper(QString zoneName)
{ {
const CardInfo *info; const CardInfoPtr info = currentCardInfo();
QModelIndex idx; QModelIndex idx;
info = currentCardInfo();
if (!info) if (!info)
return; return;
if (info->getIsToken()) if (info->getIsToken())

View file

@ -7,6 +7,8 @@
#include <QDir> #include <QDir>
#include <QLineEdit> #include <QLineEdit>
#include "carddatabase.h"
class CardDatabaseModel; class CardDatabaseModel;
class CardDatabaseDisplayModel; class CardDatabaseDisplayModel;
class DeckListModel; class DeckListModel;
@ -19,7 +21,6 @@ class DeckLoader;
class Response; class Response;
class FilterTreeModel; class FilterTreeModel;
class FilterBuilder; class FilterBuilder;
class CardInfo;
class QGroupBox; class QGroupBox;
class QHBoxLayout; class QHBoxLayout;
class QVBoxLayout; class QVBoxLayout;
@ -95,7 +96,7 @@ private slots:
void saveDbHeaderState(); void saveDbHeaderState();
private: private:
CardInfo *currentCardInfo() const; CardInfoPtr currentCardInfo() const;
void addCardHelper(QString zoneName); void addCardHelper(QString zoneName);
void offsetCountAtIndex(const QModelIndex &idx, int offset); void offsetCountAtIndex(const QModelIndex &idx, int offset);
void decrementCardHelper(QString zoneName); void decrementCardHelper(QString zoneName);

View file

@ -100,7 +100,7 @@ struct CopyMainOrSide
void operator()(const InnerDecklistNode *node, const DecklistCardNode *card) const 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()) if (!dbCard || dbCard->getIsToken())
return; return;

View file

@ -51,7 +51,7 @@ bool OracleImporter::readSetsFromByteArray(const QByteArray &data)
return true; return true;
} }
CardInfo *OracleImporter::addCard(const QString &setName, CardInfoPtr OracleImporter::addCard(const QString &setName,
QString cardName, QString cardName,
bool isToken, bool isToken,
int cardId, int cardId,
@ -74,7 +74,7 @@ CardInfo *OracleImporter::addCard(const QString &setName,
cardName = cardName.replace("Æ", "AE"); cardName = cardName.replace("Æ", "AE");
cardName = cardName.replace("", "'"); cardName = cardName.replace("", "'");
CardInfo *card; CardInfoPtr card;
if (cards.contains(cardName)) { if (cards.contains(cardName)) {
card = cards.value(cardName); card = cards.value(cardName);
} else { } else {
@ -95,7 +95,7 @@ CardInfo *OracleImporter::addCard(const QString &setName,
!cardText.contains(cardName + " enters the battlefield tapped unless")); !cardText.contains(cardName + " enters the battlefield tapped unless"));
// insert the card and its properties // insert the card and its properties
card = new CardInfo(cardName, isToken, cardCost, cmc, cardType, cardPT, cardText, colors, relatedCards, card = CardInfo::newInstance(cardName, isToken, cardCost, cmc, cardType, cardPT, cardText, colors, relatedCards,
reverseRelatedCards, upsideDown, cardLoyalty, cipt); reverseRelatedCards, upsideDown, cardLoyalty, cipt);
int tableRow = 1; int tableRow = 1;
QString mainCardType = card->getMainCardType(); QString mainCardType = card->getMainCardType();
@ -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; int cards = 0;
@ -202,7 +202,7 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data)
colors.clear(); colors.clear();
extractColors(map.value("colors").toStringList(), colors); extractColors(map.value("colors").toStringList(), colors);
CardInfo *card = CardInfoPtr card =
addCard(set->getShortName(), cardName, false, cardId, setNumber, cardCost, cmc, cardType, cardPT, addCard(set->getShortName(), cardName, false, cardId, setNumber, cardCost, cmc, cardType, cardPT,
cardLoyalty, cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity); cardLoyalty, cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity);
@ -290,8 +290,9 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data)
upsideDown = false; upsideDown = false;
// add the card // add the card
CardInfo *card = addCard(set->getShortName(), cardName, false, muid, setNumber, cardCost, cmc, cardType, cardPT, CardInfoPtr card =
cardLoyalty, cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity); addCard(set->getShortName(), cardName, false, muid, setNumber, cardCost, cmc, cardType, cardPT, cardLoyalty,
cardText, colors, relatedCards, reverseRelatedCards, upsideDown, rarity);
if (!set->contains(card)) { if (!set->contains(card)) {
card->addToSet(set); card->addToSet(set);
@ -311,21 +312,21 @@ int OracleImporter::startImport()
const SetToDownload *curSet; const SetToDownload *curSet;
// add an empty set for tokens // 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); sets.insert(TOKENS_SETNAME, tokenSet);
while (it.hasNext()) { while (it.hasNext()) {
curSet = &it.next(); curSet = &it.next();
CardSet *set = CardSetPtr set = CardSet::newInstance(curSet->getShortName(), curSet->getLongName(), curSet->getSetType(),
new CardSet(curSet->getShortName(), curSet->getLongName(), curSet->getSetType(), curSet->getReleaseDate()); curSet->getReleaseDate());
if (!sets.contains(set->getShortName())) if (!sets.contains(set->getShortName()))
sets.insert(set->getShortName(), set); sets.insert(set->getShortName(), set);
int setCards = importTextSpoiler(set, curSet->getCards()); int setCardsHere = importTextSpoiler(set, curSet->getCards());
++setIndex; ++setIndex;
emit setIndexChanged(setCards, setIndex, curSet->getLongName()); emit setIndexChanged(setCardsHere, setIndex, curSet->getLongName());
} }
emit setIndexChanged(setCards, setIndex, QString()); emit setIndexChanged(setCards, setIndex, QString());

View file

@ -57,7 +57,7 @@ private:
QVariantMap setsMap; QVariantMap setsMap;
QString dataDir; QString dataDir;
CardInfo *addCard(const QString &setName, CardInfoPtr addCard(const QString &setName,
QString cardName, QString cardName,
bool isToken, bool isToken,
int cardId, int cardId,
@ -81,7 +81,7 @@ public:
OracleImporter(const QString &_dataDir, QObject *parent = 0); OracleImporter(const QString &_dataDir, QObject *parent = 0);
bool readSetsFromByteArray(const QByteArray &data); bool readSetsFromByteArray(const QByteArray &data);
int startImport(); int startImport();
int importTextSpoiler(CardSet *set, const QVariant &data); int importTextSpoiler(CardSetPtr set, const QVariant &data);
QList<SetToDownload> &getSets() QList<SetToDownload> &getSets()
{ {
return allSets; return allSets;

View file

@ -145,7 +145,7 @@ IntroPage::IntroPage(QWidget *parent) : OracleWizardPage(parent)
layout->addWidget(label, 0, 0, 1, 2); layout->addWidget(label, 0, 0, 1, 2);
layout->addWidget(languageLabel, 1, 0); layout->addWidget(languageLabel, 1, 0);
layout->addWidget(languageBox, 1, 1); layout->addWidget(languageBox, 1, 1);
layout->addWidget(versionLabel, 4, 0); layout->addWidget(versionLabel, 2, 0, 1, 2);
setLayout(layout); setLayout(layout);
} }

View file

@ -19,10 +19,7 @@ CardDatabaseSettings& SettingsCache::cardDatabase() const { return *cardDatabase
SettingsCache *settingsCache; SettingsCache *settingsCache;
void PictureLoader::clearPixmapCache(CardInfo * /* card */) { } void PictureLoader::clearPixmapCache(CardInfoPtr /* card */) { }
// include out main header file _after_ the hack is complete
#include "../../cockatrice/src/carddatabase.h"
namespace { namespace {

View file

@ -6,6 +6,8 @@
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include "../../cockatrice/src/carddatabase.h"
#define SETTINGSCACHE_H #define SETTINGSCACHE_H
class CardDatabaseSettings class CardDatabaseSettings
@ -38,8 +40,7 @@ signals:
#define PICTURELOADER_H #define PICTURELOADER_H
class CardInfo;
class PictureLoader { class PictureLoader {
void clearPixmapCache(CardInfo *card); void clearPixmapCache(CardInfoPtr card);
}; };