split implementation out to cpp

This commit is contained in:
ebbit1q 2025-09-20 03:27:56 +02:00
parent 6be733444c
commit 700634c476
3 changed files with 57 additions and 51 deletions

View file

@ -291,6 +291,7 @@ set(cockatrice_SOURCES
src/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp src/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp
src/tabs/visual_deck_storage/tab_deck_storage_visual.cpp src/tabs/visual_deck_storage/tab_deck_storage_visual.cpp
src/utility/card_info_comparator.cpp src/utility/card_info_comparator.cpp
src/utility/deck_list_sort_filter_proxy_model.cpp
src/utility/key_signals.cpp src/utility/key_signals.cpp
src/utility/levenshtein.cpp src/utility/levenshtein.cpp
src/utility/logger.cpp src/utility/logger.cpp

View file

@ -0,0 +1,55 @@
#include "deck_list_sort_filter_proxy_model.h"
#include "../deck/deck_list_model.h"
bool DeckListSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
auto *src = sourceModel();
// Inner nodes? -> sort alphabetically by column 1
bool leftIsCard = src->data(left, Qt::UserRole + 1).toBool();
bool rightIsCard = src->data(right, Qt::UserRole + 1).toBool();
if (!leftIsCard || !rightIsCard) {
QString lName = src->data(left.siblingAtColumn(1), Qt::EditRole).toString();
QString rName = src->data(right.siblingAtColumn(1), Qt::EditRole).toString();
return lName.localeAwareCompare(rName) < 0;
}
// Both are cards -> apply sort criteria
auto *lNode = static_cast<DecklistModelCardNode *>(left.internalPointer());
auto *rNode = static_cast<DecklistModelCardNode *>(right.internalPointer());
CardInfoPtr lInfo = CardDatabaseManager::getInstance()->guessCard({lNode->getName()}).getCardPtr();
CardInfoPtr rInfo = CardDatabaseManager::getInstance()->guessCard({rNode->getName()}).getCardPtr();
// Example: multiple tie-break criteria (colors > cmc > name)
for (const QString &crit : sortCriteria) {
if (crit == "name") {
QString ln = lNode->getName();
QString rn = rNode->getName();
int cmp = ln.localeAwareCompare(rn);
if (cmp != 0)
return cmp < 0;
} else if (crit == "cmc") {
int lc = lInfo ? lInfo->getCmc().toInt() : 0;
int rc = rInfo ? rInfo->getCmc().toInt() : 0;
if (lc != rc)
return lc < rc;
} else if (crit == "colors") {
QString lr = lInfo ? lInfo->getColors() : QString();
QString rr = rInfo ? rInfo->getColors() : QString();
int cmp = lr.localeAwareCompare(rr);
if (cmp != 0)
return cmp < 0;
} else if (crit == "maintype") {
QString lr = lInfo ? lInfo->getMainCardType() : QString();
QString rr = rInfo ? rInfo->getMainCardType() : QString();
int cmp = lr.localeAwareCompare(rr);
if (cmp != 0)
return cmp < 0;
}
}
return false;
}

View file

@ -20,57 +20,7 @@ public:
} }
protected: protected:
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
{
auto *src = sourceModel();
// Inner nodes? -> sort alphabetically by column 1
bool leftIsCard = src->data(left, Qt::UserRole + 1).toBool();
bool rightIsCard = src->data(right, Qt::UserRole + 1).toBool();
if (!leftIsCard || !rightIsCard) {
QString lName = src->data(left.siblingAtColumn(1), Qt::EditRole).toString();
QString rName = src->data(right.siblingAtColumn(1), Qt::EditRole).toString();
return lName.localeAwareCompare(rName) < 0;
}
// Both are cards -> apply sort criteria
auto *lNode = static_cast<DecklistModelCardNode *>(left.internalPointer());
auto *rNode = static_cast<DecklistModelCardNode *>(right.internalPointer());
CardInfoPtr lInfo = CardDatabaseManager::getInstance()->guessCard({lNode->getName()}).getCardPtr();
CardInfoPtr rInfo = CardDatabaseManager::getInstance()->guessCard({rNode->getName()}).getCardPtr();
// Example: multiple tie-break criteria (colors > cmc > name)
for (const QString &crit : sortCriteria) {
if (crit == "name") {
QString ln = lNode->getName();
QString rn = rNode->getName();
int cmp = ln.localeAwareCompare(rn);
if (cmp != 0)
return cmp < 0;
} else if (crit == "cmc") {
int lc = lInfo ? lInfo->getCmc().toInt() : 0;
int rc = rInfo ? rInfo->getCmc().toInt() : 0;
if (lc != rc)
return lc < rc;
} else if (crit == "colors") {
QString lr = lInfo ? lInfo->getColors() : QString();
QString rr = rInfo ? rInfo->getColors() : QString();
int cmp = lr.localeAwareCompare(rr);
if (cmp != 0)
return cmp < 0;
} else if (crit == "maintype") {
QString lr = lInfo ? lInfo->getMainCardType() : QString();
QString rr = rInfo ? rInfo->getMainCardType() : QString();
int cmp = lr.localeAwareCompare(rr);
if (cmp != 0)
return cmp < 0;
}
}
return false;
}
private: private:
QStringList sortCriteria; QStringList sortCriteria;