mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-30 10:33:54 -07:00
[Card DB Models] Move refactor (#6172)
* Refactor CardDatabaseDisplayModel, TokenDisplayModel and TokenEditModel out of CardDatabaseModel. Move every model into an appropriate folder. Took 54 minutes * No folder for database models. Took 6 minutes --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
217646f031
commit
23612ba6ec
25 changed files with 315 additions and 281 deletions
|
|
@ -21,11 +21,14 @@ set(cockatrice_SOURCES
|
||||||
src/client/sound_engine.cpp
|
src/client/sound_engine.cpp
|
||||||
src/client/tapped_out_interface.cpp
|
src/client/tapped_out_interface.cpp
|
||||||
src/client/update_downloader.cpp
|
src/client/update_downloader.cpp
|
||||||
src/database/card_completer_proxy_model.cpp
|
|
||||||
src/database/card_database.cpp
|
src/database/card_database.cpp
|
||||||
src/database/card_database_manager.cpp
|
src/database/card_database_manager.cpp
|
||||||
src/database/card_database_model.cpp
|
src/database/model/card_database_model.cpp
|
||||||
src/database/card_search_model.cpp
|
src/database/model/card_database_display_model.cpp
|
||||||
|
src/database/model/card/card_completer_proxy_model.cpp
|
||||||
|
src/database/model/card/card_search_model.cpp
|
||||||
|
src/database/model/token/token_display_model.cpp
|
||||||
|
src/database/model/token/token_edit_model.cpp
|
||||||
src/database/parser/card_database_parser.cpp
|
src/database/parser/card_database_parser.cpp
|
||||||
src/database/parser/cockatrice_xml_3.cpp
|
src/database/parser/cockatrice_xml_3.cpp
|
||||||
src/database/parser/cockatrice_xml_4.cpp
|
src/database/parser/cockatrice_xml_4.cpp
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#include "card_search_model.h"
|
#include "card_search_model.h"
|
||||||
|
|
||||||
#include "../utility/levenshtein.h"
|
#include "../../../utility/levenshtein.h"
|
||||||
|
#include "../card_database_model.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef CARD_SEARCH_MODEL_H
|
#ifndef CARD_SEARCH_MODEL_H
|
||||||
#define CARD_SEARCH_MODEL_H
|
#define CARD_SEARCH_MODEL_H
|
||||||
|
|
||||||
#include "card_database_model.h"
|
#include "../card_database_display_model.h"
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
#include <QAbstractListModel>
|
||||||
|
|
||||||
|
|
@ -1,157 +1,7 @@
|
||||||
|
#include "card_database_display_model.h"
|
||||||
|
|
||||||
#include "card_database_model.h"
|
#include "card_database_model.h"
|
||||||
|
|
||||||
#include "../filters/filter_tree.h"
|
|
||||||
|
|
||||||
#include <QMap>
|
|
||||||
|
|
||||||
#define CARDDBMODEL_COLUMNS 6
|
|
||||||
|
|
||||||
CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent)
|
|
||||||
: QAbstractListModel(parent), db(_db), showOnlyCardsFromEnabledSets(_showOnlyCardsFromEnabledSets)
|
|
||||||
{
|
|
||||||
connect(db, &CardDatabase::cardAdded, this, &CardDatabaseModel::cardAdded);
|
|
||||||
connect(db, &CardDatabase::cardRemoved, this, &CardDatabaseModel::cardRemoved);
|
|
||||||
connect(db, &CardDatabase::cardDatabaseEnabledSetsChanged, this,
|
|
||||||
&CardDatabaseModel::cardDatabaseEnabledSetsChanged);
|
|
||||||
|
|
||||||
cardDatabaseEnabledSetsChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
CardDatabaseModel::~CardDatabaseModel() = default;
|
|
||||||
|
|
||||||
QMap<wchar_t, wchar_t> CardDatabaseDisplayModel::characterTranslation = {{L'“', L'\"'},
|
|
||||||
{L'”', L'\"'},
|
|
||||||
{L'‘', L'\''},
|
|
||||||
{L'’', L'\''}};
|
|
||||||
|
|
||||||
int CardDatabaseModel::rowCount(const QModelIndex & /*parent*/) const
|
|
||||||
{
|
|
||||||
return cardList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
int CardDatabaseModel::columnCount(const QModelIndex & /*parent*/) const
|
|
||||||
{
|
|
||||||
return CARDDBMODEL_COLUMNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant CardDatabaseModel::data(const QModelIndex &index, int role) const
|
|
||||||
{
|
|
||||||
if (!index.isValid() || index.row() >= cardList.size() || index.column() >= CARDDBMODEL_COLUMNS ||
|
|
||||||
(role != Qt::DisplayRole && role != SortRole))
|
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
CardInfoPtr card = cardList.at(index.row());
|
|
||||||
switch (index.column()) {
|
|
||||||
case NameColumn:
|
|
||||||
return card->getName();
|
|
||||||
case SetListColumn:
|
|
||||||
return card->getSetsNames();
|
|
||||||
case ManaCostColumn:
|
|
||||||
return role == SortRole ? QString("%1%2").arg(card->getCmc(), 4, QChar('0')).arg(card->getManaCost())
|
|
||||||
: card->getManaCost();
|
|
||||||
case CardTypeColumn:
|
|
||||||
return card->getCardType();
|
|
||||||
case PTColumn:
|
|
||||||
return card->getPowTough();
|
|
||||||
case ColorColumn:
|
|
||||||
return card->getColors();
|
|
||||||
default:
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant CardDatabaseModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
||||||
{
|
|
||||||
if (role != Qt::DisplayRole)
|
|
||||||
return QVariant();
|
|
||||||
if (orientation != Qt::Horizontal)
|
|
||||||
return QVariant();
|
|
||||||
switch (section) {
|
|
||||||
case NameColumn:
|
|
||||||
return QString(tr("Name"));
|
|
||||||
case SetListColumn:
|
|
||||||
return QString(tr("Sets"));
|
|
||||||
case ManaCostColumn:
|
|
||||||
return QString(tr("Mana cost"));
|
|
||||||
case CardTypeColumn:
|
|
||||||
return QString(tr("Card type"));
|
|
||||||
case PTColumn:
|
|
||||||
return QString(tr("P/T"));
|
|
||||||
case ColorColumn:
|
|
||||||
return QString(tr("Color(s)"));
|
|
||||||
default:
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardDatabaseModel::cardInfoChanged(CardInfoPtr card)
|
|
||||||
{
|
|
||||||
const int row = cardList.indexOf(card);
|
|
||||||
if (row == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfoPtr card)
|
|
||||||
{
|
|
||||||
if (!showOnlyCardsFromEnabledSets)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
for (const auto &printings : card->getSets()) {
|
|
||||||
for (const auto &printing : printings) {
|
|
||||||
if (printing.getSet()->getEnabled())
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardDatabaseModel::cardDatabaseEnabledSetsChanged()
|
|
||||||
{
|
|
||||||
// remove all the cards no more present in at least one enabled set
|
|
||||||
for (const CardInfoPtr &card : cardList) {
|
|
||||||
if (!checkCardHasAtLeastOneEnabledSet(card)) {
|
|
||||||
cardRemoved(card);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// re-check all the card currently not shown, maybe their part of a newly-enabled set
|
|
||||||
for (const CardInfoPtr &card : db->getCardList()) {
|
|
||||||
if (!cardListSet.contains(card)) {
|
|
||||||
cardAdded(card);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardDatabaseModel::cardAdded(CardInfoPtr card)
|
|
||||||
{
|
|
||||||
if (checkCardHasAtLeastOneEnabledSet(card)) {
|
|
||||||
// add the card if it's present in at least one enabled set
|
|
||||||
beginInsertRows(QModelIndex(), cardList.size(), cardList.size());
|
|
||||||
cardList.append(card);
|
|
||||||
cardListSet.insert(card);
|
|
||||||
connect(card.data(), &CardInfo::cardInfoChanged, this, &CardDatabaseModel::cardInfoChanged);
|
|
||||||
endInsertRows();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardDatabaseModel::cardRemoved(CardInfoPtr card)
|
|
||||||
{
|
|
||||||
const int row = cardList.indexOf(card);
|
|
||||||
if (row == -1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
beginRemoveRows(QModelIndex(), row, row);
|
|
||||||
disconnect(card.data(), nullptr, this, nullptr);
|
|
||||||
cardListSet.remove(card);
|
|
||||||
card.clear();
|
|
||||||
cardList.removeAt(row);
|
|
||||||
endRemoveRows();
|
|
||||||
}
|
|
||||||
|
|
||||||
CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent)
|
CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent)
|
||||||
: QSortFilterProxyModel(parent), isToken(ShowAll), filterString(nullptr)
|
: QSortFilterProxyModel(parent), isToken(ShowAll), filterString(nullptr)
|
||||||
{
|
{
|
||||||
|
|
@ -165,6 +15,11 @@ CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent)
|
||||||
loadedRowCount = 0;
|
loadedRowCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QMap<wchar_t, wchar_t> CardDatabaseDisplayModel::characterTranslation = {{L'“', L'\"'},
|
||||||
|
{L'”', L'\"'},
|
||||||
|
{L'‘', L'\''},
|
||||||
|
{L'’', L'\''}};
|
||||||
|
|
||||||
bool CardDatabaseDisplayModel::canFetchMore(const QModelIndex &index) const
|
bool CardDatabaseDisplayModel::canFetchMore(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
return loadedRowCount < sourceModel()->rowCount(index);
|
return loadedRowCount < sourceModel()->rowCount(index);
|
||||||
|
|
@ -362,36 +217,4 @@ const QString CardDatabaseDisplayModel::sanitizeCardName(const QString &dirtyNam
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return QString::fromStdWString(toReturn);
|
return QString::fromStdWString(toReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenDisplayModel::TokenDisplayModel(QObject *parent) : CardDatabaseDisplayModel(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TokenDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
|
|
||||||
{
|
|
||||||
CardInfoPtr info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
|
|
||||||
return info->getIsToken() && rowMatchesCardName(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TokenDisplayModel::rowCount(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
// always load all tokens at start
|
|
||||||
return QSortFilterProxyModel::rowCount(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
TokenEditModel::TokenEditModel(QObject *parent) : CardDatabaseDisplayModel(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TokenEditModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
|
|
||||||
{
|
|
||||||
CardInfoPtr info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
|
|
||||||
return info->getIsToken() && info->getSets().contains(CardSet::TOKENS_SETNAME) && rowMatchesCardName(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TokenEditModel::rowCount(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
// always load all tokens at start
|
|
||||||
return QSortFilterProxyModel::rowCount(parent);
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +1,14 @@
|
||||||
#ifndef CARDDATABASEMODEL_H
|
#ifndef COCKATRICE_CARD_DATABASE_DISPLAY_MODEL_H
|
||||||
#define CARDDATABASEMODEL_H
|
#define COCKATRICE_CARD_DATABASE_DISPLAY_MODEL_H
|
||||||
|
|
||||||
#include "../filters/filter_string.h"
|
#include "../../filters/filter_string.h"
|
||||||
#include "card_database.h"
|
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
class FilterTree;
|
class FilterTree;
|
||||||
|
|
||||||
class CardDatabaseModel : public QAbstractListModel
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
enum Columns
|
|
||||||
{
|
|
||||||
NameColumn,
|
|
||||||
SetListColumn,
|
|
||||||
ManaCostColumn,
|
|
||||||
PTColumn,
|
|
||||||
CardTypeColumn,
|
|
||||||
ColorColumn
|
|
||||||
};
|
|
||||||
enum Role
|
|
||||||
{
|
|
||||||
SortRole = Qt::UserRole
|
|
||||||
};
|
|
||||||
CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent = nullptr);
|
|
||||||
~CardDatabaseModel() override;
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
||||||
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
||||||
QVariant data(const QModelIndex &index, int role) const override;
|
|
||||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
|
||||||
CardDatabase *getDatabase() const
|
|
||||||
{
|
|
||||||
return db;
|
|
||||||
}
|
|
||||||
CardInfoPtr getCard(int index) const
|
|
||||||
{
|
|
||||||
return cardList[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QList<CardInfoPtr> cardList;
|
|
||||||
QSet<CardInfoPtr> cardListSet; // Supports faster lookups in cardDatabaseEnabledSetsChanged()
|
|
||||||
CardDatabase *db;
|
|
||||||
bool showOnlyCardsFromEnabledSets;
|
|
||||||
|
|
||||||
inline bool checkCardHasAtLeastOneEnabledSet(CardInfoPtr card);
|
|
||||||
private slots:
|
|
||||||
void cardAdded(CardInfoPtr card);
|
|
||||||
void cardRemoved(CardInfoPtr card);
|
|
||||||
void cardInfoChanged(CardInfoPtr card);
|
|
||||||
void cardDatabaseEnabledSetsChanged();
|
|
||||||
};
|
|
||||||
|
|
||||||
class CardDatabaseDisplayModel : public QSortFilterProxyModel
|
class CardDatabaseDisplayModel : public QSortFilterProxyModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
@ -138,26 +89,4 @@ private slots:
|
||||||
const QString sanitizeCardName(const QString &dirtyName, const QMap<wchar_t, wchar_t> &table);
|
const QString sanitizeCardName(const QString &dirtyName, const QMap<wchar_t, wchar_t> &table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class TokenDisplayModel : public CardDatabaseDisplayModel
|
#endif // COCKATRICE_CARD_DATABASE_DISPLAY_MODEL_H
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit TokenDisplayModel(QObject *parent = nullptr);
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TokenEditModel : public CardDatabaseDisplayModel
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit TokenEditModel(QObject *parent = nullptr);
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
146
cockatrice/src/database/model/card_database_model.cpp
Normal file
146
cockatrice/src/database/model/card_database_model.cpp
Normal file
|
|
@ -0,0 +1,146 @@
|
||||||
|
#include "card_database_model.h"
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
#define CARDDBMODEL_COLUMNS 6
|
||||||
|
|
||||||
|
CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent)
|
||||||
|
: QAbstractListModel(parent), db(_db), showOnlyCardsFromEnabledSets(_showOnlyCardsFromEnabledSets)
|
||||||
|
{
|
||||||
|
connect(db, &CardDatabase::cardAdded, this, &CardDatabaseModel::cardAdded);
|
||||||
|
connect(db, &CardDatabase::cardRemoved, this, &CardDatabaseModel::cardRemoved);
|
||||||
|
connect(db, &CardDatabase::cardDatabaseEnabledSetsChanged, this,
|
||||||
|
&CardDatabaseModel::cardDatabaseEnabledSetsChanged);
|
||||||
|
|
||||||
|
cardDatabaseEnabledSetsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
CardDatabaseModel::~CardDatabaseModel() = default;
|
||||||
|
|
||||||
|
int CardDatabaseModel::rowCount(const QModelIndex & /*parent*/) const
|
||||||
|
{
|
||||||
|
return cardList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int CardDatabaseModel::columnCount(const QModelIndex & /*parent*/) const
|
||||||
|
{
|
||||||
|
return CARDDBMODEL_COLUMNS;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CardDatabaseModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() >= cardList.size() || index.column() >= CARDDBMODEL_COLUMNS ||
|
||||||
|
(role != Qt::DisplayRole && role != SortRole))
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
CardInfoPtr card = cardList.at(index.row());
|
||||||
|
switch (index.column()) {
|
||||||
|
case NameColumn:
|
||||||
|
return card->getName();
|
||||||
|
case SetListColumn:
|
||||||
|
return card->getSetsNames();
|
||||||
|
case ManaCostColumn:
|
||||||
|
return role == SortRole ? QString("%1%2").arg(card->getCmc(), 4, QChar('0')).arg(card->getManaCost())
|
||||||
|
: card->getManaCost();
|
||||||
|
case CardTypeColumn:
|
||||||
|
return card->getCardType();
|
||||||
|
case PTColumn:
|
||||||
|
return card->getPowTough();
|
||||||
|
case ColorColumn:
|
||||||
|
return card->getColors();
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CardDatabaseModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
if (role != Qt::DisplayRole)
|
||||||
|
return QVariant();
|
||||||
|
if (orientation != Qt::Horizontal)
|
||||||
|
return QVariant();
|
||||||
|
switch (section) {
|
||||||
|
case NameColumn:
|
||||||
|
return QString(tr("Name"));
|
||||||
|
case SetListColumn:
|
||||||
|
return QString(tr("Sets"));
|
||||||
|
case ManaCostColumn:
|
||||||
|
return QString(tr("Mana cost"));
|
||||||
|
case CardTypeColumn:
|
||||||
|
return QString(tr("Card type"));
|
||||||
|
case PTColumn:
|
||||||
|
return QString(tr("P/T"));
|
||||||
|
case ColorColumn:
|
||||||
|
return QString(tr("Color(s)"));
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CardDatabaseModel::cardInfoChanged(CardInfoPtr card)
|
||||||
|
{
|
||||||
|
const int row = cardList.indexOf(card);
|
||||||
|
if (row == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfoPtr card)
|
||||||
|
{
|
||||||
|
if (!showOnlyCardsFromEnabledSets)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (const auto &printings : card->getSets()) {
|
||||||
|
for (const auto &printing : printings) {
|
||||||
|
if (printing.getSet()->getEnabled())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CardDatabaseModel::cardDatabaseEnabledSetsChanged()
|
||||||
|
{
|
||||||
|
// remove all the cards no more present in at least one enabled set
|
||||||
|
for (const CardInfoPtr &card : cardList) {
|
||||||
|
if (!checkCardHasAtLeastOneEnabledSet(card)) {
|
||||||
|
cardRemoved(card);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// re-check all the card currently not shown, maybe their part of a newly-enabled set
|
||||||
|
for (const CardInfoPtr &card : db->getCardList()) {
|
||||||
|
if (!cardListSet.contains(card)) {
|
||||||
|
cardAdded(card);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CardDatabaseModel::cardAdded(CardInfoPtr card)
|
||||||
|
{
|
||||||
|
if (checkCardHasAtLeastOneEnabledSet(card)) {
|
||||||
|
// add the card if it's present in at least one enabled set
|
||||||
|
beginInsertRows(QModelIndex(), cardList.size(), cardList.size());
|
||||||
|
cardList.append(card);
|
||||||
|
cardListSet.insert(card);
|
||||||
|
connect(card.data(), &CardInfo::cardInfoChanged, this, &CardDatabaseModel::cardInfoChanged);
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CardDatabaseModel::cardRemoved(CardInfoPtr card)
|
||||||
|
{
|
||||||
|
const int row = cardList.indexOf(card);
|
||||||
|
if (row == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
beginRemoveRows(QModelIndex(), row, row);
|
||||||
|
disconnect(card.data(), nullptr, this, nullptr);
|
||||||
|
cardListSet.remove(card);
|
||||||
|
card.clear();
|
||||||
|
cardList.removeAt(row);
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
56
cockatrice/src/database/model/card_database_model.h
Normal file
56
cockatrice/src/database/model/card_database_model.h
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef CARDDATABASEMODEL_H
|
||||||
|
#define CARDDATABASEMODEL_H
|
||||||
|
|
||||||
|
#include "../card_database.h"
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
#include <QList>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
|
class CardDatabaseModel : public QAbstractListModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
enum Columns
|
||||||
|
{
|
||||||
|
NameColumn,
|
||||||
|
SetListColumn,
|
||||||
|
ManaCostColumn,
|
||||||
|
PTColumn,
|
||||||
|
CardTypeColumn,
|
||||||
|
ColorColumn
|
||||||
|
};
|
||||||
|
enum Role
|
||||||
|
{
|
||||||
|
SortRole = Qt::UserRole
|
||||||
|
};
|
||||||
|
CardDatabaseModel(CardDatabase *_db, bool _showOnlyCardsFromEnabledSets, QObject *parent = nullptr);
|
||||||
|
~CardDatabaseModel() override;
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
QVariant data(const QModelIndex &index, int role) const override;
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||||
|
CardDatabase *getDatabase() const
|
||||||
|
{
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
CardInfoPtr getCard(int index) const
|
||||||
|
{
|
||||||
|
return cardList[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<CardInfoPtr> cardList;
|
||||||
|
QSet<CardInfoPtr> cardListSet; // Supports faster lookups in cardDatabaseEnabledSetsChanged()
|
||||||
|
CardDatabase *db;
|
||||||
|
bool showOnlyCardsFromEnabledSets;
|
||||||
|
|
||||||
|
inline bool checkCardHasAtLeastOneEnabledSet(CardInfoPtr card);
|
||||||
|
private slots:
|
||||||
|
void cardAdded(CardInfoPtr card);
|
||||||
|
void cardRemoved(CardInfoPtr card);
|
||||||
|
void cardInfoChanged(CardInfoPtr card);
|
||||||
|
void cardDatabaseEnabledSetsChanged();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
19
cockatrice/src/database/model/token/token_display_model.cpp
Normal file
19
cockatrice/src/database/model/token/token_display_model.cpp
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#include "token_display_model.h"
|
||||||
|
|
||||||
|
#include "../card_database_model.h"
|
||||||
|
|
||||||
|
TokenDisplayModel::TokenDisplayModel(QObject *parent) : CardDatabaseDisplayModel(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TokenDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
|
||||||
|
{
|
||||||
|
CardInfoPtr info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
|
||||||
|
return info->getIsToken() && rowMatchesCardName(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TokenDisplayModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
// always load all tokens at start
|
||||||
|
return QSortFilterProxyModel::rowCount(parent);
|
||||||
|
}
|
||||||
17
cockatrice/src/database/model/token/token_display_model.h
Normal file
17
cockatrice/src/database/model/token/token_display_model.h
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef COCKATRICE_TOKEN_DISPLAY_MODEL_H
|
||||||
|
#define COCKATRICE_TOKEN_DISPLAY_MODEL_H
|
||||||
|
|
||||||
|
#include "../card_database_display_model.h"
|
||||||
|
|
||||||
|
class TokenDisplayModel : public CardDatabaseDisplayModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit TokenDisplayModel(QObject *parent = nullptr);
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COCKATRICE_TOKEN_DISPLAY_MODEL_H
|
||||||
19
cockatrice/src/database/model/token/token_edit_model.cpp
Normal file
19
cockatrice/src/database/model/token/token_edit_model.cpp
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#include "token_edit_model.h"
|
||||||
|
|
||||||
|
#include "../card_database_model.h"
|
||||||
|
|
||||||
|
TokenEditModel::TokenEditModel(QObject *parent) : CardDatabaseDisplayModel(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TokenEditModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
|
||||||
|
{
|
||||||
|
CardInfoPtr info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
|
||||||
|
return info->getIsToken() && info->getSets().contains(CardSet::TOKENS_SETNAME) && rowMatchesCardName(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TokenEditModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
// always load all tokens at start
|
||||||
|
return QSortFilterProxyModel::rowCount(parent);
|
||||||
|
}
|
||||||
17
cockatrice/src/database/model/token/token_edit_model.h
Normal file
17
cockatrice/src/database/model/token/token_edit_model.h
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef COCKATRICE_TOKEN_EDIT_MODEL_H
|
||||||
|
#define COCKATRICE_TOKEN_EDIT_MODEL_H
|
||||||
|
|
||||||
|
#include "../card_database_display_model.h"
|
||||||
|
|
||||||
|
class TokenEditModel : public CardDatabaseDisplayModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit TokenEditModel(QObject *parent = nullptr);
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COCKATRICE_TOKEN_EDIT_MODEL_H
|
||||||
|
|
@ -3,7 +3,8 @@
|
||||||
#include "../client/get_text_with_max.h"
|
#include "../client/get_text_with_max.h"
|
||||||
#include "../database/card_database.h"
|
#include "../database/card_database.h"
|
||||||
#include "../database/card_database_manager.h"
|
#include "../database/card_database_manager.h"
|
||||||
#include "../database/card_database_model.h"
|
#include "../database/model/card_database_model.h"
|
||||||
|
#include "../database/model/token/token_edit_model.h"
|
||||||
#include "../main.h"
|
#include "../main.h"
|
||||||
#include "trice_limits.h"
|
#include "trice_limits.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
#include "dlg_create_token.h"
|
#include "dlg_create_token.h"
|
||||||
|
|
||||||
#include "../../database/card_database_manager.h"
|
#include "../../database/card_database_manager.h"
|
||||||
#include "../../database/card_database_model.h"
|
#include "../../database/model/card_database_model.h"
|
||||||
|
#include "../../database/model/token/token_display_model.h"
|
||||||
#include "../../interface/widgets/cards/card_info_picture_widget.h"
|
#include "../../interface/widgets/cards/card_info_picture_widget.h"
|
||||||
#include "../../main.h"
|
#include "../../main.h"
|
||||||
#include "../../settings/cache_settings.h"
|
#include "../../settings/cache_settings.h"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
#ifndef DECK_EDITOR_DATABASE_DISPLAY_WIDGET_H
|
#ifndef DECK_EDITOR_DATABASE_DISPLAY_WIDGET_H
|
||||||
#define DECK_EDITOR_DATABASE_DISPLAY_WIDGET_H
|
#define DECK_EDITOR_DATABASE_DISPLAY_WIDGET_H
|
||||||
|
|
||||||
#include "../../../database/card_database_model.h"
|
#include "../../../database/model/card_database_display_model.h"
|
||||||
|
#include "../../../database/model/card_database_model.h"
|
||||||
#include "../../../deck/custom_line_edit.h"
|
#include "../../../deck/custom_line_edit.h"
|
||||||
#include "../../../tabs/abstract_tab_deck_editor.h"
|
#include "../../../tabs/abstract_tab_deck_editor.h"
|
||||||
#include "../../../utility/key_signals.h"
|
#include "../../../utility/key_signals.h"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "deck_editor_filter_dock_widget.h"
|
#include "deck_editor_filter_dock_widget.h"
|
||||||
|
|
||||||
#include "../../../database/card_database_model.h"
|
#include "../../../database/model/card_database_model.h"
|
||||||
#include "../../../filters/filter_builder.h"
|
#include "../../../filters/filter_builder.h"
|
||||||
#include "../../../filters/filter_tree_model.h"
|
#include "../../../filters/filter_tree_model.h"
|
||||||
#include "../../../settings/cache_settings.h"
|
#include "../../../settings/cache_settings.h"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#define VISUAL_DATABASE_DISPLAY_WIDGET_H
|
#define VISUAL_DATABASE_DISPLAY_WIDGET_H
|
||||||
|
|
||||||
#include "../../../database/card_database.h"
|
#include "../../../database/card_database.h"
|
||||||
#include "../../../database/card_database_model.h"
|
#include "../../../database/model/card_database_model.h"
|
||||||
#include "../../../deck/custom_line_edit.h"
|
#include "../../../deck/custom_line_edit.h"
|
||||||
#include "../../../deck/deck_list_model.h"
|
#include "../../../deck/deck_list_model.h"
|
||||||
#include "../../../filters/filter_tree_model.h"
|
#include "../../../filters/filter_tree_model.h"
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
#include "visual_deck_editor_widget.h"
|
#include "visual_deck_editor_widget.h"
|
||||||
|
|
||||||
#include "../../../database/card_completer_proxy_model.h"
|
|
||||||
#include "../../../database/card_database.h"
|
#include "../../../database/card_database.h"
|
||||||
#include "../../../database/card_database_manager.h"
|
#include "../../../database/card_database_manager.h"
|
||||||
#include "../../../database/card_database_model.h"
|
#include "../../../database/model/card/card_completer_proxy_model.h"
|
||||||
#include "../../../database/card_search_model.h"
|
#include "../../../database/model/card/card_search_model.h"
|
||||||
|
#include "../../../database/model/card_database_model.h"
|
||||||
#include "../../../deck/deck_list_model.h"
|
#include "../../../deck/deck_list_model.h"
|
||||||
#include "../../../deck/deck_loader.h"
|
#include "../../../deck/deck_loader.h"
|
||||||
#include "../../../main.h"
|
#include "../../../main.h"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
#ifndef VISUAL_DECK_EDITOR_H
|
#ifndef VISUAL_DECK_EDITOR_H
|
||||||
#define VISUAL_DECK_EDITOR_H
|
#define VISUAL_DECK_EDITOR_H
|
||||||
|
|
||||||
#include "../../../database/card_completer_proxy_model.h"
|
|
||||||
#include "../../../database/card_database.h"
|
#include "../../../database/card_database.h"
|
||||||
#include "../../../database/card_database_model.h"
|
#include "../../../database/model/card/card_completer_proxy_model.h"
|
||||||
|
#include "../../../database/model/card_database_display_model.h"
|
||||||
|
#include "../../../database/model/card_database_model.h"
|
||||||
#include "../../../deck/deck_list_model.h"
|
#include "../../../deck/deck_list_model.h"
|
||||||
#include "../cards/card_info_picture_with_text_overlay_widget.h"
|
#include "../cards/card_info_picture_with_text_overlay_widget.h"
|
||||||
#include "../cards/card_size_widget.h"
|
#include "../cards/card_size_widget.h"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "../client/tapped_out_interface.h"
|
#include "../client/tapped_out_interface.h"
|
||||||
#include "../database/card_database_manager.h"
|
#include "../database/card_database_manager.h"
|
||||||
#include "../database/card_database_model.h"
|
#include "../database/model/card_database_model.h"
|
||||||
#include "../deck/deck_stats_interface.h"
|
#include "../deck/deck_stats_interface.h"
|
||||||
#include "../dialogs/dlg_load_deck.h"
|
#include "../dialogs/dlg_load_deck.h"
|
||||||
#include "../dialogs/dlg_load_deck_from_clipboard.h"
|
#include "../dialogs/dlg_load_deck_from_clipboard.h"
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#include "tab_edhrec_main.h"
|
#include "tab_edhrec_main.h"
|
||||||
|
|
||||||
#include "../../../database/card_completer_proxy_model.h"
|
|
||||||
#include "../../../database/card_database_manager.h"
|
#include "../../../database/card_database_manager.h"
|
||||||
#include "../../../database/card_search_model.h"
|
#include "../../../database/model/card/card_completer_proxy_model.h"
|
||||||
|
#include "../../../database/model/card/card_search_model.h"
|
||||||
#include "../../tab_supervisor.h"
|
#include "../../tab_supervisor.h"
|
||||||
#include "api_response/average_deck/edhrec_average_deck_api_response.h"
|
#include "api_response/average_deck/edhrec_average_deck_api_response.h"
|
||||||
#include "api_response/commander/edhrec_commander_api_response.h"
|
#include "api_response/commander/edhrec_commander_api_response.h"
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#include "../client/deck_editor_menu.h"
|
#include "../client/deck_editor_menu.h"
|
||||||
#include "../client/tapped_out_interface.h"
|
#include "../client/tapped_out_interface.h"
|
||||||
#include "../database/card_database_manager.h"
|
#include "../database/card_database_manager.h"
|
||||||
#include "../database/card_database_model.h"
|
#include "../database/model/card_database_model.h"
|
||||||
#include "../dialogs/dlg_load_deck.h"
|
#include "../dialogs/dlg_load_deck.h"
|
||||||
#include "../dialogs/dlg_load_deck_from_clipboard.h"
|
#include "../dialogs/dlg_load_deck_from_clipboard.h"
|
||||||
#include "../filters/filter_builder.h"
|
#include "../filters/filter_builder.h"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "tab_deck_editor_visual.h"
|
#include "tab_deck_editor_visual.h"
|
||||||
|
|
||||||
#include "../../database/card_database_model.h"
|
#include "../../database/model/card_database_model.h"
|
||||||
#include "../../deck/deck_list_model.h"
|
#include "../../deck/deck_list_model.h"
|
||||||
#include "../../deck/deck_stats_interface.h"
|
#include "../../deck/deck_stats_interface.h"
|
||||||
#include "../../filters/filter_builder.h"
|
#include "../../filters/filter_builder.h"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "tab_deck_storage_visual.h"
|
#include "tab_deck_storage_visual.h"
|
||||||
|
|
||||||
#include "../../database/card_database_model.h"
|
#include "../../database/model/card_database_model.h"
|
||||||
#include "../../interface/widgets/cards/deck_preview_card_picture_widget.h"
|
#include "../../interface/widgets/cards/deck_preview_card_picture_widget.h"
|
||||||
#include "../../interface/widgets/visual_deck_storage/visual_deck_storage_widget.h"
|
#include "../../interface/widgets/visual_deck_storage/visual_deck_storage_widget.h"
|
||||||
#include "../tab_supervisor.h"
|
#include "../tab_supervisor.h"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue