Cockatrice 2026-10-19-Development-3.1.2-beta.2
A 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 "libcockatrice/protocol/pb/move_card_to_zone.pb.h"
17#include "sideboard_plan.h"
19
20#include <QList>
21#include <QMap>
22#include <QSet>
23#include <QString>
24#include <QStringList>
25#include <functional>
27
29class QIODevice;
30class QTextStream;
31class QXmlStreamReader;
32class QXmlStreamWriter;
33
67{
68public:
69 struct Metadata
70 {
71 QString name;
72 QString comments;
73 QString gameFormat;
75 QStringList tags;
78
82 bool isEmpty() const;
83
92 bool readElement(QXmlStreamReader *xml, const QString &childName);
93
99 void write(QXmlStreamWriter *xml) const;
100 };
101
102private:
106
111 mutable QString cachedDeckHash;
112
115
120 bool seekToNextElement(QXmlStreamReader *xml);
121
126 void readDeckBody(QXmlStreamReader *xml);
128
129public:
132 void setName(const QString &_name = QString())
133 {
134 metadata.name = _name;
135 }
136 void setComments(const QString &_comments = QString())
137 {
138 metadata.comments = _comments;
139 }
140 void setTags(const QStringList &_tags = QStringList())
141 {
142 metadata.tags = _tags;
143 }
144 void addTag(const QString &_tag)
145 {
146 metadata.tags.append(_tag);
147 }
149 {
150 metadata.tags.clear();
151 }
152 void setBannerCard(const CardRef &_bannerCard = {})
153 {
154 metadata.bannerCard = _bannerCard;
155 }
156 void setPlaymat(const PlaymatInfo &_playmat = {})
157 {
158 metadata.playmat = _playmat;
159 }
160 void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp = QString())
161 {
162 metadata.lastLoadedTimestamp = _lastLoadedTimestamp;
163 }
164 void setGameFormat(const QString &_gameFormat = QString())
165 {
166 metadata.gameFormat = _gameFormat;
167 }
168
169
171 explicit DeckList();
173 explicit DeckList(const QString &nativeString);
175 DeckList(const Metadata &metadata,
176 const DecklistNodeTree &tree,
178
185 {
186 return &tree;
187 }
188
195 const Metadata &getMetadata() const
196 {
197 return metadata;
198 }
199 QString getName() const
200 {
201 return metadata.name;
202 }
203 QString getComments() const
204 {
205 return metadata.comments;
206 }
207 QStringList getTags() const
208 {
209 return metadata.tags;
210 }
212 {
213 return metadata.bannerCard;
214 }
216 {
217 return metadata.playmat;
218 }
220 {
221 return metadata.lastLoadedTimestamp;
222 }
223 QString getGameFormat() const
224 {
225 return metadata.gameFormat;
226 }
227
228
229 bool isBlankDeck() const
230 {
231 return metadata.isEmpty() && getCardList().isEmpty();
232 }
233
239 {
240 return sideboardPlans;
241 }
242
243
246 bool readElement(QXmlStreamReader *xml);
247 void write(QXmlStreamWriter *xml) const;
248 bool loadFromXml(QXmlStreamReader *xml);
249 bool loadFromString_Native(const QString &nativeString);
250 QString writeToString_Native() const;
251 bool loadFromFile_Native(QIODevice *device);
252 bool saveToFile_Native(QIODevice *device) const;
254
257 bool loadFromStream_Plain(QTextStream &stream,
258 bool preserveMetadata,
259 const std::function<QString(const QString &)> &cardNameNormalizer);
260 bool loadFromFile_Plain(QIODevice *device, const std::function<QString(const QString &)> &cardNameNormalizer);
261 bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards) const;
262 bool
263 saveToFile_Plain(QIODevice *device, bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false) const;
264 QString writeToString_Plain(bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false) const;
266
269 void cleanList(bool preserveMetadata = false);
270 bool isEmpty() const
271 {
272 return tree.isEmpty() && metadata.isEmpty() && sideboardPlans.isEmpty();
273 }
274 QStringList getCardList(const QSet<QString> &restrictToZones = {}) const;
275 QList<CardRef> getCardRefList(const QSet<QString> &restrictToZones = {}) const;
276 QList<const DecklistCardNode *> getCardNodes(const QSet<QString> &restrictToZones = {}) const;
277 QList<const InnerDecklistNode *> getZoneNodes(const QSet<QString> &restrictToZones = {}) const;
278 int getSideboardSize() const;
279
280 DecklistCardNode *addCard(const QString &cardName,
281 const QString &zoneName,
282 int position = -1,
283 const QString &cardSetName = QString(),
284 const QString &cardSetCollectorNumber = QString(),
285 const QString &cardProviderId = QString(),
286 const bool formatLegal = true);
288
291 QString getDeckHash() const;
292 void refreshDeckHash();
294
300 void forEachCard(const std::function<void(InnerDecklistNode *, DecklistCardNode *)> &func) const;
301 DeckListMemento createMemento(const QString &reason) const;
302 void restoreMemento(const DeckListMemento &m);
303};
304
305#endif
bool readElement(QXmlStreamReader *xml)
Definition deck_list.cpp:184
QStringList getTags() const
Definition deck_list.h:207
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:184
void addTag(const QString &_tag)
Definition deck_list.h:144
PlaymatInfo getPlaymat() const
Definition deck_list.h:215
QList< CardRef > getCardRefList(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:385
bool saveToFile_Plain(QIODevice *device, bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false) const
Definition deck_list.cpp:347
QMap< QString, SideboardPlan > sideboardPlans
Named sideboard plans.
Definition deck_list.h:104
void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp=QString())
Definition deck_list.h:160
DeckListMemento createMemento(const QString &reason) const
Definition deck_list.cpp:464
const Metadata & getMetadata() const
Definition deck_list.h:195
void setBannerCard(const CardRef &_bannerCard={})
Definition deck_list.h:152
bool loadFromString_Native(const QString &nativeString)
Definition deck_list.cpp:266
void clearTags()
Definition deck_list.h:148
bool isEmpty() const
Definition deck_list.h:270
void refreshDeckHash()
Definition deck_list.cpp:451
void setPlaymat(const PlaymatInfo &_playmat={})
Definition deck_list.h:156
QList< const InnerDecklistNode * > getZoneNodes(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:401
bool saveToFile_Native(QIODevice *device) const
Definition deck_list.cpp:288
void readDeckBody(QXmlStreamReader *xml)
Reads the contents of a cockatrice_deck element into this deck.
Definition deck_list.cpp:234
bool seekToNextElement(QXmlStreamReader *xml)
Advances to the next element in the XML stream.
Definition deck_list.cpp:223
DeckList()
Construct an empty deck.
Definition deck_list.cpp:154
void setGameFormat(const QString &_gameFormat=QString())
Definition deck_list.h:164
void forEachCard(const std::function< void(InnerDecklistNode *, DecklistCardNode *)> &func) const
Apply a function to every card in the deck tree.
Definition deck_list.cpp:459
bool loadFromFile_Plain(QIODevice *device, const std::function< QString(const QString &)> &cardNameNormalizer)
Definition deck_list.cpp:320
void setCurrentSideboardPlan(const QList< MoveCard_ToZone > &plan)
Definition deck_list.cpp:179
QString getGameFormat() const
Definition deck_list.h:223
void cleanList(bool preserveMetadata=false)
Definition deck_list.cpp:366
QString writeToString_Native() const
Definition deck_list.cpp:272
QString getName() const
Definition deck_list.h:199
bool loadFromXml(QXmlStreamReader *xml)
Definition deck_list.cpp:244
const QMap< QString, SideboardPlan > & getSideboardPlans() const
Definition deck_list.h:238
QString getComments() const
Definition deck_list.h:203
void restoreMemento(const DeckListMemento &m)
Definition deck_list.cpp:469
CardRef getBannerCard() const
Definition deck_list.h:211
QString getLastLoadedTimestamp() const
Definition deck_list.h:219
Metadata metadata
Deck metadata that is stored in the deck file.
Definition deck_list.h:103
bool loadFromFile_Native(QIODevice *device)
Definition deck_list.cpp:282
QList< const DecklistCardNode * > getCardNodes(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:396
void write(QXmlStreamWriter *xml) const
Definition deck_list.cpp:205
QString cachedDeckHash
Cached deck hash, recalculated lazily. An empty string indicates the cache is invalid.
Definition deck_list.h:111
QString getDeckHash() const
Definition deck_list.cpp:438
int getSideboardSize() const
Definition deck_list.cpp:406
QStringList getCardList(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:375
QString writeToString_Plain(bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false) const
Definition deck_list.cpp:353
QList< MoveCard_ToZone > getCurrentSideboardPlan() const
Definition deck_list.cpp:170
bool isBlankDeck() const
Definition deck_list.h:229
bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards) const
Definition deck_list.cpp:326
void setComments(const QString &_comments=QString())
Definition deck_list.h:136
void setTags(const QStringList &_tags=QStringList())
Definition deck_list.h:140
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:418
bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata, const std::function< QString(const QString &)> &cardNameNormalizer)
Definition deck_list.cpp:308
DecklistNodeTree tree
The deck tree (zones + cards).
Definition deck_list.h:105
void setName(const QString &_name=QString())
Definition deck_list.h:132
Concrete node type representing an actual card entry in the deck.
Definition deck_list_card_node.h:52
Definition deck_list_node_tree.h:17
bool isEmpty() const
Definition deck_list_node_tree.cpp:120
Definition remote_connection_controller.h:20
Definition game.h:18
Definition dlg_manage_sets.h:29
Defines the InnerDecklistNode class, which represents structural nodes (zones and groups) in the deck...
Definition card_ref.h:14
Definition deck_list.h:70
bool readElement(QXmlStreamReader *xml, const QString &childName)
Reads a single deck metadata element from a Cockatrice deck XML stream.
Definition deck_list.cpp:98
QString name
User-defined deck name.
Definition deck_list.h:71
PlaymatInfo playmat
Optional playmat background for table+stack zones.
Definition deck_list.h:77
bool isEmpty() const
Checks if all values (except for lastLoadedTimestamp) in the metadata is empty.
Definition deck_list.cpp:93
QString lastLoadedTimestamp
Timestamp string of last load.
Definition deck_list.h:76
QString gameFormat
The name of the game format this deck contains legal cards for.
Definition deck_list.h:73
CardRef bannerCard
Optional representative card for the deck.
Definition deck_list.h:74
QStringList tags
User-defined tags for deck classification.
Definition deck_list.h:75
void write(QXmlStreamWriter *xml) const
Writes the deck metadata section of a Cockatrice deck XML file.
Definition deck_list.cpp:125
QString comments
Free-form comments or notes.
Definition deck_list.h:72
A resolved playmat (card + positioning parameters).
Definition playmat_params.h:42