Cockatrice 2026-09-01-Development-3.1.0-beta.10
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 "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;
74
78 bool isEmpty() const;
79 };
80
81private:
83 QMap<QString, SideboardPlan> sideboardPlans;
85
90 mutable QString cachedDeckHash;
91
92public:
95 void setName(const QString &_name = QString())
96 {
97 metadata.name = _name;
98 }
99 void setComments(const QString &_comments = QString())
100 {
101 metadata.comments = _comments;
102 }
103 void setTags(const QStringList &_tags = QStringList())
104 {
105 metadata.tags = _tags;
106 }
107 void addTag(const QString &_tag)
108 {
109 metadata.tags.append(_tag);
110 }
112 {
113 metadata.tags.clear();
114 }
115 void setBannerCard(const CardRef &_bannerCard = {})
116 {
117 metadata.bannerCard = _bannerCard;
118 }
119 void setPlaymat(const PlaymatInfo &_playmat = {})
120 {
121 metadata.playmat = _playmat;
122 }
123 void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp = QString())
124 {
125 metadata.lastLoadedTimestamp = _lastLoadedTimestamp;
126 }
127 void setGameFormat(const QString &_gameFormat = QString())
128 {
129 metadata.gameFormat = _gameFormat;
130 }
131
132
134 explicit DeckList();
136 explicit DeckList(const QString &nativeString);
138 DeckList(const Metadata &metadata,
139 const DecklistNodeTree &tree,
140 const QMap<QString, SideboardPlan> &sideboardPlans = {});
141
148 {
149 return &tree;
150 }
151
158 const Metadata &getMetadata() const
159 {
160 return metadata;
161 }
162 QString getName() const
163 {
164 return metadata.name;
165 }
166 QString getComments() const
167 {
168 return metadata.comments;
169 }
170 QStringList getTags() const
171 {
172 return metadata.tags;
173 }
175 {
176 return metadata.bannerCard;
177 }
179 {
180 return metadata.playmat;
181 }
183 {
184 return metadata.lastLoadedTimestamp;
185 }
186 QString getGameFormat() const
187 {
188 return metadata.gameFormat;
189 }
190
191
192 bool isBlankDeck() const
193 {
194 return metadata.isEmpty() && getCardList().isEmpty();
195 }
196
199 QList<MoveCard_ToZone> getCurrentSideboardPlan() const;
200 void setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan);
201 const QMap<QString, SideboardPlan> &getSideboardPlans() const
202 {
203 return sideboardPlans;
204 }
205
206
209 bool readElement(QXmlStreamReader *xml);
210 void write(QXmlStreamWriter *xml) const;
211 bool loadFromXml(QXmlStreamReader *xml);
212 bool loadFromString_Native(const QString &nativeString);
213 QString writeToString_Native() const;
214 bool loadFromFile_Native(QIODevice *device);
215 bool saveToFile_Native(QIODevice *device) const;
217
220 bool loadFromStream_Plain(QTextStream &stream,
221 bool preserveMetadata,
222 const std::function<QString(const QString &)> &cardNameNormalizer);
223 bool loadFromFile_Plain(QIODevice *device, const std::function<QString(const QString &)> &cardNameNormalizer);
224 bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards) const;
225 bool
226 saveToFile_Plain(QIODevice *device, bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false) const;
227 QString writeToString_Plain(bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false) const;
229
232 void cleanList(bool preserveMetadata = false);
233 bool isEmpty() const
234 {
235 return tree.isEmpty() && metadata.isEmpty() && sideboardPlans.isEmpty();
236 }
237 QStringList getCardList(const QSet<QString> &restrictToZones = {}) const;
238 QList<CardRef> getCardRefList(const QSet<QString> &restrictToZones = {}) const;
239 QList<const DecklistCardNode *> getCardNodes(const QSet<QString> &restrictToZones = {}) const;
240 QList<const InnerDecklistNode *> getZoneNodes(const QSet<QString> &restrictToZones = {}) const;
241 int getSideboardSize() const;
242
243 DecklistCardNode *addCard(const QString &cardName,
244 const QString &zoneName,
245 int position = -1,
246 const QString &cardSetName = QString(),
247 const QString &cardSetCollectorNumber = QString(),
248 const QString &cardProviderId = QString(),
249 const bool formatLegal = true);
251
254 QString getDeckHash() const;
255 void refreshDeckHash();
257
263 void forEachCard(const std::function<void(InnerDecklistNode *, DecklistCardNode *)> &func) const;
264 DeckListMemento createMemento(const QString &reason) const;
265 void restoreMemento(const DeckListMemento &m);
266};
267
268#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:30
bool readElement(QXmlStreamReader *xml)
Definition deck_list.cpp:61
QStringList getTags() const
Definition deck_list.h:170
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:147
void addTag(const QString &_tag)
Definition deck_list.h:107
PlaymatInfo getPlaymat() const
Definition deck_list.h:178
QList< CardRef > getCardRefList(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:472
bool saveToFile_Plain(QIODevice *device, bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false) const
Definition deck_list.cpp:434
QMap< QString, SideboardPlan > sideboardPlans
Named sideboard plans.
Definition deck_list.h:83
void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp=QString())
Definition deck_list.h:123
DeckListMemento createMemento(const QString &reason) const
Definition deck_list.cpp:551
const Metadata & getMetadata() const
Definition deck_list.h:158
void setBannerCard(const CardRef &_bannerCard={})
Definition deck_list.h:115
bool loadFromString_Native(const QString &nativeString)
Definition deck_list.cpp:205
void clearTags()
Definition deck_list.h:111
bool isEmpty() const
Definition deck_list.h:233
void refreshDeckHash()
Definition deck_list.cpp:538
void setPlaymat(const PlaymatInfo &_playmat={})
Definition deck_list.h:119
QList< const InnerDecklistNode * > getZoneNodes(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:488
bool saveToFile_Native(QIODevice *device) const
Definition deck_list.cpp:227
DeckList()
Construct an empty deck.
Definition deck_list.cpp:31
void setGameFormat(const QString &_gameFormat=QString())
Definition deck_list.h:127
void forEachCard(const std::function< void(InnerDecklistNode *, DecklistCardNode *)> &func) const
Apply a function to every card in the deck tree.
Definition deck_list.cpp:546
bool loadFromFile_Plain(QIODevice *device, const std::function< QString(const QString &)> &cardNameNormalizer)
Definition deck_list.cpp:407
void setCurrentSideboardPlan(const QList< MoveCard_ToZone > &plan)
Definition deck_list.cpp:56
QString getGameFormat() const
Definition deck_list.h:186
void cleanList(bool preserveMetadata=false)
Definition deck_list.cpp:453
QString writeToString_Native() const
Definition deck_list.cpp:211
QString getName() const
Definition deck_list.h:162
bool loadFromXml(QXmlStreamReader *xml)
Definition deck_list.cpp:175
const QMap< QString, SideboardPlan > & getSideboardPlans() const
Definition deck_list.h:201
QString getComments() const
Definition deck_list.h:166
void restoreMemento(const DeckListMemento &m)
Definition deck_list.cpp:556
CardRef getBannerCard() const
Definition deck_list.h:174
QString getLastLoadedTimestamp() const
Definition deck_list.h:182
Metadata metadata
Deck metadata that is stored in the deck file.
Definition deck_list.h:82
bool loadFromFile_Native(QIODevice *device)
Definition deck_list.cpp:221
QList< const DecklistCardNode * > getCardNodes(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:483
void write(QXmlStreamWriter *xml) const
Definition deck_list.cpp:157
QString cachedDeckHash
Cached deck hash, recalculated lazily. An empty string indicates the cache is invalid.
Definition deck_list.h:90
QString getDeckHash() const
Definition deck_list.cpp:525
int getSideboardSize() const
Definition deck_list.cpp:493
QStringList getCardList(const QSet< QString > &restrictToZones={}) const
Definition deck_list.cpp:462
QString writeToString_Plain(bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false) const
Definition deck_list.cpp:440
QList< MoveCard_ToZone > getCurrentSideboardPlan() const
Definition deck_list.cpp:47
bool isBlankDeck() const
Definition deck_list.h:192
bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards) const
Definition deck_list.cpp:413
void setComments(const QString &_comments=QString())
Definition deck_list.h:99
void setTags(const QStringList &_tags=QStringList())
Definition deck_list.h:103
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:505
bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata, const std::function< QString(const QString &)> &cardNameNormalizer)
Definition deck_list.cpp:247
DecklistNodeTree tree
The deck tree (zones + cards).
Definition deck_list.h:84
void setName(const QString &_name=QString())
Definition deck_list.h:95
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:64
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
PlaymatInfo playmat
Optional playmat background for table+stack zones.
Definition deck_list.h:73
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
A resolved playmat (card + positioning parameters).
Definition playmat_params.h:42