1 #ifndef DECKLISTMODEL_H
2 #define DECKLISTMODEL_H
3 
4 #include "decklist.h"
5 
6 #include <QAbstractItemModel>
7 #include <QList>
8 
9 class DeckLoader;
10 class CardDatabase;
11 class QPrinter;
12 class QTextCursor;
13 
14 class DecklistModelCardNode : public AbstractDecklistCardNode
15 {
16 private:
17     DecklistCardNode *dataNode;
18 
19 public:
DecklistModelCardNode(DecklistCardNode * _dataNode,InnerDecklistNode * _parent)20     DecklistModelCardNode(DecklistCardNode *_dataNode, InnerDecklistNode *_parent)
21         : AbstractDecklistCardNode(_parent), dataNode(_dataNode)
22     {
23     }
getNumber()24     int getNumber() const override
25     {
26         return dataNode->getNumber();
27     }
setNumber(int _number)28     void setNumber(int _number) override
29     {
30         dataNode->setNumber(_number);
31     }
getName()32     QString getName() const override
33     {
34         return dataNode->getName();
35     }
setName(const QString & _name)36     void setName(const QString &_name) override
37     {
38         dataNode->setName(_name);
39     }
getDataNode()40     DecklistCardNode *getDataNode() const
41     {
42         return dataNode;
43     }
44 };
45 
46 class DeckListModel : public QAbstractItemModel
47 {
48     Q_OBJECT
49 private slots:
50     void rebuildTree();
51 public slots:
52     void printDeckList(QPrinter *printer);
53 signals:
54     void deckHashChanged();
55 
56 public:
57     explicit DeckListModel(QObject *parent = nullptr);
58     ~DeckListModel() override;
59     int rowCount(const QModelIndex &parent) const override;
60     int columnCount(const QModelIndex & /*parent*/ = QModelIndex()) const override;
61     QVariant data(const QModelIndex &index, int role) const override;
62     QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
63     QModelIndex index(int row, int column, const QModelIndex &parent) const override;
64     QModelIndex parent(const QModelIndex &index) const override;
65     Qt::ItemFlags flags(const QModelIndex &index) const override;
66     bool setData(const QModelIndex &index, const QVariant &value, int role) override;
67     bool removeRows(int row, int count, const QModelIndex &parent) override;
68     QModelIndex findCard(const QString &cardName, const QString &zoneName) const;
69     QModelIndex addCard(const QString &cardName, const QString &zoneName, bool abAddAnyway = false);
70     void sort(int column, Qt::SortOrder order) override;
71     void cleanList();
getDeckList()72     DeckLoader *getDeckList() const
73     {
74         return deckList;
75     }
76     void setDeckList(DeckLoader *_deck);
77 
78 private:
79     DeckLoader *deckList;
80     InnerDecklistNode *root;
81     int lastKnownColumn;
82     Qt::SortOrder lastKnownOrder;
83     InnerDecklistNode *createNodeIfNeeded(const QString &name, InnerDecklistNode *parent);
84     QModelIndex nodeToIndex(AbstractDecklistNode *node) const;
85     DecklistModelCardNode *findCardNode(const QString &cardName, const QString &zoneName) const;
86     void emitRecursiveUpdates(const QModelIndex &index);
87     void sortHelper(InnerDecklistNode *node, Qt::SortOrder order);
88 
89     void printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node);
90 
getNode(const QModelIndex & index)91     template <typename T> T getNode(const QModelIndex &index) const
92     {
93         if (!index.isValid())
94             return dynamic_cast<T>(root);
95         return dynamic_cast<T>(static_cast<AbstractDecklistNode *>(index.internalPointer()));
96     }
97 };
98 
99 #endif
100