From 700634c476e7e4fb45ce9d7b981660d54ec80e52 Mon Sep 17 00:00:00 2001 From: ebbit1q Date: Sat, 20 Sep 2025 03:27:56 +0200 Subject: [PATCH] split implementation out to cpp --- cockatrice/CMakeLists.txt | 1 + .../deck_list_sort_filter_proxy_model.cpp | 55 +++++++++++++++++++ .../deck_list_sort_filter_proxy_model.h | 52 +----------------- 3 files changed, 57 insertions(+), 51 deletions(-) create mode 100644 cockatrice/src/utility/deck_list_sort_filter_proxy_model.cpp diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index bcef0432f..8ab72174d 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -291,6 +291,7 @@ set(cockatrice_SOURCES src/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp src/tabs/visual_deck_storage/tab_deck_storage_visual.cpp src/utility/card_info_comparator.cpp + src/utility/deck_list_sort_filter_proxy_model.cpp src/utility/key_signals.cpp src/utility/levenshtein.cpp src/utility/logger.cpp diff --git a/cockatrice/src/utility/deck_list_sort_filter_proxy_model.cpp b/cockatrice/src/utility/deck_list_sort_filter_proxy_model.cpp new file mode 100644 index 000000000..0a6a178d5 --- /dev/null +++ b/cockatrice/src/utility/deck_list_sort_filter_proxy_model.cpp @@ -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(left.internalPointer()); + auto *rNode = static_cast(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; + } + diff --git a/cockatrice/src/utility/deck_list_sort_filter_proxy_model.h b/cockatrice/src/utility/deck_list_sort_filter_proxy_model.h index 414f02694..d21907c84 100644 --- a/cockatrice/src/utility/deck_list_sort_filter_proxy_model.h +++ b/cockatrice/src/utility/deck_list_sort_filter_proxy_model.h @@ -20,57 +20,7 @@ public: } protected: - 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(left.internalPointer()); - auto *rNode = static_cast(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; - } + bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; private: QStringList sortCriteria;