From b1a3be681e715c2f5106afa547ba453c1f04c9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Wed, 1 Oct 2025 00:14:53 +0200 Subject: [PATCH] Untangle the card_info.cpp mess and split into individual files. Took 53 minutes --- cockatrice/CMakeLists.txt | 4 + cockatrice/src/card/card_info.cpp | 236 +----------------- cockatrice/src/card/card_info.h | 231 +---------------- cockatrice/src/card/card_relation.cpp | 12 + cockatrice/src/card/card_relation.h | 43 ++++ cockatrice/src/card/card_relation_type.h | 25 ++ cockatrice/src/card/card_set.cpp | 81 ++++++ cockatrice/src/card/card_set.h | 77 ++++++ cockatrice/src/card/card_set_list.cpp | 127 ++++++++++ cockatrice/src/card/card_set_list.h | 26 ++ cockatrice/src/card/printing_info.cpp | 13 + cockatrice/src/card/printing_info.h | 43 ++++ cockatrice/src/client/network/sets_model.h | 2 +- cockatrice/src/database/card_database.cpp | 5 +- cockatrice/src/database/card_database.h | 3 +- .../src/database/parser/cockatrice_xml_3.cpp | 7 +- .../src/database/parser/cockatrice_xml_4.cpp | 7 +- cockatrice/src/game/player/menu/card_menu.cpp | 1 + cockatrice/src/game/player/player_actions.cpp | 19 +- cockatrice/src/game/player/player_actions.h | 3 +- .../widgets/cards/card_info_frame_widget.cpp | 1 + .../cards/card_info_picture_widget.cpp | 1 + .../widgets/cards/card_info_text_widget.cpp | 1 + .../deck_editor_database_display_widget.cpp | 1 + .../printing_selector_card_overlay_widget.cpp | 1 + ...ual_database_display_set_filter_widget.cpp | 4 +- 26 files changed, 497 insertions(+), 477 deletions(-) create mode 100644 cockatrice/src/card/card_relation.cpp create mode 100644 cockatrice/src/card/card_relation.h create mode 100644 cockatrice/src/card/card_relation_type.h create mode 100644 cockatrice/src/card/card_set.cpp create mode 100644 cockatrice/src/card/card_set.h create mode 100644 cockatrice/src/card/card_set_list.cpp create mode 100644 cockatrice/src/card/card_set_list.h create mode 100644 cockatrice/src/card/printing_info.cpp create mode 100644 cockatrice/src/card/printing_info.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 5ab2a066a..d2d76bbe5 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -8,7 +8,11 @@ set(cockatrice_SOURCES ${VERSION_STRING_CPP} # sort by alphabetical order, so that there is no debate about where to add new sources to the list src/card/card_info.cpp + src/card/card_relation.cpp + src/card/card_set.cpp + src/card/card_set_list.cpp src/card/exact_card.cpp + src/card/printing_info.cpp src/client/deck_editor_menu.cpp src/client/get_text_with_max.cpp src/client/network/client_update_checker.cpp diff --git a/cockatrice/src/card/card_info.cpp b/cockatrice/src/card/card_info.cpp index e516a2dca..47621e65e 100644 --- a/cockatrice/src/card/card_info.cpp +++ b/cockatrice/src/card/card_info.cpp @@ -2,230 +2,23 @@ #include "../picture_loader/picture_loader.h" #include "../settings/cache_settings.h" +#include "card_relation.h" #include "game_specific_terms.h" +#include "printing_info.h" -#include #include -#include #include +#include +#include +#include #include #include -const char *CardSet::TOKENS_SETNAME = "TK"; +class CardRelation; +class CardSet; +class CardInfo; -CardSet::CardSet(const QString &_shortName, - const QString &_longName, - const QString &_setType, - const QDate &_releaseDate, - const CardSet::Priority _priority) - : shortName(_shortName), longName(_longName), releaseDate(_releaseDate), setType(_setType), priority(_priority) -{ - loadSetOptions(); -} - -CardSetPtr CardSet::newInstance(const QString &_shortName, - const QString &_longName, - const QString &_setType, - const QDate &_releaseDate, - const Priority _priority) -{ - CardSetPtr ptr(new CardSet(_shortName, _longName, _setType, _releaseDate, _priority)); - // ptr->setSmartPointer(ptr); - return ptr; -} - -QString CardSet::getCorrectedShortName() const -{ - // For Windows machines. - QSet invalidFileNames; - invalidFileNames << "CON" - << "PRN" - << "AUX" - << "NUL" - << "COM1" - << "COM2" - << "COM3" - << "COM4" - << "COM5" - << "COM6" - << "COM7" - << "COM8" - << "COM9" - << "LPT1" - << "LPT2" - << "LPT3" - << "LPT4" - << "LPT5" - << "LPT6" - << "LPT7" - << "LPT8" - << "LPT9"; - - return invalidFileNames.contains(shortName) ? shortName + "_" : shortName; -} - -void CardSet::loadSetOptions() -{ - sortKey = SettingsCache::instance().cardDatabase().getSortKey(shortName); - enabled = SettingsCache::instance().cardDatabase().isEnabled(shortName); - isknown = SettingsCache::instance().cardDatabase().isKnown(shortName); -} - -void CardSet::setSortKey(unsigned int _sortKey) -{ - sortKey = _sortKey; - SettingsCache::instance().cardDatabase().setSortKey(shortName, _sortKey); -} - -void CardSet::setEnabled(bool _enabled) -{ - enabled = _enabled; - SettingsCache::instance().cardDatabase().setEnabled(shortName, _enabled); -} - -void CardSet::setIsKnown(bool _isknown) -{ - isknown = _isknown; - SettingsCache::instance().cardDatabase().setIsKnown(shortName, _isknown); -} - -class SetList::KeyCompareFunctor -{ -public: - inline bool operator()(const CardSetPtr &a, const CardSetPtr &b) const - { - if (a.isNull() || b.isNull()) { - qCWarning(CardInfoLog) << "SetList::KeyCompareFunctor a or b is null"; - return false; - } - - return a->getSortKey() < b->getSortKey(); - } -}; - -void SetList::sortByKey() -{ - std::sort(begin(), end(), KeyCompareFunctor()); -} - -int SetList::getEnabledSetsNum() -{ - int num = 0; - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - if (set && set->getEnabled()) { - ++num; - } - } - return num; -} - -int SetList::getUnknownSetsNum() -{ - int num = 0; - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { - ++num; - } - } - return num; -} - -QStringList SetList::getUnknownSetsNames() -{ - QStringList sets = QStringList(); - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { - sets << set->getShortName(); - } - } - return sets; -} - -void SetList::enableAllUnknown() -{ - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { - set->setIsKnown(true); - set->setEnabled(true); - } else if (set && set->getIsKnownIgnored() && !set->getEnabled()) { - set->setEnabled(true); - } - } -} - -void SetList::enableAll() -{ - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - - if (set == nullptr) { - qCWarning(CardInfoLog) << "enabledAll has null"; - continue; - } - - if (!set->getIsKnownIgnored()) { - set->setIsKnown(true); - } - - set->setEnabled(true); - } -} - -void SetList::markAllAsKnown() -{ - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { - set->setIsKnown(true); - set->setEnabled(false); - } else if (set && set->getIsKnownIgnored() && !set->getEnabled()) { - set->setEnabled(true); - } - } -} - -void SetList::guessSortKeys() -{ - defaultSort(); - for (int i = 0; i < size(); ++i) { - CardSetPtr set = at(i); - if (set.isNull()) { - qCWarning(CardInfoLog) << "guessSortKeys set is null"; - continue; - } - set->setSortKey(i); - } -} - -void SetList::defaultSort() -{ - std::sort(begin(), end(), [](const CardSetPtr &a, const CardSetPtr &b) { - // Sort by priority, then by release date, then by short name - if (a->getPriority() != b->getPriority()) { - return a->getPriority() < b->getPriority(); // lowest first - } else if (a->getReleaseDate() != b->getReleaseDate()) { - return a->getReleaseDate() > b->getReleaseDate(); // most recent first - } else { - return a->getShortName() < b->getShortName(); // alphabetically - } - }); -} - -PrintingInfo::PrintingInfo(const CardSetPtr &_set) : set(_set) -{ -} - -/** - * Gets the uuid property of the printing, or an empty string if the property isn't present - */ -QString PrintingInfo::getUuid() const -{ - return properties.value("uuid").toString(); -} +using CardInfoPtr = QSharedPointer; CardInfo::CardInfo(const QString &_name, const QString &_text, @@ -364,17 +157,6 @@ const QChar CardInfo::getColorChar() const } } -CardRelation::CardRelation(const QString &_name, - AttachType _attachType, - bool _isCreateAllExclusion, - bool _isVariableCount, - int _defaultCount, - bool _isPersistent) - : name(_name), attachType(_attachType), isCreateAllExclusion(_isCreateAllExclusion), - isVariableCount(_isVariableCount), defaultCount(_defaultCount), isPersistent(_isPersistent) -{ -} - void CardInfo::resetReverseRelatedCards2Me() { for (CardRelation *cardRelation : this->getReverseRelatedCards2Me()) { diff --git a/cockatrice/src/card/card_info.h b/cockatrice/src/card/card_info.h index 6cb27f273..30bd094b6 100644 --- a/cockatrice/src/card/card_info.h +++ b/cockatrice/src/card/card_info.h @@ -7,6 +7,8 @@ #ifndef CARD_INFO_H #define CARD_INFO_H +#include "printing_info.h" + #include #include #include @@ -21,7 +23,6 @@ inline Q_LOGGING_CATEGORY(CardInfoLog, "card_info"); class CardInfo; -class PrintingInfo; class CardSet; class CardRelation; class ICardDatabaseParser; @@ -35,158 +36,6 @@ typedef QHash SetNameMap; Q_DECLARE_METATYPE(CardInfoPtr) -class CardSet : public QList -{ -public: - enum Priority - { - PriorityFallback = 0, - PriorityPrimary = 10, - PrioritySecondary = 20, - PriorityReprint = 30, - PriorityOther = 40, - PriorityLowest = 100, - }; - - static const char *TOKENS_SETNAME; - -private: - QString shortName, longName; - unsigned int sortKey; - QDate releaseDate; - QString setType; - Priority priority; - bool enabled, isknown; - -public: - explicit CardSet(const QString &_shortName = QString(), - const QString &_longName = QString(), - const QString &_setType = QString(), - const QDate &_releaseDate = QDate(), - const Priority _priority = PriorityFallback); - static CardSetPtr newInstance(const QString &_shortName = QString(), - const QString &_longName = QString(), - const QString &_setType = QString(), - const QDate &_releaseDate = QDate(), - const Priority _priority = PriorityFallback); - QString getCorrectedShortName() const; - QString getShortName() const - { - return shortName; - } - QString getLongName() const - { - return longName; - } - QString getSetType() const - { - return setType; - } - QDate getReleaseDate() const - { - return releaseDate; - } - Priority getPriority() const - { - return priority; - } - void setLongName(const QString &_longName) - { - longName = _longName; - } - void setSetType(const QString &_setType) - { - setType = _setType; - } - void setReleaseDate(const QDate &_releaseDate) - { - releaseDate = _releaseDate; - } - void setPriority(const Priority _priority) - { - priority = _priority; - } - - void loadSetOptions(); - int getSortKey() const - { - return sortKey; - } - void setSortKey(unsigned int _sortKey); - bool getEnabled() const - { - return enabled; - } - void setEnabled(bool _enabled); - bool getIsKnown() const - { - return isknown; - } - void setIsKnown(bool _isknown); - - // Determine incomplete sets. - bool getIsKnownIgnored() const - { - return longName.length() + setType.length() + releaseDate.toString().length() == 0; - } -}; - -class SetList : public QList -{ -private: - class KeyCompareFunctor; - -public: - void sortByKey(); - void guessSortKeys(); - void enableAllUnknown(); - void enableAll(); - void markAllAsKnown(); - int getEnabledSetsNum(); - int getUnknownSetsNum(); - QStringList getUnknownSetsNames(); - void defaultSort(); -}; - -/** - * Info relating to a specific printing for a card. - */ -class PrintingInfo -{ -public: - explicit PrintingInfo(const CardSetPtr &_set = nullptr); - ~PrintingInfo() = default; - - bool operator==(const PrintingInfo &other) const - { - return this->set == other.set && this->properties == other.properties; - } - -private: - CardSetPtr set; - // per-printing card properties; - QVariantHash properties; - -public: - CardSetPtr getSet() const - { - return set; - } - QStringList getProperties() const - { - return properties.keys(); - } - QString getProperty(const QString &propertyName) const - { - return properties.value(propertyName).toString(); - } - void setProperty(const QString &_name, const QString &_value) - { - properties.insert(_name, _value); - } - - QString getUuid() const; -}; class CardInfo : public QObject { @@ -397,80 +246,4 @@ signals: void pixmapUpdated(const PrintingInfo &printing); void cardInfoChanged(CardInfoPtr card); }; - -class CardRelation : public QObject -{ - Q_OBJECT -public: - enum AttachType - { - DoesNotAttach = 0, - AttachTo = 1, - TransformInto = 2, - }; - -private: - QString name; - AttachType attachType; - bool isCreateAllExclusion; - bool isVariableCount; - int defaultCount; - bool isPersistent; - -public: - explicit CardRelation(const QString &_name = QString(), - AttachType _attachType = DoesNotAttach, - bool _isCreateAllExclusion = false, - bool _isVariableCount = false, - int _defaultCount = 1, - bool _isPersistent = false); - - inline const QString &getName() const - { - return name; - } - AttachType getAttachType() const - { - return attachType; - } - bool getDoesAttach() const - { - return attachType != DoesNotAttach; - } - bool getDoesTransform() const - { - return attachType == TransformInto; - } - QString getAttachTypeAsString() const - { - switch (attachType) { - case AttachTo: - return "attach"; - case TransformInto: - return "transform"; - default: - return ""; - } - } - bool getCanCreateAnother() const - { - return !getDoesAttach(); - } - bool getIsCreateAllExclusion() const - { - return isCreateAllExclusion; - } - bool getIsVariable() const - { - return isVariableCount; - } - int getDefaultCount() const - { - return defaultCount; - } - bool getIsPersistent() const - { - return isPersistent; - } -}; #endif diff --git a/cockatrice/src/card/card_relation.cpp b/cockatrice/src/card/card_relation.cpp new file mode 100644 index 000000000..41fbb5617 --- /dev/null +++ b/cockatrice/src/card/card_relation.cpp @@ -0,0 +1,12 @@ +#include "card_relation.h" + +CardRelation::CardRelation(const QString &_name, + CardRelationType _attachType, + bool _isCreateAllExclusion, + bool _isVariableCount, + int _defaultCount, + bool _isPersistent) + : name(_name), attachType(_attachType), isCreateAllExclusion(_isCreateAllExclusion), + isVariableCount(_isVariableCount), defaultCount(_defaultCount), isPersistent(_isPersistent) +{ +} \ No newline at end of file diff --git a/cockatrice/src/card/card_relation.h b/cockatrice/src/card/card_relation.h new file mode 100644 index 000000000..b100f1a8b --- /dev/null +++ b/cockatrice/src/card/card_relation.h @@ -0,0 +1,43 @@ +#ifndef COCKATRICE_CARD_RELATION_H +#define COCKATRICE_CARD_RELATION_H + +#include +#include +#include "card_relation_type.h" + +class CardRelation : public QObject +{ + Q_OBJECT + +private: + QString name; + CardRelationType attachType; + bool isCreateAllExclusion; + bool isVariableCount; + int defaultCount; + bool isPersistent; + +public: + explicit CardRelation(const QString &_name = QString(), + CardRelationType _attachType = CardRelationType::DoesNotAttach, + bool _isCreateAllExclusion = false, + bool _isVariableCount = false, + int _defaultCount = 1, + bool _isPersistent = false); + + const QString &getName() const { return name; } + CardRelationType getAttachType() const { return attachType; } + bool getDoesAttach() const { return attachType != CardRelationType::DoesNotAttach; } + bool getDoesTransform() const { return attachType == CardRelationType::TransformInto; } + + QString getAttachTypeAsString() const { return cardAttachTypeToString(attachType); } + + bool getCanCreateAnother() const { return !getDoesAttach(); } + bool getIsCreateAllExclusion() const { return isCreateAllExclusion; } + bool getIsVariable() const { return isVariableCount; } + int getDefaultCount() const { return defaultCount; } + bool getIsPersistent() const { return isPersistent; } +}; + +#endif // COCKATRICE_CARD_RELATION_H + diff --git a/cockatrice/src/card/card_relation_type.h b/cockatrice/src/card/card_relation_type.h new file mode 100644 index 000000000..84e660c5e --- /dev/null +++ b/cockatrice/src/card/card_relation_type.h @@ -0,0 +1,25 @@ +#ifndef COCKATRICE_CARD_RELATION_TYPE_H +#define COCKATRICE_CARD_RELATION_TYPE_H + +#include + +/** + * Represents how a card relates to another (attach, transform, etc.). + */ +enum class CardRelationType { + DoesNotAttach = 0, + AttachTo = 1, + TransformInto = 2, +}; + +// Optional helper +inline QString cardAttachTypeToString(CardRelationType type) { + switch (type) { + case CardRelationType::AttachTo: return "attach"; + case CardRelationType::TransformInto: return "transform"; + default: return ""; + } +} + + +#endif // COCKATRICE_CARD_RELATION_TYPE_H diff --git a/cockatrice/src/card/card_set.cpp b/cockatrice/src/card/card_set.cpp new file mode 100644 index 000000000..89bc0f6e5 --- /dev/null +++ b/cockatrice/src/card/card_set.cpp @@ -0,0 +1,81 @@ +#include "card_set.h" + +#include "../settings/cache_settings.h" + +const char *CardSet::TOKENS_SETNAME = "TK"; + +CardSet::CardSet(const QString &_shortName, + const QString &_longName, + const QString &_setType, + const QDate &_releaseDate, + const CardSet::Priority _priority) + : shortName(_shortName), longName(_longName), releaseDate(_releaseDate), setType(_setType), priority(_priority) +{ + loadSetOptions(); +} + +CardSetPtr CardSet::newInstance(const QString &_shortName, + const QString &_longName, + const QString &_setType, + const QDate &_releaseDate, + const Priority _priority) +{ + CardSetPtr ptr(new CardSet(_shortName, _longName, _setType, _releaseDate, _priority)); + // ptr->setSmartPointer(ptr); + return ptr; +} + +QString CardSet::getCorrectedShortName() const +{ + // For Windows machines. + QSet invalidFileNames; + invalidFileNames << "CON" + << "PRN" + << "AUX" + << "NUL" + << "COM1" + << "COM2" + << "COM3" + << "COM4" + << "COM5" + << "COM6" + << "COM7" + << "COM8" + << "COM9" + << "LPT1" + << "LPT2" + << "LPT3" + << "LPT4" + << "LPT5" + << "LPT6" + << "LPT7" + << "LPT8" + << "LPT9"; + + return invalidFileNames.contains(shortName) ? shortName + "_" : shortName; +} + +void CardSet::loadSetOptions() +{ + sortKey = SettingsCache::instance().cardDatabase().getSortKey(shortName); + enabled = SettingsCache::instance().cardDatabase().isEnabled(shortName); + isknown = SettingsCache::instance().cardDatabase().isKnown(shortName); +} + +void CardSet::setSortKey(unsigned int _sortKey) +{ + sortKey = _sortKey; + SettingsCache::instance().cardDatabase().setSortKey(shortName, _sortKey); +} + +void CardSet::setEnabled(bool _enabled) +{ + enabled = _enabled; + SettingsCache::instance().cardDatabase().setEnabled(shortName, _enabled); +} + +void CardSet::setIsKnown(bool _isknown) +{ + isknown = _isknown; + SettingsCache::instance().cardDatabase().setIsKnown(shortName, _isknown); +} \ No newline at end of file diff --git a/cockatrice/src/card/card_set.h b/cockatrice/src/card/card_set.h new file mode 100644 index 000000000..60cd14721 --- /dev/null +++ b/cockatrice/src/card/card_set.h @@ -0,0 +1,77 @@ +#ifndef COCKATRICE_CARD_SET_H +#define COCKATRICE_CARD_SET_H + +#include +#include +#include +#include + +class CardInfo; +using CardInfoPtr = QSharedPointer; + +class CardSet; +using CardSetPtr = QSharedPointer; + +class CardSet : public QList +{ +public: + enum Priority { + PriorityFallback = 0, + PriorityPrimary = 10, + PrioritySecondary = 20, + PriorityReprint = 30, + PriorityOther = 40, + PriorityLowest = 100, + }; + + static const char *TOKENS_SETNAME; + +private: + QString shortName, longName; + unsigned int sortKey; + QDate releaseDate; + QString setType; + Priority priority; + bool enabled, isknown; +public: + explicit CardSet(const QString &_shortName = QString(), + const QString &_longName = QString(), + const QString &_setType = QString(), + const QDate &_releaseDate = QDate(), + const Priority _priority = PriorityFallback); + + static CardSetPtr newInstance(const QString &_shortName = QString(), + const QString &_longName = QString(), + const QString &_setType = QString(), + const QDate &_releaseDate = QDate(), + const Priority _priority = PriorityFallback); + + QString getCorrectedShortName() const; + + QString getShortName() const { return shortName; } + QString getLongName() const { return longName; } + QString getSetType() const { return setType; } + QDate getReleaseDate() const { return releaseDate; } + Priority getPriority() const { return priority; } + + void setLongName(const QString &_longName) { longName = _longName; } + void setSetType(const QString &_setType) { setType = _setType; } + void setReleaseDate(const QDate &_releaseDate) { releaseDate = _releaseDate; } + void setPriority(const Priority _priority) { priority = _priority; } + + void loadSetOptions(); + int getSortKey() const { return sortKey; } + void setSortKey(unsigned int _sortKey); + + bool getEnabled() const { return enabled; } + void setEnabled(bool _enabled); + + bool getIsKnown() const { return isknown; } + void setIsKnown(bool _isknown); + + bool getIsKnownIgnored() const { + return longName.length() + setType.length() + releaseDate.toString().length() == 0; + } +}; + +#endif // COCKATRICE_CARD_SET_H diff --git a/cockatrice/src/card/card_set_list.cpp b/cockatrice/src/card/card_set_list.cpp new file mode 100644 index 000000000..3198fe0cc --- /dev/null +++ b/cockatrice/src/card/card_set_list.cpp @@ -0,0 +1,127 @@ +#include "card_set_list.h" + +class CardSetList::KeyCompareFunctor +{ +public: + inline bool operator()(const CardSetPtr &a, const CardSetPtr &b) const + { + if (a.isNull() || b.isNull()) { + //qCWarning(CardInfoLog) << "SetList::KeyCompareFunctor a or b is null"; + return false; + } + + return a->getSortKey() < b->getSortKey(); + } +}; + +void CardSetList::sortByKey() +{ + std::sort(begin(), end(), KeyCompareFunctor()); +} + +int CardSetList::getEnabledSetsNum() +{ + int num = 0; + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + if (set && set->getEnabled()) { + ++num; + } + } + return num; +} + +int CardSetList::getUnknownSetsNum() +{ + int num = 0; + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { + ++num; + } + } + return num; +} + +QStringList CardSetList::getUnknownSetsNames() +{ + QStringList sets = QStringList(); + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { + sets << set->getShortName(); + } + } + return sets; +} + +void CardSetList::enableAllUnknown() +{ + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { + set->setIsKnown(true); + set->setEnabled(true); + } else if (set && set->getIsKnownIgnored() && !set->getEnabled()) { + set->setEnabled(true); + } + } +} + +void CardSetList::enableAll() +{ + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + + if (set == nullptr) { + //qCWarning(CardInfoLog) << "enabledAll has null"; + continue; + } + + if (!set->getIsKnownIgnored()) { + set->setIsKnown(true); + } + + set->setEnabled(true); + } +} + +void CardSetList::markAllAsKnown() +{ + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + if (set && !set->getIsKnown() && !set->getIsKnownIgnored()) { + set->setIsKnown(true); + set->setEnabled(false); + } else if (set && set->getIsKnownIgnored() && !set->getEnabled()) { + set->setEnabled(true); + } + } +} + +void CardSetList::guessSortKeys() +{ + defaultSort(); + for (int i = 0; i < size(); ++i) { + CardSetPtr set = at(i); + if (set.isNull()) { + //qCWarning(CardInfoLog) << "guessSortKeys set is null"; + continue; + } + set->setSortKey(i); + } +} + +void CardSetList::defaultSort() +{ + std::sort(begin(), end(), [](const CardSetPtr &a, const CardSetPtr &b) { + // Sort by priority, then by release date, then by short name + if (a->getPriority() != b->getPriority()) { + return a->getPriority() < b->getPriority(); // lowest first + } else if (a->getReleaseDate() != b->getReleaseDate()) { + return a->getReleaseDate() > b->getReleaseDate(); // most recent first + } else { + return a->getShortName() < b->getShortName(); // alphabetically + } + }); +} \ No newline at end of file diff --git a/cockatrice/src/card/card_set_list.h b/cockatrice/src/card/card_set_list.h new file mode 100644 index 000000000..8ed86bf38 --- /dev/null +++ b/cockatrice/src/card/card_set_list.h @@ -0,0 +1,26 @@ +#ifndef COCKATRICE_CARD_SET_LIST_H +#define COCKATRICE_CARD_SET_LIST_H + +#include "card_set.h" +#include +#include + +class CardSetList : public QList +{ +private: + class KeyCompareFunctor; + +public: + void sortByKey(); + void guessSortKeys(); + void enableAllUnknown(); + void enableAll(); + void markAllAsKnown(); + int getEnabledSetsNum(); + int getUnknownSetsNum(); + QStringList getUnknownSetsNames(); + void defaultSort(); +}; + + +#endif // COCKATRICE_CARD_SET_LIST_H diff --git a/cockatrice/src/card/printing_info.cpp b/cockatrice/src/card/printing_info.cpp new file mode 100644 index 000000000..3e7735e6b --- /dev/null +++ b/cockatrice/src/card/printing_info.cpp @@ -0,0 +1,13 @@ +#include "printing_info.h" + +PrintingInfo::PrintingInfo(const CardSetPtr &_set) : set(_set) +{ +} + +/** + * Gets the uuid property of the printing, or an empty string if the property isn't present + */ +QString PrintingInfo::getUuid() const +{ + return properties.value("uuid").toString(); +} \ No newline at end of file diff --git a/cockatrice/src/card/printing_info.h b/cockatrice/src/card/printing_info.h new file mode 100644 index 000000000..db4fa1e44 --- /dev/null +++ b/cockatrice/src/card/printing_info.h @@ -0,0 +1,43 @@ +#ifndef COCKATRICE_PRINTING_INFO_H +#define COCKATRICE_PRINTING_INFO_H + +#include "card_set.h" +#include +#include +#include +#include + +class PrintingInfo; + +using SetToPrintingsMap = QMap>; + +/** + * Info relating to a specific printing for a card. + */ +class PrintingInfo +{ +public: + explicit PrintingInfo(const CardSetPtr &_set = nullptr); + ~PrintingInfo() = default; + + bool operator==(const PrintingInfo &other) const { + return this->set == other.set && this->properties == other.properties; + } + +private: + CardSetPtr set; + // per-printing card properties; + QVariantHash properties; + +public: + CardSetPtr getSet() const { return set; } + + QStringList getProperties() const { return properties.keys(); } + QString getProperty(const QString &propertyName) const { return properties.value(propertyName).toString(); } + void setProperty(const QString &_name, const QString &_value) { properties.insert(_name, _value); } + + QString getUuid() const; +}; + + +#endif // COCKATRICE_PRINTING_INFO_H diff --git a/cockatrice/src/client/network/sets_model.h b/cockatrice/src/client/network/sets_model.h index 1e4183d62..d341440d7 100644 --- a/cockatrice/src/client/network/sets_model.h +++ b/cockatrice/src/client/network/sets_model.h @@ -43,7 +43,7 @@ class SetsModel : public QAbstractTableModel private: static const int NUM_COLS = 7; - SetList sets; + CardSetList sets; QSet enabledSets; public: diff --git a/cockatrice/src/database/card_database.cpp b/cockatrice/src/database/card_database.cpp index a26445005..faa9f5113 100644 --- a/cockatrice/src/database/card_database.cpp +++ b/cockatrice/src/database/card_database.cpp @@ -1,5 +1,6 @@ #include "card_database.h" +#include "../card/card_relation.h" #include "../picture_loader/picture_loader.h" #include "../settings/cache_settings.h" #include "parser/cockatrice_xml_3.h" @@ -144,9 +145,9 @@ CardSetPtr CardDatabase::getSet(const QString &setName) } } -SetList CardDatabase::getSetList() const +CardSetList CardDatabase::getSetList() const { - SetList result; + CardSetList result; for (auto set : sets.values()) { result << set; } diff --git a/cockatrice/src/database/card_database.h b/cockatrice/src/database/card_database.h index f417088c3..151019143 100644 --- a/cockatrice/src/database/card_database.h +++ b/cockatrice/src/database/card_database.h @@ -7,6 +7,7 @@ #ifndef CARDDATABASE_H #define CARDDATABASE_H +#include "../card/card_set_list.h" #include "../card/exact_card.h" #include "../common/card_ref.h" #include "card_database_loader.h" @@ -68,7 +69,7 @@ public: return cards; } CardSetPtr getSet(const QString &setName); - SetList getSetList() const; + CardSetList getSetList() const; LoadStatus getLoadStatus() const { return loadStatus; diff --git a/cockatrice/src/database/parser/cockatrice_xml_3.cpp b/cockatrice/src/database/parser/cockatrice_xml_3.cpp index 1f69079cd..7b584bc22 100644 --- a/cockatrice/src/database/parser/cockatrice_xml_3.cpp +++ b/cockatrice/src/database/parser/cockatrice_xml_3.cpp @@ -1,5 +1,8 @@ #include "cockatrice_xml_3.h" +#include "../../card/card_relation.h" +#include "../../card/card_relation_type.h" + #include #include #include @@ -232,7 +235,7 @@ void CockatriceXml3Parser::loadCardsFromXml(QXmlStreamReader &xml) _sets[setName].append(setInfo); // related cards } else if (xmlName == "related" || xmlName == "reverse-related") { - CardRelation::AttachType attach = CardRelation::DoesNotAttach; + CardRelationType attach = CardRelationType::DoesNotAttach; bool exclude = false; bool variable = false; int count = 1; @@ -254,7 +257,7 @@ void CockatriceXml3Parser::loadCardsFromXml(QXmlStreamReader &xml) } if (attrs.hasAttribute("attach")) { - attach = CardRelation::AttachTo; + attach = CardRelationType::AttachTo; } if (attrs.hasAttribute("exclude")) { diff --git a/cockatrice/src/database/parser/cockatrice_xml_4.cpp b/cockatrice/src/database/parser/cockatrice_xml_4.cpp index a623c1253..1c68e80c3 100644 --- a/cockatrice/src/database/parser/cockatrice_xml_4.cpp +++ b/cockatrice/src/database/parser/cockatrice_xml_4.cpp @@ -1,5 +1,6 @@ #include "cockatrice_xml_4.h" +#include "../../card/card_relation.h" #include "../../settings/cache_settings.h" #include @@ -205,7 +206,7 @@ void CockatriceXml4Parser::loadCardsFromXml(QXmlStreamReader &xml) } // related cards } else if (xmlName == "related" || xmlName == "reverse-related") { - CardRelation::AttachType attachType = CardRelation::DoesNotAttach; + CardRelationType attachType = CardRelationType::DoesNotAttach; bool exclude = false; bool variable = false; bool persistent = false; @@ -228,8 +229,8 @@ void CockatriceXml4Parser::loadCardsFromXml(QXmlStreamReader &xml) } if (attrs.hasAttribute("attach")) { - attachType = attrs.value("attach").toString() == "transform" ? CardRelation::TransformInto - : CardRelation::AttachTo; + attachType = attrs.value("attach").toString() == "transform" ? CardRelationType::TransformInto + : CardRelationType::AttachTo; } if (attrs.hasAttribute("exclude")) { diff --git a/cockatrice/src/game/player/menu/card_menu.cpp b/cockatrice/src/game/player/menu/card_menu.cpp index 2a669b32d..22cc86597 100644 --- a/cockatrice/src/game/player/menu/card_menu.cpp +++ b/cockatrice/src/game/player/menu/card_menu.cpp @@ -1,5 +1,6 @@ #include "card_menu.h" +#include "../../../card/card_relation.h" #include "../../../database/card_database_manager.h" #include "../../../settings/card_counter_settings.h" #include "../../../tabs/tab_game.h" diff --git a/cockatrice/src/game/player/player_actions.cpp b/cockatrice/src/game/player/player_actions.cpp index b466009ea..2173a5636 100644 --- a/cockatrice/src/game/player/player_actions.cpp +++ b/cockatrice/src/game/player/player_actions.cpp @@ -1,6 +1,7 @@ #include "player_actions.h" #include "../../../common/pb/context_move_card.pb.h" +#include "../../card/card_relation.h" #include "../../client/get_text_with_max.h" #include "../../database/card_database_manager.h" #include "../../tabs/tab_game.h" @@ -977,7 +978,7 @@ void PlayerActions::actCreateAllRelatedCards() dbName = cardRelationAll->getName(); bool persistent = cardRelationAll->getIsPersistent(); for (int i = 0; i < cardRelationAll->getDefaultCount(); ++i) { - createCard(sourceCard, dbName, CardRelation::DoesNotAttach, persistent); + createCard(sourceCard, dbName, CardRelationType::DoesNotAttach, persistent); } ++tokensTypesCreated; if (tokensTypesCreated == 1) { @@ -992,7 +993,7 @@ void PlayerActions::actCreateAllRelatedCards() dbName = cardRelationNotExcluded->getName(); bool persistent = cardRelationNotExcluded->getIsPersistent(); for (int i = 0; i < cardRelationNotExcluded->getDefaultCount(); ++i) { - createCard(sourceCard, dbName, CardRelation::DoesNotAttach, persistent); + createCard(sourceCard, dbName, CardRelationType::DoesNotAttach, persistent); } ++tokensTypesCreated; if (tokensTypesCreated == 1) { @@ -1031,18 +1032,18 @@ bool PlayerActions::createRelatedFromRelation(const CardItem *sourceCard, const return false; } for (int i = 0; i < count; ++i) { - createCard(sourceCard, dbName, CardRelation::DoesNotAttach, persistent); + createCard(sourceCard, dbName, CardRelationType::DoesNotAttach, persistent); } } else if (cardRelation->getDefaultCount() > 1) { for (int i = 0; i < cardRelation->getDefaultCount(); ++i) { - createCard(sourceCard, dbName, CardRelation::DoesNotAttach, persistent); + createCard(sourceCard, dbName, CardRelationType::DoesNotAttach, persistent); } } else { auto attachType = cardRelation->getAttachType(); // move card onto table first if attaching from some other zone // we only do this for AttachTo because cross-zone TransformInto is already handled server-side - if (attachType == CardRelation::AttachTo && sourceCard->getZone()->getName() != "table") { + if (attachType == CardRelationType::AttachTo && sourceCard->getZone()->getName() != "table") { playCardToTable(sourceCard, false); } @@ -1053,7 +1054,7 @@ bool PlayerActions::createRelatedFromRelation(const CardItem *sourceCard, const void PlayerActions::createCard(const CardItem *sourceCard, const QString &dbCardName, - CardRelation::AttachType attachType, + CardRelationType attachType, bool persistent) { CardInfoPtr cardInfo = CardDatabaseManager::query()->getCardInfo(dbCardName); @@ -1096,19 +1097,19 @@ void PlayerActions::createCard(const CardItem *sourceCard, CardDatabaseManager::query()->getCardFromSameSet(cardInfo->getName(), sourceCard->getCard().getPrinting()); switch (attachType) { - case CardRelation::DoesNotAttach: + case CardRelationType::DoesNotAttach: cmd.set_target_zone("table"); cmd.set_card_provider_id(relatedCard.getPrinting().getUuid().toStdString()); break; - case CardRelation::AttachTo: + case CardRelationType::AttachTo: cmd.set_target_zone("table"); // We currently only support creating tokens on the table cmd.set_card_provider_id(relatedCard.getPrinting().getUuid().toStdString()); cmd.set_target_card_id(sourceCard->getId()); cmd.set_target_mode(Command_CreateToken::ATTACH_TO); break; - case CardRelation::TransformInto: + case CardRelationType::TransformInto: // allow cards to directly transform on stack cmd.set_zone(sourceCard->getZone()->getName() == "stack" ? "stack" : "table"); // Transform card zone changes are handled server-side diff --git a/cockatrice/src/game/player/player_actions.h b/cockatrice/src/game/player/player_actions.h index b6bc34352..d5ea98af7 100644 --- a/cockatrice/src/game/player/player_actions.h +++ b/cockatrice/src/game/player/player_actions.h @@ -7,6 +7,7 @@ #ifndef COCKATRICE_PLAYER_ACTIONS_H #define COCKATRICE_PLAYER_ACTIONS_H +#include "../../card/card_relation_type.h" #include "event_processing_options.h" #include "player.h" @@ -170,7 +171,7 @@ private: void createCard(const CardItem *sourceCard, const QString &dbCardName, - CardRelation::AttachType attach = CardRelation::DoesNotAttach, + CardRelationType attach = CardRelationType::DoesNotAttach, bool persistent = false); bool createRelatedFromRelation(const CardItem *sourceCard, const CardRelation *cardRelation); diff --git a/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp index 6168fe903..ddc1efb48 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp @@ -1,5 +1,6 @@ #include "card_info_frame_widget.h" +#include "../../../card/card_relation.h" #include "../../../database/card_database_manager.h" #include "../../../game/board/card_item.h" #include "../../../settings/cache_settings.h" diff --git a/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp index 2375bc483..33f0be946 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp @@ -1,5 +1,6 @@ #include "card_info_picture_widget.h" +#include "../../../card/card_relation.h" #include "../../../database/card_database_manager.h" #include "../../../game/board/card_item.h" #include "../../../picture_loader/picture_loader.h" diff --git a/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp index 9f217f603..3d99d4fc9 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp @@ -1,5 +1,6 @@ #include "card_info_text_widget.h" +#include "../../../card/card_relation.h" #include "../../../card/game_specific_terms.h" #include "../../../game/board/card_item.h" diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp index bee131f00..b0a9f0814 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp @@ -1,5 +1,6 @@ #include "deck_editor_database_display_widget.h" +#include "../../../card/card_relation.h" #include "../../../database/card_database_manager.h" #include "../../../filters/syntax_help.h" #include "../../../settings/cache_settings.h" diff --git a/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp b/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp index 9ed59d46e..f537f566b 100644 --- a/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp @@ -1,5 +1,6 @@ #include "printing_selector_card_overlay_widget.h" +#include "../../../card/card_relation.h" #include "../../../database/card_database_manager.h" #include "../../../settings/cache_settings.h" #include "printing_selector_card_display_widget.h" diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp index 691292a2d..6bc27d90f 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp @@ -87,7 +87,7 @@ void VisualDatabaseDisplaySetFilterWidget::retranslateUi() void VisualDatabaseDisplaySetFilterWidget::createSetButtons() { - SetList allSets = CardDatabaseManager::getInstance()->getSetList(); + CardSetList allSets = CardDatabaseManager::getInstance()->getSetList(); // Sort by release date std::sort(allSets.begin(), allSets.end(), @@ -120,7 +120,7 @@ void VisualDatabaseDisplaySetFilterWidget::filterToRecentSets() activeSets[set] = false; } - SetList allSets = CardDatabaseManager::getInstance()->getSetList(); + CardSetList allSets = CardDatabaseManager::getInstance()->getSetList(); // Sort by release date std::sort(allSets.begin(), allSets.end(),