From 21daf9db9984d4e2cfe9b9ca240c70b1a5a55b34 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 6 Jun 2009 13:55:30 +0200 Subject: [PATCH] foo --- cockatrice/src/decklist.h | 1 + cockatrice/src/decklistmodel.cpp | 40 +++++++++++++++++----------- cockatrice/src/decklistmodel.h | 3 ++- cockatrice/src/window_deckeditor.cpp | 7 +++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/cockatrice/src/decklist.h b/cockatrice/src/decklist.h index a7db6d5d..31401250 100644 --- a/cockatrice/src/decklist.h +++ b/cockatrice/src/decklist.h @@ -15,6 +15,7 @@ protected: InnerDecklistNode *parent; public: AbstractDecklistNode(InnerDecklistNode *_parent = 0); + virtual ~AbstractDecklistNode() { } virtual QString getName() const = 0; InnerDecklistNode *getParent() const { return parent; } int depth() const; diff --git a/cockatrice/src/decklistmodel.cpp b/cockatrice/src/decklistmodel.cpp index 46fc79fa..87241157 100644 --- a/cockatrice/src/decklistmodel.cpp +++ b/cockatrice/src/decklistmodel.cpp @@ -64,11 +64,11 @@ void DeckListModel::rebuildTree() InnerDecklistNode *cardTypeNode = dynamic_cast(node->findChild(cardType)); if (!cardTypeNode) cardTypeNode = new InnerDecklistNode(cardType, node); - + new DecklistModelCardNode(currentCard, cardTypeNode); } } - + reset(); } @@ -148,11 +148,11 @@ QModelIndex DeckListModel::index(int row, int column, const QModelIndex &parent) // debugIndexInfo("index", parent); if (!hasIndex(row, column, parent)) return QModelIndex(); - + InnerDecklistNode *parentNode = getNode(parent); if (row >= parentNode->size()) return QModelIndex(); - + return createIndex(row, column, parentNode->at(row)); } @@ -160,7 +160,7 @@ QModelIndex DeckListModel::parent(const QModelIndex &ind) const { if (!ind.isValid()) return QModelIndex(); - + return nodeToIndex(static_cast(ind.internalPointer())->getParent()); } @@ -170,14 +170,20 @@ Qt::ItemFlags DeckListModel::flags(const QModelIndex &index) const return 0; Qt::ItemFlags result = Qt::ItemIsEnabled; - if (getNode(index)) { + if (getNode(index)) result |= Qt::ItemIsSelectable; - if (index.column() == 0) - result |= Qt::ItemIsEditable; - } + return result; } +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(index); @@ -189,7 +195,7 @@ bool DeckListModel::setData(const QModelIndex &index, const QVariant &value, int case 1: node->setName(value.toString()); break; default: return false; } - emit dataChanged(index, index); + emitRecursiveUpdates(index); return true; } @@ -210,9 +216,11 @@ bool DeckListModel::removeRows(int row, int count, const QModelIndex &parent) delete toDelete; } endRemoveRows(); - + if (!node->size() && (node != root)) removeRows(parent.row(), 1, parent.parent()); + else + emitRecursiveUpdates(parent); return true; } @@ -231,23 +239,25 @@ InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerD 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(cardTypeNode->findChild(cardName)); if (!cardNode) { DecklistCardNode *decklistCard = deckList->addCard(cardName, zoneName); - beginInsertRows(nodeToIndex(cardTypeNode), cardTypeNode->size(), cardTypeNode->size()); + 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); - emit dataChanged(ind, ind); + emitRecursiveUpdates(ind); return ind; } } diff --git a/cockatrice/src/decklistmodel.h b/cockatrice/src/decklistmodel.h index 8fd194eb..e5fb40ac 100644 --- a/cockatrice/src/decklistmodel.h +++ b/cockatrice/src/decklistmodel.h @@ -45,9 +45,10 @@ private: InnerDecklistNode *root; InnerDecklistNode *createNodeIfNeeded(const QString &name, InnerDecklistNode *parent); QModelIndex nodeToIndex(AbstractDecklistNode *node) const; + void emitRecursiveUpdates(const QModelIndex &index); void debugIndexInfo(const QString &func, const QModelIndex &index) const; void debugShowTree(InnerDecklistNode *node, int depth) const; - + template T getNode(const QModelIndex &index) const { if (!index.isValid()) diff --git a/cockatrice/src/window_deckeditor.cpp b/cockatrice/src/window_deckeditor.cpp index 0a957ecc..6097dc2b 100644 --- a/cockatrice/src/window_deckeditor.cpp +++ b/cockatrice/src/window_deckeditor.cpp @@ -180,7 +180,7 @@ void WndDeckEditor::actNewDeck() { if (!confirmClose()) return; - + deckModel->cleanList(); nameEdit->setText(QString()); commentsEdit->setText(QString()); @@ -240,9 +240,10 @@ void WndDeckEditor::addCardHelper(const QString &zoneName) if (!currentIndex.isValid()) return; const QString cardName = databaseModel->index(currentIndex.row(), 0).data().toString(); - + QModelIndex newCardIndex = deckModel->addCard(cardName, zoneName); recursiveExpand(newCardIndex); + deckView->setCurrentIndex(newCardIndex); setWindowModified(true); } @@ -273,6 +274,7 @@ void WndDeckEditor::actIncrement() return; const QModelIndex numberIndex = currentIndex.sibling(currentIndex.row(), 0); const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); + deckView->setCurrentIndex(numberIndex); deckModel->setData(numberIndex, count + 1, Qt::EditRole); setWindowModified(true); } @@ -284,6 +286,7 @@ void WndDeckEditor::actDecrement() return; const QModelIndex numberIndex = currentIndex.sibling(currentIndex.row(), 0); const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); + deckView->setCurrentIndex(numberIndex); if (count == 1) deckModel->removeRow(currentIndex.row(), currentIndex.parent()); else