QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneName) { 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); QModelIndex parentIndex = nodeToIndex(cardTypeNode); beginInsertRows(parentIndex, cardTypeNode->size(), cardTypeNode->size()); cardNode = new DecklistModelCardNode(decklistCard, cardTypeNode); endInsertRows(); sort(1); emitRecursiveUpdates(parentIndex); return nodeToIndex(cardNode); } else { cardNode->setNumber(cardNode->getNumber() + 1); QModelIndex ind = nodeToIndex(cardNode); emitRecursiveUpdates(ind); return ind; } }
void DeckListModel::emitRecursiveUpdates(const QModelIndex &index) { if (!index.isValid()) return; emit dataChanged(index, index); emitRecursiveUpdates(index.parent()); }
bool DeckListModel::setData(const QModelIndex &index, const QVariant &value, int role) { DecklistModelCardNode *node = getNode<DecklistModelCardNode *>(index); if (!node || (role != Qt::EditRole)) return false; switch (index.column()) { case 0: node->setNumber(value.toInt()); break; case 1: node->setName(value.toString()); break; default: return false; } emitRecursiveUpdates(index); return true; }
bool DeckListModel::removeRows(int row, int count, const QModelIndex &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++) { 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()); else emitRecursiveUpdates(parent); return true; }