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_model.h
Go to the documentation of this file.
1#ifndef DECKLISTMODEL_H
2#define DECKLISTMODEL_H
3
4#include <QAbstractItemModel>
5#include <QList>
10
11class CardDatabase;
12class QPrinter;
13class QTextCursor;
14
21namespace DeckRoles
22{
29enum
30{
31 IsCardRole = Qt::UserRole + 1,
34};
35} // namespace DeckRoles
36
44{
49enum
50{
56};
57} // namespace DeckListModelColumns
58
66{
77static inline QString toString(Type t)
78{
79 switch (t) {
80 case MAIN_TYPE:
81 return "Main Type";
82 case MANA_COST:
83 return "Mana Cost";
84 case COLOR:
85 return "Colors";
86 }
87 return {};
88}
89
90static inline Type fromString(const QString &s)
91{
92 if (s == "Main Type")
93 return MAIN_TYPE;
94 if (s == "Mana Cost")
95 return MANA_COST;
96 if (s == "Colors")
97 return COLOR;
98 return MAIN_TYPE; // default
99}
100} // namespace DeckListModelGroupCriteria
101
112{
113private:
115
116public:
123 DecklistModelCardNode(DecklistCardNode *_dataNode, InnerDecklistNode *_parent, int position = -1)
124 : AbstractDecklistCardNode(_parent, position), dataNode(_dataNode)
125 {
126 }
127 [[nodiscard]] int getNumber() const override
128 {
129 return dataNode->getNumber();
130 }
131 void setNumber(int _number) override
132 {
133 dataNode->setNumber(_number);
134 }
135 [[nodiscard]] QString getName() const override
136 {
137 return dataNode->getName();
138 }
139 void setName(const QString &_name) override
140 {
141 dataNode->setName(_name);
142 }
143 [[nodiscard]] QString getCardProviderId() const override
144 {
145 return dataNode->getCardProviderId();
146 }
147 void setCardProviderId(const QString &_cardProviderId) override
148 {
149 dataNode->setCardProviderId(_cardProviderId);
150 }
151 [[nodiscard]] QString getCardSetShortName() const override
152 {
153 return dataNode->getCardSetShortName();
154 }
155 void setCardSetShortName(const QString &_cardSetShortName) override
156 {
157 dataNode->setCardSetShortName(_cardSetShortName);
158 }
159 [[nodiscard]] QString getCardCollectorNumber() const override
160 {
161 return dataNode->getCardCollectorNumber();
162 }
163 void setCardCollectorNumber(const QString &_cardSetNumber) override
164 {
165 dataNode->setCardCollectorNumber(_cardSetNumber);
166 }
167
172 [[nodiscard]] DecklistCardNode *getDataNode() const
173 {
174 return dataNode;
175 }
176 [[nodiscard]] bool isDeckHeader() const override
177 {
178 return false;
179 }
180};
181
199class DeckListModel : public QAbstractItemModel
200{
201 Q_OBJECT
202
203public slots:
210 void rebuildTree();
211
212signals:
217
218public:
219 explicit DeckListModel(QObject *parent = nullptr);
220 ~DeckListModel() override;
221
226 [[nodiscard]] QModelIndex getRoot() const
227 {
228 return nodeToIndex(root);
229 }
230
236 [[nodiscard]] QString getGroupCriteriaForCard(CardInfoPtr info) const;
237
238 // Qt model overrides
239 [[nodiscard]] int rowCount(const QModelIndex &parent) const override;
240 [[nodiscard]] int columnCount(const QModelIndex & /*parent*/ = QModelIndex()) const override;
241 [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override;
242 void emitBackgroundUpdates(const QModelIndex &parent);
243 [[nodiscard]] QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
244 [[nodiscard]] QModelIndex index(int row, int column, const QModelIndex &parent) const override;
245 [[nodiscard]] QModelIndex parent(const QModelIndex &index) const override;
246 [[nodiscard]] Qt::ItemFlags flags(const QModelIndex &index) const override;
247 bool setData(const QModelIndex &index, const QVariant &value, int role) override;
248 bool removeRows(int row, int count, const QModelIndex &parent) override;
249
258 [[nodiscard]] QModelIndex findCard(const QString &cardName,
259 const QString &zoneName,
260 const QString &providerId = "",
261 const QString &cardNumber = "") const;
262
271 QModelIndex addPreferredPrintingCard(const QString &cardName, const QString &zoneName, bool abAddAnyway);
272
279 QModelIndex addCard(const ExactCard &card, const QString &zoneName);
280
288
289 void sort(int column, Qt::SortOrder order) override;
290
294 void cleanList();
295 [[nodiscard]] DeckList *getDeckList() const
296 {
297 return deckList;
298 }
299 void setDeckList(DeckList *_deck);
300
301 [[nodiscard]] QList<ExactCard> getCards() const;
302 [[nodiscard]] QList<ExactCard> getCardsForZone(const QString &zoneName) const;
303 [[nodiscard]] QList<QString> *getZones() const;
304
310
311private:
316 Qt::SortOrder lastKnownOrder;
317
319 QModelIndex nodeToIndex(AbstractDecklistNode *node) const;
320 [[nodiscard]] DecklistModelCardNode *findCardNode(const QString &cardName,
321 const QString &zoneName,
322 const QString &providerId = "",
323 const QString &cardNumber = "") const;
324 void emitRecursiveUpdates(const QModelIndex &index);
325 void sortHelper(InnerDecklistNode *node, Qt::SortOrder order);
326
327 template <typename T> T getNode(const QModelIndex &index) const
328 {
329 if (!index.isValid())
330 return dynamic_cast<T>(root);
331 return dynamic_cast<T>(static_cast<AbstractDecklistNode *>(index.internalPointer()));
332 }
333};
334
335#endif
Defines the AbstractDecklistCardNode base class, which adds card-specific behavior on top of Abstract...
QSharedPointer< CardInfo > CardInfoPtr
Definition card_info.cpp:20
AbstractDecklistCardNode(InnerDecklistNode *_parent=nullptr, int position=-1)
Construct a new AbstractDecklistCardNode.
Definition abstract_deck_list_card_node.h:56
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
void rebuildTree()
Rebuilds the model tree from the underlying DeckLoader.
Definition deck_list_model.cpp:36
int findSortedInsertRow(InnerDecklistNode *parent, CardInfoPtr cardInfo) const
Determines the sorted insertion row for a card.
Definition deck_list_model.cpp:431
DeckList * deckList
Definition deck_list_model.h:312
QModelIndex findCard(const QString &cardName, const QString &zoneName, const QString &providerId="", const QString &cardNumber="") const
Finds a card by name, zone, and optional identifiers.
Definition deck_list_model.cpp:358
void cleanList()
Removes all cards and resets the model.
Definition deck_list_model.cpp:530
QVariant data(const QModelIndex &index, int role) const override
Definition deck_list_model.cpp:87
void deckHashChanged()
Emitted whenever the deck hash changes due to modifications in the model.
QList< ExactCard > getCardsForZone(const QString &zoneName) const
Definition deck_list_model.cpp:578
Qt::ItemFlags flags(const QModelIndex &index) const override
Definition deck_list_model.cpp:236
T getNode(const QModelIndex &index) const
Definition deck_list_model.h:327
QModelIndex getRoot() const
Returns the root index of the model.
Definition deck_list_model.h:226
void emitRecursiveUpdates(const QModelIndex &index)
Definition deck_list_model.cpp:248
void sortHelper(InnerDecklistNode *node, Qt::SortOrder order)
Definition deck_list_model.cpp:473
int rowCount(const QModelIndex &parent) const override
Definition deck_list_model.cpp:71
bool removeRows(int row, int count, const QModelIndex &parent) override
Definition deck_list_model.cpp:292
int columnCount(const QModelIndex &=QModelIndex()) const override
Definition deck_list_model.cpp:82
QModelIndex index(int row, int column, const QModelIndex &parent) const override
Definition deck_list_model.cpp:216
int lastKnownColumn
Definition deck_list_model.h:315
QModelIndex nodeToIndex(AbstractDecklistNode *node) const
Definition deck_list_model.cpp:464
Qt::SortOrder lastKnownOrder
Definition deck_list_model.h:316
void emitBackgroundUpdates(const QModelIndex &parent)
Definition deck_list_model.cpp:174
DeckListModel(QObject *parent=nullptr)
Definition deck_list_model.cpp:5
void setDeckList(DeckList *_deck)
Definition deck_list_model.cpp:538
QModelIndex addPreferredPrintingCard(const QString &cardName, const QString &zoneName, bool abAddAnyway)
Adds a card using the preferred printing if available.
Definition deck_list_model.cpp:371
void setActiveGroupCriteria(DeckListModelGroupCriteria::Type newCriteria)
Sets the criteria used to group cards in the model.
Definition deck_list_model.cpp:524
void sort(int column, Qt::SortOrder order) override
Definition deck_list_model.cpp:501
QString getGroupCriteriaForCard(CardInfoPtr info) const
Returns the value of the grouping category for a card based on the current criteria.
Definition deck_list_model.cpp:18
~DeckListModel() override
Definition deck_list_model.cpp:13
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
Definition deck_list_model.cpp:190
QModelIndex parent(const QModelIndex &index) const override
Definition deck_list_model.cpp:227
QModelIndex addCard(const ExactCard &card, const QString &zoneName)
Adds an ExactCard to the specified zone.
Definition deck_list_model.cpp:390
DecklistModelCardNode * findCardNode(const QString &cardName, const QString &zoneName, const QString &providerId="", const QString &cardNumber="") const
Definition deck_list_model.cpp:333
InnerDecklistNode * createNodeIfNeeded(const QString &name, InnerDecklistNode *parent)
Definition deck_list_model.cpp:322
InnerDecklistNode * root
Definition deck_list_model.h:313
DeckList * getDeckList() const
Definition deck_list_model.h:295
QList< ExactCard > getCards() const
Definition deck_list_model.cpp:546
DeckListModelGroupCriteria::Type activeGroupCriteria
Definition deck_list_model.h:314
bool setData(const QModelIndex &index, const QVariant &value, int role) override
Definition deck_list_model.cpp:258
QList< QString > * getZones() const
Definition deck_list_model.cpp:612
Represents a complete deck, including metadata, zones, cards, and sideboard plans.
Definition deck_list.h:127
Concrete node type representing an actual card entry in the deck.
Definition deck_list_card_node.h:48
Adapter node that wraps a DecklistCardNode for use in the DeckListModel tree.
Definition deck_list_model.h:112
DecklistCardNode * dataNode
Definition deck_list_model.h:114
void setName(const QString &_name) override
Definition deck_list_model.h:139
void setCardCollectorNumber(const QString &_cardSetNumber) override
Definition deck_list_model.h:163
void setCardProviderId(const QString &_cardProviderId) override
Definition deck_list_model.h:147
DecklistModelCardNode(DecklistCardNode *_dataNode, InnerDecklistNode *_parent, int position=-1)
Constructs a model node wrapping a DecklistCardNode.
Definition deck_list_model.h:123
QString getCardSetShortName() const override
Definition deck_list_model.h:151
void setNumber(int _number) override
Definition deck_list_model.h:131
QString getCardProviderId() const override
Definition deck_list_model.h:143
QString getName() const override
Definition deck_list_model.h:135
QString getCardCollectorNumber() const override
Definition deck_list_model.h:159
DecklistCardNode * getDataNode() const
Returns the underlying data node.
Definition deck_list_model.h:172
bool isDeckHeader() const override
Whether this node is the "deck header" (deck metadata).
Definition deck_list_model.h:176
int getNumber() const override
Definition deck_list_model.h:127
void setCardSetShortName(const QString &_cardSetShortName) override
Definition deck_list_model.h:155
Represents a specific card instance, defined by its CardInfo and a particular printing.
Definition exact_card.h:19
Represents a container node in the deck list hierarchy (zones and groupings).
Definition inner_deck_list_node.h:62
Defines the DecklistCardNode class, representing a single card entry in the deck list tree.
Column indices for the DeckListModel.
@ CARD_AMOUNT
Definition deck_list_model.h:51
@ CARD_SET
Definition deck_list_model.h:53
@ CARD_PROVIDER_ID
Definition deck_list_model.h:55
@ CARD_COLLECTOR_NUMBER
Definition deck_list_model.h:54
@ CARD_NAME
Definition deck_list_model.h:52
Specifies criteria used to group cards in the DeckListModel.
static QString toString(Type t)
Definition deck_list_model.h:77
static Type fromString(const QString &s)
Definition deck_list_model.h:90
Type
Definition deck_list_model.h:72
@ MAIN_TYPE
Definition deck_list_model.h:73
@ COLOR
Definition deck_list_model.h:75
@ MANA_COST
Definition deck_list_model.h:74
Custom model roles used by the DeckListModel for data retrieval.
@ IsLegalRole
Definition deck_list_model.h:33
@ DepthRole
Definition deck_list_model.h:32
@ IsCardRole
Definition deck_list_model.h:31