Cockatrice 2025-11-30-Development-2.11.0-beta.38
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"
15
16#include <QMap>
17#include <QVector>
18#include <QtCore/QXmlStreamReader>
19#include <libcockatrice/protocol/pb/move_card_to_zone.pb.h>
21
24class CardDatabase;
25class QIODevice;
26class QTextStream;
28
47{
48private:
49 QString name;
50 QList<MoveCard_ToZone> moveList;
51
52public:
58 explicit SideboardPlan(const QString &_name = QString(),
59 const QList<MoveCard_ToZone> &_moveList = QList<MoveCard_ToZone>());
60
66 bool readElement(QXmlStreamReader *xml);
67
72 void write(QXmlStreamWriter *xml);
73
75 [[nodiscard]] QString getName() const
76 {
77 return name;
78 }
79
81 [[nodiscard]] const QList<MoveCard_ToZone> &getMoveList() const
82 {
83 return moveList;
84 }
85
87 void setMoveList(const QList<MoveCard_ToZone> &_moveList);
88};
89
126class DeckList : public QObject
127{
128 Q_OBJECT
129private:
130 QString name;
131 QString comments;
134 QStringList tags;
135 QMap<QString, SideboardPlan *> sideboardPlans;
137
142 mutable QString cachedDeckHash;
143
144 // Helpers for traversing the tree
145 static void getCardListHelper(InnerDecklistNode *node, QSet<QString> &result);
146 static void getCardRefListHelper(InnerDecklistNode *item, QList<CardRef> &result);
147 InnerDecklistNode *getZoneObjFromName(const QString &zoneName);
148
149protected:
157 virtual QString getCardZoneFromName(const QString /*cardName*/, QString currentZoneName)
158 {
159 return currentZoneName;
160 }
161
168 virtual QString getCompleteCardName(const QString &cardName) const
169 {
170 return cardName;
171 }
172
173signals:
178
179public slots:
182 void setName(const QString &_name = QString())
183 {
184 name = _name;
185 }
186 void setComments(const QString &_comments = QString())
187 {
188 comments = _comments;
189 }
190 void setTags(const QStringList &_tags = QStringList())
191 {
192 tags = _tags;
193 emit deckTagsChanged();
194 }
195 void addTag(const QString &_tag)
196 {
197 tags.append(_tag);
198 emit deckTagsChanged();
199 }
201 {
202 tags.clear();
203 emit deckTagsChanged();
204 }
205 void setBannerCard(const CardRef &_bannerCard = {})
206 {
207 bannerCard = _bannerCard;
208 }
209 void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp = QString())
210 {
211 lastLoadedTimestamp = _lastLoadedTimestamp;
212 }
213
214
215public:
217 explicit DeckList();
219 DeckList(const DeckList &) = delete;
220 DeckList &operator=(const DeckList &) = delete;
222 explicit DeckList(const QString &nativeString);
223 ~DeckList() override;
224
227 QString getName() const
228 {
229 return name;
230 }
231 QString getComments() const
232 {
233 return comments;
234 }
235 QStringList getTags() const
236 {
237 return tags;
238 }
240 {
241 return bannerCard;
242 }
244 {
245 return lastLoadedTimestamp;
246 }
247
248
249 bool isBlankDeck() const
250 {
251 return name.isEmpty() && comments.isEmpty() && getCardList().isEmpty();
252 }
253
256 QList<MoveCard_ToZone> getCurrentSideboardPlan();
257 void setCurrentSideboardPlan(const QList<MoveCard_ToZone> &plan);
258 const QMap<QString, SideboardPlan *> &getSideboardPlans() const
259 {
260 return sideboardPlans;
261 }
262
263
266 bool readElement(QXmlStreamReader *xml);
267 void write(QXmlStreamWriter *xml) const;
268 bool loadFromXml(QXmlStreamReader *xml);
269 bool loadFromString_Native(const QString &nativeString);
270 QString writeToString_Native() const;
271 bool loadFromFile_Native(QIODevice *device);
272 bool saveToFile_Native(QIODevice *device);
274
277 bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata);
278 bool loadFromFile_Plain(QIODevice *device);
279 bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards);
280 bool saveToFile_Plain(QIODevice *device, bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false);
281 QString writeToString_Plain(bool prefixSideboardCards = true, bool slashTappedOutSplitCards = false);
283
286 void cleanList(bool preserveMetadata = false);
287 bool isEmpty() const
288 {
289 return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty();
290 }
291 QStringList getCardList() const;
292 QList<CardRef> getCardRefList() const;
293 QList<DecklistCardNode *> getCardNodes(const QStringList &restrictToZones = QStringList()) const;
294 int getSideboardSize() const;
296 {
297 return root;
298 }
299 DecklistCardNode *addCard(const QString &cardName,
300 const QString &zoneName,
301 int position,
302 const QString &cardSetName = QString(),
303 const QString &cardSetCollectorNumber = QString(),
304 const QString &cardProviderId = QString());
305 bool deleteNode(AbstractDecklistNode *node, InnerDecklistNode *rootNode = nullptr);
307
310 QString getDeckHash() const;
311 void refreshDeckHash();
313
319 void forEachCard(const std::function<void(InnerDecklistNode *, DecklistCardNode *)> &func) const;
320 DeckListMemento createMemento(const QString &reason) const;
321 void restoreMemento(const DeckListMemento &m);
322};
323
324#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
Definition deck_list_memento.h:6
bool readElement(QXmlStreamReader *xml)
Definition deck_list.cpp:120
QMap< QString, SideboardPlan * > sideboardPlans
Named sideboard plans.
Definition deck_list.h:135
static void getCardListHelper(InnerDecklistNode *node, QSet< QString > &result)
Definition deck_list.cpp:514
InnerDecklistNode * getRoot() const
Definition deck_list.h:295
QStringList getTags() const
Definition deck_list.h:235
void addTag(const QString &_tag)
Definition deck_list.h:195
void setLastLoadedTimestamp(const QString &_lastLoadedTimestamp=QString())
Definition deck_list.h:209
DeckListMemento createMemento(const QString &reason) const
Definition deck_list.cpp:726
void setBannerCard(const CardRef &_bannerCard={})
Definition deck_list.h:205
QList< MoveCard_ToZone > getCurrentSideboardPlan()
Definition deck_list.cpp:100
bool loadFromString_Native(const QString &nativeString)
Definition deck_list.cpp:219
void clearTags()
Definition deck_list.h:200
bool isEmpty() const
Definition deck_list.h:287
InnerDecklistNode * root
Root of the deck tree (zones + cards).
Definition deck_list.h:136
QList< CardRef > getCardRefList() const
Definition deck_list.cpp:547
void refreshDeckHash()
Definition deck_list.cpp:704
QString comments
Free-form comments or notes.
Definition deck_list.h:131
const QMap< QString, SideboardPlan * > & getSideboardPlans() const
Definition deck_list.h:258
QStringList getCardList() const
Definition deck_list.cpp:540
DeckList()
Construct an empty deck.
Definition deck_list.cpp:80
CardRef bannerCard
Optional representative card for the deck.
Definition deck_list.h:132
DeckList(const DeckList &)=delete
Delete copy constructor.
QString name
User-defined deck name.
Definition deck_list.h:130
void forEachCard(const std::function< void(InnerDecklistNode *, DecklistCardNode *)> &func) const
Apply a function to every card in the deck tree.
Definition deck_list.cpp:713
InnerDecklistNode * getZoneObjFromName(const QString &zoneName)
Definition deck_list.cpp:449
bool saveToFile_Native(QIODevice *device)
Definition deck_list.cpp:241
void setCurrentSideboardPlan(const QList< MoveCard_ToZone > &plan)
Definition deck_list.cpp:109
void cleanList(bool preserveMetadata=false)
Definition deck_list.cpp:503
QString writeToString_Native() const
Definition deck_list.cpp:225
QString getName() const
Definition deck_list.h:227
bool loadFromXml(QXmlStreamReader *xml)
Definition deck_list.cpp:191
QString getComments() const
Definition deck_list.h:231
bool saveToFile_Plain(QIODevice *device, bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false)
Definition deck_list.cpp:484
void restoreMemento(const DeckListMemento &m)
Definition deck_list.cpp:731
void deckHashChanged()
Emitted when the deck hash changes.
CardRef getBannerCard() const
Definition deck_list.h:239
QString getLastLoadedTimestamp() const
Definition deck_list.h:243
bool deleteNode(AbstractDecklistNode *node, InnerDecklistNode *rootNode=nullptr)
Definition deck_list.cpp:613
bool loadFromFile_Native(QIODevice *device)
Definition deck_list.cpp:235
static void getCardRefListHelper(InnerDecklistNode *item, QList< CardRef > &result)
Definition deck_list.cpp:527
bool saveToStream_Plain(QTextStream &stream, bool prefixSideboardCards, bool slashTappedOutSplitCards)
Definition deck_list.cpp:467
QStringList tags
User-defined tags for deck classification.
Definition deck_list.h:134
QList< DecklistCardNode * > getCardNodes(const QStringList &restrictToZones=QStringList()) const
Definition deck_list.cpp:554
void write(QXmlStreamWriter *xml) const
Definition deck_list.cpp:158
QString cachedDeckHash
Cached deck hash, recalculated lazily. An empty string indicates the cache is invalid.
Definition deck_list.h:142
QString getDeckHash() const
Definition deck_list.cpp:691
int getSideboardSize() const
Definition deck_list.cpp:577
bool loadFromFile_Plain(QIODevice *device)
Definition deck_list.cpp:461
virtual QString getCompleteCardName(const QString &cardName) const
Produce the complete display name of a card. Override in subclasses to add set suffixes or annotation...
Definition deck_list.h:168
bool isBlankDeck() const
Definition deck_list.h:249
QString writeToString_Plain(bool prefixSideboardCards=true, bool slashTappedOutSplitCards=false)
Definition deck_list.cpp:490
QString lastLoadedTimestamp
Timestamp string of last load.
Definition deck_list.h:133
bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata)
Definition deck_list.cpp:260
DecklistCardNode * addCard(const QString &cardName, const QString &zoneName, int position, const QString &cardSetName=QString(), const QString &cardSetCollectorNumber=QString(), const QString &cardProviderId=QString())
Definition deck_list.cpp:594
void setComments(const QString &_comments=QString())
Definition deck_list.h:186
void setTags(const QStringList &_tags=QStringList())
Definition deck_list.h:190
~DeckList() override
Definition deck_list.cpp:91
DeckList & operator=(const DeckList &)=delete
void deckTagsChanged()
Emitted when the deck tags are modified.
virtual QString getCardZoneFromName(const QString, QString currentZoneName)
Map a card name to its zone. Override in subclasses for format-specific logic.
Definition deck_list.h:157
void setName(const QString &_name=QString())
Definition deck_list.h:182
Concrete node type representing an actual card entry in the deck.
Definition deck_list_card_node.h:48
Represents a container node in the deck list hierarchy (zones and groupings).
Definition inner_deck_list_node.h:62
const QList< MoveCard_ToZone > & getMoveList() const
Definition deck_list.h:81
void write(QXmlStreamWriter *xml)
Write this SideboardPlan to XML.
Definition deck_list.cpp:66
QString name
Human-readable name of this plan.
Definition deck_list.h:49
QList< MoveCard_ToZone > moveList
List of move instructions for this plan.
Definition deck_list.h:50
void setMoveList(const QList< MoveCard_ToZone > &_moveList)
Replace the move list with a new one.
Definition deck_list.cpp:29
SideboardPlan(const QString &_name=QString(), const QList< MoveCard_ToZone > &_moveList=QList< MoveCard_ToZone >())
Construct a new SideboardPlan.
Definition deck_list.cpp:24
bool readElement(QXmlStreamReader *xml)
Read a SideboardPlan from an XML stream.
Definition deck_list.cpp:34
QString getName() const
Definition deck_list.h:75
Defines the InnerDecklistNode class, which represents structural nodes (zones and groups) in the deck...
Definition card_ref.h:14