Cockatrice 2026-01-14-Development-2.11.0-beta.46
A cross-platform virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
deck_list.h
Go to the documentation of this file.
1
9
10#ifndef DECKLIST_H
11#define DECKLIST_H
12
13#include "deck_list_memento.h"
14#include "deck_list_node_tree.h"
15#include "sideboard_plan.h"
17
18#include <QMap>
19#include <QVector>
20#include <QtCore/QXmlStreamReader>
22
25class CardDatabase;
26class QIODevice;
27class QTextStream;
29
63{
64public:
65 struct Metadata
66 {
67 QString name;
68 QString comments;
69 QString gameFormat;
71 QStringList tags;
73
77 bool isEmpty() const;
78 };
79
80private:
82 QMap<QString, SideboardPlan> sideboardPlans;
84
89 mutable QString cachedDeckHash;
90
91public:
94 void setName(const QString &_name = QString())
95 {
96 metadata.name = _name;
97 }
98 void setComments(const QString &_comments = QString())
99 {
100 metadata.comments = _comments;
101 }
102 void setTags(const QStringList &_tags = QStringList())
103 {
104 metadata.tags = _tags;
105 }
106 void addTag(const QString &_tag)
107 {
108 metadata.tags.append(_tag);
109 }
111 {
112 metadata.tags.clear();
113 }
114 void setBannerCard(const CardRef &_bannerCard = {})
115 {
116 metadata.bannerCard = _bannerCard;
117 }
118 void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp = QString())
119 {
120 metadata.lastLoadedTimestamp = _lastLoadedTimestamp;
121 }
122 void setGameFormat(const QString &_gameFormat = QString())
123 {
124 metadata.gameFormat = _gameFormat;
125 }
126
127
129 explicit DeckList();
131 explicit DeckList(const QString &nativeString);
133 DeckList(const Metadata &metadata,
134 const DecklistNodeTree &tree,
135 const QMap<QString, SideboardPlan> &sideboardPlans = {});
136
143 {
144 return &tree;
145 }
146
151 const Metadata &getMetadata() const
152 {
153 return metadata;
154 }
155 QString getName() const
156 {
157 return metadata.name;
158 }
159 QString getComments() const
160 {
161 return metadata.comments;
162 }
163 QStringList getTags() const
164 {
165 return metadata.tags;
166 }
168 {
169 return metadata.bannerCard;
170 }
172 {
173 return metadata.lastLoadedTimestamp;
174 }
175 QString getGameFormat() const
176 {
177 return metadata.gameFormat;
178 }
179
180
181 bool isBlankDeck() const
182 {
183 return metadata.isEmpty() && getCardList().isEmpty();
184 }
185
188 QList<MoveCard_ToZone> getCurrentSideboardPlan() const;
189 void setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan);
190 const QMap<QString, SideboardPlan> &getSideboardPlans() const
191 {
192 return sideboardPlans;
193 }
194
195
198 bool readElement(QXmlStreamReader *xml);
199 void write(QXmlStreamWriter *xml) const;
200 bool loadFromXml(QXmlStreamReader *xml);
201 bool loadFromString_Native(const QString &nativeString);
202 QString writeToString_Native() const;
203 bool loadFromFile_Native(QIODevice *device);
204 bool saveToFile_Native(QIODevice *device);
206
209 bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata);
210 bool loadFromFile_Plain(QIODevice *device);
211 bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards);
212 bool saveToFile_Plain(QIODevice *device, bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false);
213 QString writeToString_Plain(bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false);
215
218 void cleanList(bool preserveMetadata = false);
219 bool isEmpty() const
220 {
221 return tree.isEmpty() && metadata.isEmpty() && sideboardPlans.isEmpty();
222 }
223 QStringList getCardList() const;
224 QList<CardRef> getCardRefList() const;
225 QList<const DecklistCardNode *> getCardNodes(const QSet<QString> &restrictToZones = {}) const;
226 QList<const InnerDecklistNode *> getZoneNodes() const;
227 int getSideboardSize() const;
228
229 DecklistCardNode *addCard(const QString &cardName,
230 const QString &zoneName,
231 int position = -1,
232 const QString &cardSetName = QString(),
233 const QString &cardSetCollectorNumber = QString(),
234 const QString &cardProviderId = QString(),
235 const bool formatLegal = true);
237
240 QString getDeckHash() const;
241 void refreshDeckHash();
243
249 void forEachCard(const std::function<void(InnerDecklistNode *, DecklistCardNode *)> &func) const;
250 DeckListMemento createMemento(const QString &reason) const;
251 void restoreMemento(const DeckListMemento &m);
252};
253
254#endif
Base class for all nodes in the deck list tree.
Definition abstract_deck_list_node.h:73
Core in-memory container for card and set data.
Definition card_database.h:29
bool readElement(QXmlStreamReader *xml)
Definition deck_list.cpp:61
QStringList getTags() const
Definition deck_list.h:163
DecklistNodeTree * getTree()
Gets a pointer to the underlying node tree. Note: DO NOT call this method unless the object needs to ...
Definition deck_list.h:142
void addTag(const QString &_tag)
Definition deck_list.h:106
QMap< QString, SideboardPlan > sideboardPlans
Named sideboard plans.
Definition deck_list.h:82
void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp=QString())
Definition deck_list.h:118
DeckListMemento createMemento(const QString &reason) const
Definition deck_list.cpp:530
const Metadata & getMetadata() const
Definition deck_list.h:151
void setBannerCard(const CardRef &_bannerCard={})
Definition deck_list.h:114
bool loadFromString_Native(const QString &nativeString)
Definition deck_list.cpp:163
void clearTags()
Definition deck_list.h:110
bool isEmpty() const
Definition deck_list.h:219
QList< CardRef > getCardRefList() const
Definition deck_list.cpp:451
void refreshDeckHash()
Definition deck_list.cpp:517
QStringList getCardList() const
Definition deck_list.cpp:441
DeckList()
Construct an empty deck.
Definition deck_list.cpp:31
void setGameFormat(const QString &_gameFormat=QString())
Definition deck_list.h:122
void forEachCard(const std::function< void(InnerDecklistNode *, DecklistCardNode *)> &func) const
Apply a function to every card in the deck tree.
Definition deck_list.cpp:525
bool saveToFile_Native(QIODevice *device)
Definition deck_list.cpp:185
void setCurrentSideboardPlan(const QList< MoveCard_ToZone > &plan)
Definition deck_list.cpp:56
QString getGameFormat() const
Definition deck_list.h:175
void cleanList(bool preserveMetadata=false)
Definition deck_list.cpp:432
QString writeToString_Native() const
Definition deck_list.cpp:169
QString getName() const
Definition deck_list.h:155
bool loadFromXml(QXmlStreamReader *xml)
Definition deck_list.cpp:135
const QMap< QString, SideboardPlan > & getSideboardPlans() const
Definition deck_list.h:190
QString getComments() const
Definition deck_list.h:159
bool saveToFile_Plain(QIODevice *device, bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false)
Definition deck_list.cpp:413
void restoreMemento(const DeckListMemento &m)
Definition deck_list.cpp:535
QList< const InnerDecklistNode * > getZoneNodes() const
Definition deck_list.cpp:467
CardRef getBannerCard() const
Definition deck_list.h:167
QString getLastLoadedTimestamp() const
Definition deck_list.h:171
Metadata metadata
Deck metadata that is stored in the deck file.
Definition deck_list.h:81
bool loadFromFile_Native(QIODevice *device)
Definition deck_list.cpp:179
bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards)
Definition deck_list.cpp:396
QList< const DecklistCardNode * > getCardNodes(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:462
void write(QXmlStreamWriter *xml) const
Definition deck_list.cpp:117
QString cachedDeckHash
Cached deck hash, recalculated lazily. An empty string indicates the cache is invalid.
Definition deck_list.h:89
QString getDeckHash() const
Definition deck_list.cpp:504
int getSideboardSize() const
Definition deck_list.cpp:472
bool loadFromFile_Plain(QIODevice *device)
Definition deck_list.cpp:390
QList< MoveCard_ToZone > getCurrentSideboardPlan() const
Definition deck_list.cpp:47
bool isBlankDeck() const
Definition deck_list.h:181
QString writeToString_Plain(bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false)
Definition deck_list.cpp:419
bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata)
Definition deck_list.cpp:204
void setComments(const QString &_comments=QString())
Definition deck_list.h:98
void setTags(const QStringList &_tags=QStringList())
Definition deck_list.h:102
DecklistCardNode * addCard(const QString &cardName, const QString &zoneName, int position=-1, const QString &cardSetName=QString(), const QString &cardSetCollectorNumber=QString(), const QString &cardProviderId=QString(), const bool formatLegal=true)
Definition deck_list.cpp:484
DecklistNodeTree tree
The deck tree (zones + cards).
Definition deck_list.h:83
void setName(const QString &_name=QString())
Definition deck_list.h:94
Concrete node type representing an actual card entry in the deck.
Definition deck_list_card_node.h:48
Definition deck_list_node_tree.h:11
Represents a container node in the deck list hierarchy (zones and groupings).
Definition inner_deck_list_node.h:62
Defines the InnerDecklistNode class, which represents structural nodes (zones and groups) in the deck...
Definition card_ref.h:14
Definition deck_list.h:66
QString name
User-defined deck name.
Definition deck_list.h:67
bool isEmpty() const
Checks if all values (except for lastLoadedTimestamp) in the metadata is empty.
Definition deck_list.cpp:26
QString lastLoadedTimestamp
Timestamp string of last load.
Definition deck_list.h:72
QString gameFormat
The name of the game format this deck contains legal cards for.
Definition deck_list.h:69
CardRef bannerCard
Optional representative card for the deck.
Definition deck_list.h:70
QStringList tags
User-defined tags for deck classification.
Definition deck_list.h:71
QString comments
Free-form comments or notes.
Definition deck_list.h:68