From eb6d067a21a81e76c01005be05de9e73200f2a78 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Wed, 15 Apr 2015 23:21:44 +0200 Subject: [PATCH] Speed up deck editor filtering * card: cache simpleName for each card * deck editor: remove double comparation of searched term with card name when sorting --- cockatrice/src/carddatabase.cpp | 5 +++-- cockatrice/src/carddatabase.h | 1 + cockatrice/src/carddatabasemodel.cpp | 26 +++++++++++--------------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index c6bcd188..3adc8d25 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -407,6 +407,7 @@ CardInfo::CardInfo(CardDatabase *_db, tableRow(_tableRow) { pixmapCacheKey = QLatin1String("card_") + name; + simpleName = CardInfo::simplifyName(name); for (int i = 0; i < sets.size(); i++) sets[i]->append(this); @@ -660,14 +661,14 @@ void CardDatabase::clear() void CardDatabase::addCard(CardInfo *card) { cards.insert(card->getName(), card); - simpleNameCards.insert(CardInfo::simplifyName(card->getName()), card); + simpleNameCards.insert(card->getSimpleName(), card); emit cardAdded(card); } void CardDatabase::removeCard(CardInfo *card) { cards.remove(card->getName()); - simpleNameCards.remove(CardInfo::simplifyName(card->getName())); + simpleNameCards.remove(card->getSimpleName()); emit cardRemoved(card); } diff --git a/cockatrice/src/carddatabase.h b/cockatrice/src/carddatabase.h index 55c1327d..9b3b622c 100644 --- a/cockatrice/src/carddatabase.h +++ b/cockatrice/src/carddatabase.h @@ -142,6 +142,7 @@ public: MuidMap muids = MuidMap()); ~CardInfo(); const QString &getName() const { return name; } + const QString &getSimpleName() const { return simpleName; } bool getIsToken() const { return isToken; } const SetList &getSets() const { return sets; } const QString &getManaCost() const { return manacost; } diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index d438b178..be1311a6 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -125,19 +125,16 @@ bool CardDatabaseDisplayModel::lessThan(const QModelIndex &left, const QModelInd if (!cardName.isEmpty()) { - // exact match should be at top - if (leftString.compare(cardName, Qt::CaseInsensitive) == 0) + bool isLeftType = leftString.startsWith(cardName, Qt::CaseInsensitive); + bool isRightType = rightString.startsWith(cardName, Qt::CaseInsensitive); + + // test for an exact match: isLeftType && leftString.size() == cardName.size() + // or an exclusive start match: isLeftType && !isRightType + if (isLeftType && (!isRightType || leftString.size() == cardName.size())) return true; - // exact match should be at top - if (rightString.compare(cardName, Qt::CaseInsensitive) == 0) - return false; - - bool isLeftType2 = leftString.startsWith(cardName, Qt::CaseInsensitive); - bool isRightType2 = rightString.startsWith(cardName, Qt::CaseInsensitive); - if (isLeftType2 && !isRightType2) - return true; - if (isRightType2 && !isLeftType2) + // same checks for the right string + if (isRightType && (!isLeftType || rightString.size() == cardName.size())) return false; } return QString::localeAwareCompare(leftString, rightString) < 0; @@ -150,12 +147,11 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken())) return false; - if (!CardInfo::simplifyName(info->getName()).contains(cardName, Qt::CaseInsensitive)) + if (!cardName.isEmpty() && !info->getSimpleName().contains(cardName, Qt::CaseInsensitive)) return false; - if (!cardNameSet.isEmpty()) - if (!cardNameSet.contains(info->getName())) - return false; + if (!cardNameSet.isEmpty() && !cardNameSet.contains(info->getName())) + return false; if (filterTree != NULL) return filterTree->acceptsCard(info);