From 060e8f0cfdc2f081711abfba42645a5bca816bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sun, 1 Dec 2024 17:23:11 +0100 Subject: [PATCH] Move the sorting options to their own widget. --- cockatrice/CMakeLists.txt | 1 + .../printing_selector/printing_selector.cpp | 166 ++---------------- .../printing_selector/printing_selector.h | 16 +- .../printing_selector_card_sorting_widget.cpp | 154 ++++++++++++++++ .../printing_selector_card_sorting_widget.h | 35 ++++ 5 files changed, 203 insertions(+), 169 deletions(-) create mode 100644 cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp create mode 100644 cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index c6d99c5af..598df4edf 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -101,6 +101,7 @@ set(cockatrice_SOURCES src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.cpp src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.cpp src/client/ui/widgets/printing_selector/printing_selector_card_selection_widget.cpp + src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp src/client/ui/widgets/printing_selector/set_name_and_collectors_number_display_widget.cpp src/client/network/release_channel.cpp src/server/remote/remote_client.cpp diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp index d846a240a..44473b41a 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp @@ -1,24 +1,16 @@ #include "printing_selector.h" #include "../../../../settings/cache_settings.h" -#include "../../../../utility/card_set_comparator.h" #include "printing_selector_card_display_widget.h" #include "printing_selector_card_selection_widget.h" +#include "printing_selector_card_sorting_widget.h" #include #include #include #include -const QString PrintingSelector::SORT_OPTIONS_ALPHABETICAL = tr("Alphabetical"); -const QString PrintingSelector::SORT_OPTIONS_PREFERENCE = tr("Preference"); -const QString PrintingSelector::SORT_OPTIONS_RELEASE_DATE = tr("Release Date"); -const QString PrintingSelector::SORT_OPTIONS_CONTAINED_IN_DECK = tr("Contained in Deck"); -const QString PrintingSelector::SORT_OPTIONS_POTENTIAL_CARDS = tr("Potential Cards in Deck"); -const QStringList PrintingSelector::SORT_OPTIONS = {SORT_OPTIONS_ALPHABETICAL, SORT_OPTIONS_PREFERENCE, - SORT_OPTIONS_RELEASE_DATE, SORT_OPTIONS_CONTAINED_IN_DECK, - SORT_OPTIONS_POTENTIAL_CARDS}; PrintingSelector::PrintingSelector(QWidget *parent, TabDeckEditor *deckEditor, DeckListModel *deckModel, @@ -30,21 +22,8 @@ PrintingSelector::PrintingSelector(QWidget *parent, setLayout(layout); timer = new QTimer(this); - sortToolBar = new QHBoxLayout(this); - - sortOptionsSelector = new QComboBox(this); - sortOptionsSelector->addItems(SORT_OPTIONS); - sortOptionsSelector->setCurrentIndex(2); - connect(sortOptionsSelector, &QComboBox::currentTextChanged, this, &PrintingSelector::updateDisplay); - sortToolBar->addWidget(sortOptionsSelector); - - toggleSortOrder = new QPushButton(this); - toggleSortOrder->setText(tr("Descending")); - descendingSort = true; - connect(toggleSortOrder, &QPushButton::clicked, this, &PrintingSelector::updateSortOrder); - sortToolBar->addWidget(toggleSortOrder); - - layout->addLayout(sortToolBar); + sortToolBar = new PrintingSelectorCardSortingWidget(this); + layout->addWidget(sortToolBar); // Add the search bar searchBar = new QLineEdit(this); @@ -74,17 +53,6 @@ PrintingSelector::PrintingSelector(QWidget *parent, }); } -void PrintingSelector::updateSortOrder() -{ - if (descendingSort) { - toggleSortOrder->setText(tr("Ascending")); - } else { - toggleSortOrder->setText(tr("Descending")); - } - descendingSort = !descendingSort; - updateDisplay(); -} - void PrintingSelector::updateDisplay() { timer->stop(); @@ -168,131 +136,19 @@ CardInfoPerSet PrintingSelector::getSetForUUID(const QString &uuid) return CardInfoPerSet(); } -QList PrintingSelector::prependPrintingsInDeck(const QList &sets) -{ - if (!selectedCard) { - return {}; - } - - CardInfoPerSetMap cardInfoPerSets = selectedCard->getSets(); - QList> countList; - - // Collect sets with their counts - for (const auto &x : cardInfoPerSets) { - for (const auto &cardInfoPerSet : x) { - QModelIndex find_card = - deckModel->findCard(selectedCard->getName(), DECK_ZONE_MAIN, cardInfoPerSet.getProperty("uuid")); - if (find_card.isValid()) { - int count = - deckModel->data(find_card, Qt::DisplayRole).toInt(); // Ensure the count is treated as an integer - if (count > 0) { - countList.append(qMakePair(cardInfoPerSet, count)); - } - } - break; - } - } - - // Sort sets by count in descending numerical order - std::sort(countList.begin(), countList.end(), - [](const QPair &a, const QPair &b) { - return a.second > b.second; // Ensure numerical comparison - }); - - // Create a copy of the original list to modify - QList result = sets; - - // Prepend sorted sets and remove them from the original list - for (const auto &pair : countList) { - auto it = std::find_if(result.begin(), result.end(), [&pair](const CardInfoPerSet &item) { - return item.getProperty("uuid") == pair.first.getProperty("uuid"); - }); - if (it != result.end()) { - result.erase(it); // Remove the matching entry - } - result.prepend(pair.first); // Prepend the sorted item - } - - return result; -} - -QList PrintingSelector::sortSets() -{ - if (selectedCard.isNull()) { - return {}; - } - CardInfoPerSetMap cardInfoPerSets = selectedCard->getSets(); - - QList sortedSets; - - for (const auto &x : cardInfoPerSets) { - for (const auto &set : x) { - sortedSets << set.getPtr(); - break; - } - } - - if (sortedSets.empty()) { - sortedSets << CardSet::newInstance("", "", "", QDate()); - } - - if (sortOptionsSelector->currentText() == SORT_OPTIONS_PREFERENCE) { - std::sort(sortedSets.begin(), sortedSets.end(), SetPriorityComparator()); - std::reverse(sortedSets.begin(), sortedSets.end()); - } else if (sortOptionsSelector->currentText() == SORT_OPTIONS_RELEASE_DATE) { - std::sort(sortedSets.begin(), sortedSets.end(), SetReleaseDateComparator()); - } - - QList sortedCardInfoPerSets; - // Reconstruct sorted list of CardInfoPerSet - for (const auto &set : sortedSets) { - for (auto it = cardInfoPerSets.begin(); it != cardInfoPerSets.end(); ++it) { - for (const auto &x : it.value()) { - if (x.getPtr() == set) { - sortedCardInfoPerSets << it.value(); - break; - } - } - } - } - - if (descendingSort) { - std::reverse(sortedCardInfoPerSets.begin(), sortedCardInfoPerSets.end()); - } - - return sortedCardInfoPerSets; -} - -QList PrintingSelector::filterSets(const QList &sets) const -{ - const QString searchText = searchBar->text().trimmed().toLower(); - - if (searchText.isEmpty()) { - return sets; - } - - QList filteredSets; - - for (const auto &set : sets) { - const QString longName = set.getPtr()->getLongName().toLower(); - const QString shortName = set.getPtr()->getShortName().toLower(); - - if (longName.contains(searchText) || shortName.contains(searchText)) { - filteredSets << set; - } - } - - return filteredSets; -} - void PrintingSelector::getAllSetsForCurrentCard() { - const QList sortedSets = sortSets(); - const QList filteredSets = filterSets(sortedSets); + if (selectedCard.isNull()) { + return; + } + + CardInfoPerSetMap cardInfoPerSets = selectedCard->getSets(); + const QList sortedSets = sortToolBar->sortSets(cardInfoPerSets); + const QList filteredSets = sortToolBar->filterSets(sortedSets, searchBar->text().trimmed().toLower()); QList setsToUse; if (SettingsCache::instance().getBumpSetsWithCardsInDeckToTop()) { - setsToUse = prependPrintingsInDeck(filteredSets); + setsToUse = sortToolBar->prependPrintingsInDeck(filteredSets, selectedCard, deckModel); } else { setsToUse = filteredSets; } diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.h b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.h index e4b151dc2..c1d20bedb 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.h +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.h @@ -17,6 +17,7 @@ #define BATCH_SIZE 10 class PrintingSelectorCardSelectionWidget; +class PrintingSelectorCardSortingWidget; class TabDeckEditor; class PrintingSelector : public QWidget { @@ -26,29 +27,16 @@ public: PrintingSelector(QWidget *parent, TabDeckEditor *deckEditor, DeckListModel *deckModel, QTreeView *deckView); void setCard(const CardInfoPtr &newCard, const QString &_currentZone); CardInfoPerSet getSetForUUID(const QString &uuid); - QList prependPrintingsInDeck(const QList &sets); - QList sortSets(); - QList filterSets(const QList &sets) const; void getAllSetsForCurrentCard(); public slots: void updateDisplay(); void selectPreviousCard(); void selectNextCard(); - void updateSortOrder(); private: QVBoxLayout *layout; - QHBoxLayout *sortToolBar; - static const QString SORT_OPTIONS_ALPHABETICAL; - static const QString SORT_OPTIONS_PREFERENCE; - static const QString SORT_OPTIONS_RELEASE_DATE; - static const QString SORT_OPTIONS_CONTAINED_IN_DECK; - static const QString SORT_OPTIONS_POTENTIAL_CARDS; - static const QStringList SORT_OPTIONS; - QComboBox *sortOptionsSelector; - bool descendingSort; - QPushButton *toggleSortOrder; + PrintingSelectorCardSortingWidget *sortToolBar; QLineEdit *searchBar; QTimer *searchDebounceTimer; FlowWidget *flowWidget; diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp new file mode 100644 index 000000000..d0fbf6346 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp @@ -0,0 +1,154 @@ +#include "printing_selector_card_sorting_widget.h" + +#include "../../../../utility/card_set_comparator.h" + +const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_ALPHABETICAL = tr("Alphabetical"); +const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_PREFERENCE = tr("Preference"); +const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_RELEASE_DATE = tr("Release Date"); +const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_CONTAINED_IN_DECK = tr("Contained in Deck"); +const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_POTENTIAL_CARDS = tr("Potential Cards in Deck"); + +const QStringList PrintingSelectorCardSortingWidget::SORT_OPTIONS = { + SORT_OPTIONS_ALPHABETICAL, SORT_OPTIONS_PREFERENCE, SORT_OPTIONS_RELEASE_DATE, SORT_OPTIONS_CONTAINED_IN_DECK, + SORT_OPTIONS_POTENTIAL_CARDS}; + +PrintingSelectorCardSortingWidget::PrintingSelectorCardSortingWidget(PrintingSelector *parent) : parent(parent) +{ + sortToolBar = new QHBoxLayout(this); + + sortOptionsSelector = new QComboBox(this); + sortOptionsSelector->addItems(SORT_OPTIONS); + sortOptionsSelector->setCurrentIndex(2); + connect(sortOptionsSelector, &QComboBox::currentTextChanged, parent, &PrintingSelector::updateDisplay); + sortToolBar->addWidget(sortOptionsSelector); + + toggleSortOrder = new QPushButton(this); + toggleSortOrder->setText(tr("Descending")); + descendingSort = true; + connect(toggleSortOrder, &QPushButton::clicked, this, &PrintingSelectorCardSortingWidget::updateSortOrder); + sortToolBar->addWidget(toggleSortOrder); +} + +void PrintingSelectorCardSortingWidget::updateSortOrder() +{ + if (descendingSort) { + toggleSortOrder->setText(tr("Ascending")); + } else { + toggleSortOrder->setText(tr("Descending")); + } + descendingSort = !descendingSort; + parent->updateDisplay(); +} + +QList PrintingSelectorCardSortingWidget::sortSets(CardInfoPerSetMap cardInfoPerSets) +{ + QList sortedSets; + + for (const auto &x : cardInfoPerSets) { + for (const auto &set : x) { + sortedSets << set.getPtr(); + break; + } + } + + if (sortedSets.empty()) { + sortedSets << CardSet::newInstance("", "", "", QDate()); + } + + if (sortOptionsSelector->currentText() == SORT_OPTIONS_PREFERENCE) { + std::sort(sortedSets.begin(), sortedSets.end(), SetPriorityComparator()); + std::reverse(sortedSets.begin(), sortedSets.end()); + } else if (sortOptionsSelector->currentText() == SORT_OPTIONS_RELEASE_DATE) { + std::sort(sortedSets.begin(), sortedSets.end(), SetReleaseDateComparator()); + } + + QList sortedCardInfoPerSets; + // Reconstruct sorted list of CardInfoPerSet + for (const auto &set : sortedSets) { + for (auto it = cardInfoPerSets.begin(); it != cardInfoPerSets.end(); ++it) { + for (const auto &x : it.value()) { + if (x.getPtr() == set) { + sortedCardInfoPerSets << it.value(); + break; + } + } + } + } + + if (descendingSort) { + std::reverse(sortedCardInfoPerSets.begin(), sortedCardInfoPerSets.end()); + } + + return sortedCardInfoPerSets; +} + +QList PrintingSelectorCardSortingWidget::filterSets(const QList &sets, + const QString searchText) const +{ + if (searchText.isEmpty()) { + return sets; + } + + QList filteredSets; + + for (const auto &set : sets) { + const QString longName = set.getPtr()->getLongName().toLower(); + const QString shortName = set.getPtr()->getShortName().toLower(); + + if (longName.contains(searchText) || shortName.contains(searchText)) { + filteredSets << set; + } + } + + return filteredSets; +} + +QList PrintingSelectorCardSortingWidget::prependPrintingsInDeck(const QList &sets, + CardInfoPtr selectedCard, + DeckListModel *deckModel) +{ + if (!selectedCard) { + return {}; + } + + CardInfoPerSetMap cardInfoPerSets = selectedCard->getSets(); + QList> countList; + + // Collect sets with their counts + for (const auto &x : cardInfoPerSets) { + for (const auto &cardInfoPerSet : x) { + QModelIndex find_card = + deckModel->findCard(selectedCard->getName(), DECK_ZONE_MAIN, cardInfoPerSet.getProperty("uuid")); + if (find_card.isValid()) { + int count = + deckModel->data(find_card, Qt::DisplayRole).toInt(); // Ensure the count is treated as an integer + if (count > 0) { + countList.append(qMakePair(cardInfoPerSet, count)); + } + } + break; + } + } + + // Sort sets by count in descending numerical order + std::sort(countList.begin(), countList.end(), + [](const QPair &a, const QPair &b) { + return a.second > b.second; // Ensure numerical comparison + }); + + // Create a copy of the original list to modify + QList result = sets; + + // Prepend sorted sets and remove them from the original list + for (const auto &pair : countList) { + auto it = std::find_if(result.begin(), result.end(), [&pair](const CardInfoPerSet &item) { + return item.getProperty("uuid") == pair.first.getProperty("uuid"); + }); + if (it != result.end()) { + result.erase(it); // Remove the matching entry + } + result.prepend(pair.first); // Prepend the sorted item + } + + return result; +} \ No newline at end of file diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h new file mode 100644 index 000000000..862869904 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h @@ -0,0 +1,35 @@ +#ifndef PRINTING_SELECTOR_CARD_SORTING_WIDGET_H +#define PRINTING_SELECTOR_CARD_SORTING_WIDGET_H + +#include "printing_selector.h" + +#include + +class PrintingSelectorCardSortingWidget : public QWidget +{ + Q_OBJECT +public: + explicit PrintingSelectorCardSortingWidget(PrintingSelector *parent); + QList sortSets(CardInfoPerSetMap cardInfoPerSets); + QList filterSets(const QList &sets, QString searchText) const; + QList + prependPrintingsInDeck(const QList &sets, CardInfoPtr selectedCard, DeckListModel *deckModel); + +public slots: + void updateSortOrder(); + +private: + PrintingSelector *parent; + QHBoxLayout *sortToolBar; + static const QString SORT_OPTIONS_ALPHABETICAL; + static const QString SORT_OPTIONS_PREFERENCE; + static const QString SORT_OPTIONS_RELEASE_DATE; + static const QString SORT_OPTIONS_CONTAINED_IN_DECK; + static const QString SORT_OPTIONS_POTENTIAL_CARDS; + static const QStringList SORT_OPTIONS; + QComboBox *sortOptionsSelector; + bool descendingSort; + QPushButton *toggleSortOrder; +}; + +#endif // PRINTING_SELECTOR_CARD_SORTING_WIDGET_H