mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
deck editor
This commit is contained in:
parent
3502ec80e4
commit
1da5c63726
9 changed files with 349 additions and 256 deletions
|
|
@ -17,18 +17,15 @@ DeckListModel::~DeckListModel()
|
|||
{
|
||||
}
|
||||
|
||||
|
||||
void DeckListModel::debugIndexInfo(const QString &func, const QModelIndex &index) const
|
||||
{
|
||||
quint32 id = index.internalId(); // 32 bit int, from MSB to LSB:
|
||||
int zone = id >> 30; // 2 bits - zone
|
||||
int cardtype = (id >> 25) & 0x1f; // 5 bits - card type
|
||||
int card = (id >> 3) & 0x3fffff; // 22 bits - card
|
||||
int column = id & 0x7; // 3 bits - column
|
||||
|
||||
if (index.isValid())
|
||||
qDebug(QString("index: function = %1, zone = %2, cardtype = %3, card = %4, column = %5").arg(func).arg(zone).arg(cardtype).arg(card).arg(column).toLatin1());
|
||||
else
|
||||
qDebug(QString("index: function = %1, invalid").arg(func).toLatin1());
|
||||
if (!index.isValid())
|
||||
qDebug(QString("debugIndexInfo: %1: index invalid").arg(func).toLatin1());
|
||||
else if (InnerDecklistNode *node = getNode<InnerDecklistNode *>(index))
|
||||
qDebug(QString("debugIndexInfo: %1: INNER index '%2', row=%3, col=%4").arg(func).arg(node->getName()).arg(index.row()).arg(index.column()).toLatin1());
|
||||
else if (DecklistModelCardNode *node = getNode<DecklistModelCardNode *>(index))
|
||||
qDebug(QString("debugIndexInfo: %1: CARD index '%2', row=%3, col=%4").arg(func).arg(node->getName()).arg(index.row()).arg(index.column()).toLatin1());
|
||||
}
|
||||
|
||||
void DeckListModel::debugShowTree(InnerDecklistNode *node, int depth) const
|
||||
|
|
@ -44,6 +41,7 @@ void DeckListModel::debugShowTree(InnerDecklistNode *node, int depth) const
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void DeckListModel::rebuildTree()
|
||||
{
|
||||
root->clearTree();
|
||||
|
|
@ -55,75 +53,25 @@ void DeckListModel::rebuildTree()
|
|||
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
|
||||
|
||||
QString cardType = db->getCard(currentCard->getName())->getMainCardType();
|
||||
InnerDecklistNode *cardTypeNode = dynamic_cast<InnerDecklistNode *>(findNode(cardType, node));
|
||||
InnerDecklistNode *cardTypeNode = dynamic_cast<InnerDecklistNode *>(node->findChild(cardType));
|
||||
if (!cardTypeNode)
|
||||
cardTypeNode = new InnerDecklistNode(cardType, node);
|
||||
|
||||
DecklistModelCardNode *newCard = new DecklistModelCardNode(currentCard, cardTypeNode);
|
||||
new DecklistModelCardNode(currentCard, cardTypeNode);
|
||||
}
|
||||
}
|
||||
debugShowTree(root, 0);
|
||||
|
||||
reset();
|
||||
}
|
||||
|
||||
AbstractDecklistNode *DeckListModel::findNode(const QString &name, InnerDecklistNode *root) const
|
||||
{
|
||||
for (int i = 0; i < root->size(); i++)
|
||||
if (root->at(i)->getName() == name)
|
||||
return root->at(i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AbstractDecklistNode *DeckListModel::findNode(const QModelIndex &index) const
|
||||
{
|
||||
// debugIndexInfo("findNode", index);
|
||||
if (index.isValid()) {
|
||||
InnerDecklistNode *parentNode = dynamic_cast<InnerDecklistNode *>(findNode(index.parent()));
|
||||
return parentNode->at(index.row());
|
||||
} else
|
||||
return root;
|
||||
}
|
||||
|
||||
int DeckListModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
// debugIndexInfo("rowCount", parent);
|
||||
InnerDecklistNode *node = dynamic_cast<InnerDecklistNode *>(findNode(parent));
|
||||
if (node) {
|
||||
// qDebug(QString(" rowCount: return %1").arg(node->size()).toLatin1());
|
||||
InnerDecklistNode *node = getNode<InnerDecklistNode *>(parent);
|
||||
if (node)
|
||||
return node->size();
|
||||
} else {
|
||||
// qDebug(" rowCount: return const 0");
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool DeckListModel::hasChildren(const QModelIndex &parent) const
|
||||
{
|
||||
// debugIndexInfo("hasChildren", parent);
|
||||
if (!parent.isValid() && root->size())
|
||||
return true;
|
||||
if (parent.column() != 0)
|
||||
return false;
|
||||
/*
|
||||
InnerDecklistNode *node = dynamic_cast<InnerDecklistNode *>(findNode(parent));
|
||||
if (!node)
|
||||
qDebug("line 109: return false");
|
||||
return false;
|
||||
}
|
||||
qDebug(QString("line 112: return %1").arg(node->size()).toLatin1());
|
||||
return node->size();
|
||||
|
||||
if (!parent.isValid())
|
||||
return true;
|
||||
qDebug(QString(" hasChildren: return %1").arg((!parent.column() && (((parent.internalId() >> 3) & 0x3fffff) == 0x3fffff))).toLatin1());
|
||||
*/ // An item (possibly) has children if its column is zero and its card is -1.
|
||||
return (!parent.column() && (((parent.internalId() >> 3) & 0x3fffff) == 0x3fffff));
|
||||
}
|
||||
|
||||
int DeckListModel::columnCount(const QModelIndex &/*parent*/) const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
QVariant DeckListModel::data(const QModelIndex &index, int role) const
|
||||
|
|
@ -134,11 +82,10 @@ QVariant DeckListModel::data(const QModelIndex &index, int role) const
|
|||
if (index.column() >= 2)
|
||||
return QVariant();
|
||||
|
||||
AbstractDecklistNode *tempNode = findNode(index);
|
||||
if (tempNode == root)
|
||||
return QVariant();
|
||||
|
||||
if (tempNode->hasChildren()) {
|
||||
AbstractDecklistNode *temp = static_cast<AbstractDecklistNode *>(index.internalPointer());
|
||||
DecklistModelCardNode *card = dynamic_cast<DecklistModelCardNode *>(temp);
|
||||
if (!card) {
|
||||
InnerDecklistNode *node = dynamic_cast<InnerDecklistNode *>(temp);
|
||||
switch (role) {
|
||||
case Qt::FontRole: {
|
||||
QFont f;
|
||||
|
|
@ -146,27 +93,25 @@ QVariant DeckListModel::data(const QModelIndex &index, int role) const
|
|||
return f;
|
||||
}
|
||||
case Qt::DisplayRole:
|
||||
case Qt::EditRole: {
|
||||
case Qt::EditRole:
|
||||
switch (index.column()) {
|
||||
case 0: {
|
||||
InnerDecklistNode *node = dynamic_cast<InnerDecklistNode *>(tempNode);
|
||||
return node->getVisibleName();
|
||||
}
|
||||
case 0: return node->recursiveCount(true);
|
||||
case 1: return node->getVisibleName();
|
||||
default: return QVariant();
|
||||
}
|
||||
case Qt::BackgroundRole: {
|
||||
int color = 90 + 60 * node->depth();
|
||||
return QBrush(QColor(color, 255, color));
|
||||
}
|
||||
case Qt::BackgroundRole:
|
||||
return QBrush(QColor(200, 255, 200));
|
||||
default: return QVariant();
|
||||
}
|
||||
} else {
|
||||
switch (role) {
|
||||
case Qt::DisplayRole:
|
||||
case Qt::EditRole: {
|
||||
DecklistModelCardNode *node = dynamic_cast<DecklistModelCardNode *>(tempNode);
|
||||
switch (index.column()) {
|
||||
case 0: return node->getNumber();
|
||||
case 1: return node->getName();
|
||||
case 0: return card->getNumber();
|
||||
case 1: return card->getName();
|
||||
default: return QVariant();
|
||||
}
|
||||
}
|
||||
|
|
@ -181,9 +126,7 @@ QVariant DeckListModel::data(const QModelIndex &index, int role) const
|
|||
|
||||
QVariant DeckListModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant();
|
||||
if (orientation != Qt::Horizontal)
|
||||
if ((role != Qt::DisplayRole) || (orientation != Qt::Horizontal))
|
||||
return QVariant();
|
||||
switch (section) {
|
||||
case 0: return QString(tr("Number"));
|
||||
|
|
@ -195,52 +138,31 @@ QVariant DeckListModel::headerData(int section, Qt::Orientation orientation, int
|
|||
QModelIndex DeckListModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
// debugIndexInfo("index", parent);
|
||||
// for explanation of the bit shifting, look at parent()
|
||||
int indexZone, indexCardType, indexCard;
|
||||
if (!parent.isValid()) {
|
||||
indexZone = row;
|
||||
indexCardType = 0x1f;
|
||||
indexCard = 0x3fffff;
|
||||
} else {
|
||||
quint32 pid = parent.internalId();
|
||||
indexZone = pid >> 30;
|
||||
int pcardtype = (pid >> 25) & 0x1f;
|
||||
if (!hasIndex(row, column, parent))
|
||||
return QModelIndex();
|
||||
|
||||
InnerDecklistNode *parentNode = getNode<InnerDecklistNode *>(parent);
|
||||
if (row >= parentNode->size())
|
||||
return QModelIndex();
|
||||
|
||||
if (pcardtype == 0x1f) {
|
||||
indexCardType = row;
|
||||
indexCard = 0x3fffff;
|
||||
} else {
|
||||
indexCardType = pcardtype;
|
||||
indexCard = row;
|
||||
}
|
||||
}
|
||||
|
||||
// qDebug(QString("index(): zone = %1, cardtype = %2, card = %3, column = %4").arg(indexZone).arg(indexCardType).arg(indexCard).arg(column).toLatin1());
|
||||
return createIndex(row, column, (indexZone << 30) + (indexCardType << 25) + (indexCard << 3) + column);
|
||||
return createIndex(row, column, parentNode->at(row));
|
||||
}
|
||||
|
||||
QModelIndex DeckListModel::parent(const QModelIndex &ind) const
|
||||
{
|
||||
// debugIndexInfo("parent", ind);
|
||||
|
||||
quint32 id = ind.internalId(); // 32 bit int, from MSB to LSB:
|
||||
int zone = id >> 30; // 2 bits - zone
|
||||
int cardtype = (id >> 25) & 0x1f; // 5 bits - card type
|
||||
int card = (id >> 3) & 0x3fffff; // 22 bits - card
|
||||
// int column = id & 0x7; // 3 bits - column
|
||||
|
||||
if (cardtype == 0x1f)
|
||||
if (!ind.isValid())
|
||||
return QModelIndex();
|
||||
else if (card == 0x3fffff)
|
||||
return index(zone, 0);
|
||||
else
|
||||
return index(cardtype, 0, index(zone, 0));
|
||||
|
||||
return nodeToIndex(static_cast<AbstractDecklistNode *>(ind.internalPointer())->getParent());
|
||||
}
|
||||
|
||||
Qt::ItemFlags DeckListModel::flags(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return 0;
|
||||
|
||||
Qt::ItemFlags result = Qt::ItemIsEnabled;
|
||||
if (((index.internalId() >> 3) & 0x3fffff) != 0x3fffff) {
|
||||
if (getNode<DecklistModelCardNode *>(index)) {
|
||||
result |= Qt::ItemIsSelectable;
|
||||
if (index.column() == 0)
|
||||
result |= Qt::ItemIsEditable;
|
||||
|
|
@ -250,7 +172,7 @@ Qt::ItemFlags DeckListModel::flags(const QModelIndex &index) const
|
|||
|
||||
bool DeckListModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
DecklistModelCardNode *node = dynamic_cast<DecklistModelCardNode *>(findNode(index));
|
||||
DecklistModelCardNode *node = getNode<DecklistModelCardNode *>(index);
|
||||
if (!node || (role != Qt::EditRole))
|
||||
return false;
|
||||
|
||||
|
|
@ -265,46 +187,80 @@ bool DeckListModel::setData(const QModelIndex &index, const QVariant &value, int
|
|||
|
||||
bool DeckListModel::removeRows(int row, int count, const QModelIndex &parent)
|
||||
{
|
||||
/* DecklistNode *node = findNode(parent);
|
||||
debugIndexInfo("removeRows", parent);
|
||||
InnerDecklistNode *node = getNode<InnerDecklistNode *>(parent);
|
||||
if (!node)
|
||||
return false;
|
||||
if (row + count > node->size())
|
||||
return false;
|
||||
|
||||
beginRemoveRows(parent, row, row + count - 1);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
delete node->takeAt(row);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
AbstractDecklistNode *toDelete = node->takeAt(row);
|
||||
if (DecklistModelCardNode *temp = dynamic_cast<DecklistModelCardNode *>(toDelete))
|
||||
deckList->deleteNode(temp->getDataNode());
|
||||
delete toDelete;
|
||||
}
|
||||
endRemoveRows();
|
||||
|
||||
if (!node->size() && (node != root))
|
||||
removeRows(parent.row(), 1, parent.parent());
|
||||
|
||||
return true;
|
||||
*/}
|
||||
/*
|
||||
void DeckListModel::insertCard(...)
|
||||
{
|
||||
}
|
||||
|
||||
void DeckListModel::removeCard(...)
|
||||
InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerDecklistNode *parent)
|
||||
{
|
||||
InnerDecklistNode *newNode = dynamic_cast<InnerDecklistNode *>(parent->findChild(name));
|
||||
if (!newNode) {
|
||||
beginInsertRows(nodeToIndex(parent), parent->size(), parent->size());
|
||||
newNode = new InnerDecklistNode(name, parent);
|
||||
endInsertRows();
|
||||
}
|
||||
return newNode;
|
||||
}
|
||||
*/
|
||||
bool DeckListModel::insertRows(int row, int count, const QModelIndex &parent)
|
||||
|
||||
QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneName)
|
||||
{
|
||||
/*
|
||||
// Inserting zones is not supported.
|
||||
if (!parent.isValid())
|
||||
return false;
|
||||
InnerDecklistNode *zoneNode = createNodeIfNeeded(zoneName, root);
|
||||
|
||||
CardInfo *info = db->getCard(cardName);
|
||||
QString cardType = info->getMainCardType();
|
||||
InnerDecklistNode *cardTypeNode = createNodeIfNeeded(cardType, zoneNode);
|
||||
|
||||
DecklistModelCardNode *cardNode = dynamic_cast<DecklistModelCardNode *>(cardTypeNode->findChild(cardName));
|
||||
if (!cardNode) {
|
||||
DecklistCardNode *decklistCard = deckList->addCard(cardName, zoneName);
|
||||
beginInsertRows(nodeToIndex(cardTypeNode), cardTypeNode->size(), cardTypeNode->size());
|
||||
cardNode = new DecklistModelCardNode(decklistCard, cardTypeNode);
|
||||
endInsertRows();
|
||||
sort(1);
|
||||
return nodeToIndex(cardNode);
|
||||
} else {
|
||||
cardNode->setNumber(cardNode->getNumber() + 1);
|
||||
QModelIndex ind = nodeToIndex(cardNode);
|
||||
emit dataChanged(ind, ind);
|
||||
return ind;
|
||||
}
|
||||
}
|
||||
|
||||
beginInsertRows(parent, row, row + count - 1);
|
||||
QModelIndex DeckListModel::nodeToIndex(AbstractDecklistNode *node) const
|
||||
{
|
||||
if (node == root)
|
||||
return QModelIndex();
|
||||
return createIndex(node->getParent()->indexOf(node), 0, node);
|
||||
}
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
deckList->getZoneByIndex(parent.row())->insert(row, new DecklistRow);
|
||||
|
||||
endInsertRows();
|
||||
return true;
|
||||
*/}
|
||||
void DeckListModel::sort(int /*column*/, Qt::SortOrder order)
|
||||
{
|
||||
emit layoutAboutToBeChanged();
|
||||
root->sort(order);
|
||||
emit layoutChanged();
|
||||
}
|
||||
|
||||
void DeckListModel::cleanList()
|
||||
{
|
||||
deckList->cleanList();
|
||||
deckList->initZones();
|
||||
reset();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue