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