From f0ebd281487ffb53e80aa775bf1b103cf5cf30de Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Tue, 2 Dec 2025 13:51:08 +0100 Subject: [PATCH] [VDE] Consolidate statistical analysis into a separate object (#6392) * [VDE] Consolidate statistical analysis into a separate object so multiple widgets can re-use calculations and calculation is only performed once on data change. * [VDE] Lint. * [VDE] Move struct up to not confuse compiler. * [VDE] NoDiscards * [VDE] Move variables * [VDE] Lint. --- cockatrice/CMakeLists.txt | 1 + .../deck_analytics/deck_analytics_widget.cpp | 15 +-- .../deck_analytics/deck_analytics_widget.h | 3 +- .../deck_list_statistics_analyzer.cpp | 120 ++++++++++++++++++ .../deck_list_statistics_analyzer.h | 60 +++++++++ .../deck_analytics/mana_base_widget.cpp | 68 +--------- .../widgets/deck_analytics/mana_base_widget.h | 11 +- .../deck_analytics/mana_curve_widget.cpp | 36 +----- .../deck_analytics/mana_curve_widget.h | 8 +- .../deck_analytics/mana_devotion_widget.cpp | 82 +----------- .../deck_analytics/mana_devotion_widget.h | 11 +- .../tab_deck_editor_visual.cpp | 2 +- 12 files changed, 215 insertions(+), 202 deletions(-) create mode 100644 cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp create mode 100644 cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index eacbc8825..1dbeddc5e 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -142,6 +142,7 @@ set(cockatrice_SOURCES src/interface/widgets/cards/deck_card_zone_display_widget.cpp src/interface/widgets/cards/deck_preview_card_picture_widget.cpp src/interface/widgets/deck_analytics/deck_analytics_widget.cpp + src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp src/interface/widgets/deck_analytics/mana_base_widget.cpp src/interface/widgets/deck_analytics/mana_curve_widget.cpp src/interface/widgets/deck_analytics/mana_devotion_widget.cpp diff --git a/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.cpp index 2131700fd..45393bb5d 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.cpp @@ -17,20 +17,19 @@ DeckAnalyticsWidget::DeckAnalyticsWidget(QWidget *parent, DeckListModel *_deckLi container->setLayout(containerLayout); scrollArea->setWidget(container); - manaCurveWidget = new ManaCurveWidget(this, deckListModel); + deckListStatisticsAnalyzer = new DeckListStatisticsAnalyzer(this, deckListModel); + + manaCurveWidget = new ManaCurveWidget(this, deckListStatisticsAnalyzer); containerLayout->addWidget(manaCurveWidget); - manaDevotionWidget = new ManaDevotionWidget(this, deckListModel); + manaDevotionWidget = new ManaDevotionWidget(this, deckListStatisticsAnalyzer); containerLayout->addWidget(manaDevotionWidget); - manaBaseWidget = new ManaBaseWidget(this, deckListModel); + manaBaseWidget = new ManaBaseWidget(this, deckListStatisticsAnalyzer); containerLayout->addWidget(manaBaseWidget); } -void DeckAnalyticsWidget::refreshDisplays(DeckListModel *_deckModel) +void DeckAnalyticsWidget::refreshDisplays() { - deckListModel = _deckModel; - manaCurveWidget->setDeckModel(_deckModel); - manaDevotionWidget->setDeckModel(_deckModel); - manaBaseWidget->setDeckModel(_deckModel); + deckListStatisticsAnalyzer->update(); } diff --git a/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.h b/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.h index e2f00bf0d..524362aed 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.h +++ b/cockatrice/src/interface/widgets/deck_analytics/deck_analytics_widget.h @@ -24,10 +24,11 @@ public: explicit DeckAnalyticsWidget(QWidget *parent, DeckListModel *deckListModel); void setDeckList(const DeckList &_deckListModel); std::map analyzeManaCurve(); - void refreshDisplays(DeckListModel *_deckListModel); + void refreshDisplays(); private: DeckListModel *deckListModel; + DeckListStatisticsAnalyzer *deckListStatisticsAnalyzer; QVBoxLayout *mainLayout; QWidget *container; diff --git a/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp b/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp new file mode 100644 index 000000000..a5ddf37a1 --- /dev/null +++ b/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp @@ -0,0 +1,120 @@ +#include "deck_list_statistics_analyzer.h" + +#include "deck_list_model.h" +#include "deck_list_statistics_analyzer.h" + +#include +#include +#include + +DeckListStatisticsAnalyzer::DeckListStatisticsAnalyzer(QObject *parent, + DeckListModel *_model, + DeckListStatisticsAnalyzerConfig cfg) + : QObject(parent), model(_model), config(cfg) +{ + connect(model, &DeckListModel::dataChanged, this, &DeckListStatisticsAnalyzer::update); +} + +void DeckListStatisticsAnalyzer::update() +{ + manaBaseMap.clear(); + manaCurveMap.clear(); + manaDevotionMap.clear(); + + auto nodes = model->getDeckList()->getCardNodes(); + + for (auto *node : nodes) { + CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(node->getName()); + if (!info) + continue; + + for (int i = 0; i < node->getNumber(); ++i) { + // ---- Mana curve ---- + if (config.computeManaCurve) { + manaCurveMap[info->getCmc().toInt()]++; + } + + // ---- Mana base ---- + if (config.computeManaBase) { + auto mana = determineManaProduction(info->getText()); + for (auto it = mana.begin(); it != mana.end(); ++it) + manaBaseMap[it.key()] += it.value(); + } + + // ---- Devotion ---- + if (config.computeDevotion) { + auto devo = countManaSymbols(info->getManaCost()); + for (auto &d : devo) + manaDevotionMap[d.first] += d.second; + } + } + } + + emit statsUpdated(); +} + +QHash DeckListStatisticsAnalyzer::determineManaProduction(const QString &rulesText) +{ + QHash manaCounts = {{"W", 0}, {"U", 0}, {"B", 0}, {"R", 0}, {"G", 0}, {"C", 0}}; + + QString text = rulesText.toLower(); // Normalize case for matching + + // Quick keyword-based checks for any color and colorless mana + if (text.contains("{t}: add one mana of any color") || text.contains("add one mana of any color")) { + for (const auto &color : {QStringLiteral("W"), QStringLiteral("U"), QStringLiteral("B"), QStringLiteral("R"), + QStringLiteral("G")}) { + manaCounts[color]++; + } + } + if (text.contains("{t}: add {c}") || text.contains("add one colorless mana")) { + manaCounts["C"]++; + } + + // Optimized regex for specific mana symbols + static const QRegularExpression specificColorRegex(R"(\{T\}:\s*Add\s*\{([WUBRG])\})"); + QRegularExpressionMatch match = specificColorRegex.match(rulesText); + if (match.hasMatch()) { + manaCounts[match.captured(1)]++; + } + + return manaCounts; +} + +std::unordered_map DeckListStatisticsAnalyzer::countManaSymbols(const QString &manaString) +{ + std::unordered_map manaCounts = {{'W', 0}, {'U', 0}, {'B', 0}, {'R', 0}, {'G', 0}}; + + int len = manaString.length(); + for (int i = 0; i < len; ++i) { + if (manaString[i] == '{') { + ++i; // Move past '{' + if (i < len && manaCounts.find(manaString[i].toLatin1()) != manaCounts.end()) { + char mana1 = manaString[i].toLatin1(); + ++i; // Move to next character + if (i < len && manaString[i] == '/') { + ++i; // Move past '/' + if (i < len && manaCounts.find(manaString[i].toLatin1()) != manaCounts.end()) { + char mana2 = manaString[i].toLatin1(); + manaCounts[mana1]++; + manaCounts[mana2]++; + } else { + // Handle cases like "{W/}" where second part is invalid + manaCounts[mana1]++; + } + } else { + manaCounts[mana1]++; + } + } + // Ensure we always skip to the closing '}' + while (i < len && manaString[i] != '}') { + ++i; + } + } + // Check if the character is a standalone mana symbol (not inside {}) + else if (manaCounts.find(manaString[i].toLatin1()) != manaCounts.end()) { + manaCounts[manaString[i].toLatin1()]++; + } + } + + return manaCounts; +} diff --git a/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.h b/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.h new file mode 100644 index 000000000..8fa033971 --- /dev/null +++ b/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.h @@ -0,0 +1,60 @@ +#ifndef COCKATRICE_DECK_LIST_STATISTICS_ANALYZER_H +#define COCKATRICE_DECK_LIST_STATISTICS_ANALYZER_H + +#include "deck_list_model.h" + +#include +#include +#include + +class DeckListModel; + +struct DeckListStatisticsAnalyzerConfig +{ + bool computeManaBase = true; + bool computeManaCurve = true; + bool computeDevotion = true; +}; + +class DeckListStatisticsAnalyzer : public QObject +{ + Q_OBJECT + +public: + explicit DeckListStatisticsAnalyzer(QObject *parent, + DeckListModel *model, + DeckListStatisticsAnalyzerConfig cfg = DeckListStatisticsAnalyzerConfig()); + + void update(); + + [[nodiscard]] const QHash &getManaBase() const + { + return manaBaseMap; + } + [[nodiscard]] const std::unordered_map &getManaCurve() const + { + return manaCurveMap; + } + [[nodiscard]] const std::unordered_map &getDevotion() const + { + return manaDevotionMap; + } + +signals: + void statsUpdated(); + +private: + DeckListModel *model; + DeckListStatisticsAnalyzerConfig config; + + // Internal result containers + QHash manaBaseMap; + std::unordered_map manaCurveMap; + std::unordered_map manaDevotionMap; + + // Internal helper functions + QHash determineManaProduction(const QString &); + std::unordered_map countManaSymbols(const QString &); +}; + +#endif // COCKATRICE_DECK_LIST_STATISTICS_ANALYZER_H diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp index 568583af5..2e530db0b 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp @@ -10,8 +10,8 @@ #include #include -ManaBaseWidget::ManaBaseWidget(QWidget *parent, DeckListModel *_deckListModel) - : QWidget(parent), deckListModel(_deckListModel) +ManaBaseWidget::ManaBaseWidget(QWidget *parent, DeckListStatisticsAnalyzer *_deckStatAnalyzer) + : QWidget(parent), deckStatAnalyzer(_deckStatAnalyzer) { layout = new QVBoxLayout(this); setLayout(layout); @@ -24,7 +24,7 @@ ManaBaseWidget::ManaBaseWidget(QWidget *parent, DeckListModel *_deckListModel) barLayout = new QHBoxLayout(barContainer); layout->addWidget(barContainer); - connect(deckListModel, &DeckListModel::dataChanged, this, &ManaBaseWidget::analyzeManaBase); + connect(deckStatAnalyzer, &DeckListStatisticsAnalyzer::statsUpdated, this, &ManaBaseWidget::updateDisplay); retranslateUi(); } @@ -34,13 +34,6 @@ void ManaBaseWidget::retranslateUi() bannerWidget->setText(tr("Mana Base")); } -void ManaBaseWidget::setDeckModel(DeckListModel *deckModel) -{ - deckListModel = deckModel; - connect(deckListModel, &DeckListModel::dataChanged, this, &ManaBaseWidget::analyzeManaBase); - analyzeManaBase(); -} - void ManaBaseWidget::updateDisplay() { // Clear the layout first @@ -50,6 +43,8 @@ void ManaBaseWidget::updateDisplay() delete item; } + auto manaBaseMap = deckStatAnalyzer->getManaBase(); + int highestEntry = 0; for (auto entry : manaBaseMap) { if (entry > highestEntry) { @@ -74,56 +69,3 @@ void ManaBaseWidget::updateDisplay() update(); } - -QHash ManaBaseWidget::analyzeManaBase() -{ - manaBaseMap.clear(); - QList cardsInDeck = deckListModel->getDeckList()->getCardNodes(); - - for (auto currentCard : cardsInDeck) { - for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); - if (info) { - auto devotion = determineManaProduction(info->getText()); - mergeManaCounts(manaBaseMap, devotion); - } - } - } - - updateDisplay(); - return manaBaseMap; -} - -QHash ManaBaseWidget::determineManaProduction(const QString &rulesText) -{ - QHash manaCounts = {{"W", 0}, {"U", 0}, {"B", 0}, {"R", 0}, {"G", 0}, {"C", 0}}; - - QString text = rulesText.toLower(); // Normalize case for matching - - // Quick keyword-based checks for any color and colorless mana - if (text.contains("{t}: add one mana of any color") || text.contains("add one mana of any color")) { - for (const auto &color : {QStringLiteral("W"), QStringLiteral("U"), QStringLiteral("B"), QStringLiteral("R"), - QStringLiteral("G")}) { - manaCounts[color]++; - } - } - if (text.contains("{t}: add {c}") || text.contains("add one colorless mana")) { - manaCounts["C"]++; - } - - // Optimized regex for specific mana symbols - static const QRegularExpression specificColorRegex(R"(\{T\}:\s*Add\s*\{([WUBRG])\})"); - QRegularExpressionMatch match = specificColorRegex.match(rulesText); - if (match.hasMatch()) { - manaCounts[match.captured(1)]++; - } - - return manaCounts; -} - -void ManaBaseWidget::mergeManaCounts(QHash &manaCounts1, const QHash &manaCounts2) -{ - for (auto it = manaCounts2.constBegin(); it != manaCounts2.constEnd(); ++it) { - manaCounts1[it.key()] += it.value(); - } -} diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.h b/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.h index e88fe3b85..079449353 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.h +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.h @@ -8,6 +8,7 @@ #define MANA_BASE_WIDGET_H #include "../general/display/banner_widget.h" +#include "deck_list_statistics_analyzer.h" #include #include @@ -20,21 +21,15 @@ class ManaBaseWidget : public QWidget Q_OBJECT public: - explicit ManaBaseWidget(QWidget *parent, DeckListModel *deckListModel); - QHash analyzeManaBase(); + explicit ManaBaseWidget(QWidget *parent, DeckListStatisticsAnalyzer *deckStatAnalyzer); void updateDisplay(); - QHash determineManaProduction(const QString &manaString); - void mergeManaCounts(QHash &manaCounts1, const QHash &manaCounts2); - public slots: - void setDeckModel(DeckListModel *deckModel); void retranslateUi(); private: - DeckListModel *deckListModel; + DeckListStatisticsAnalyzer *deckStatAnalyzer; BannerWidget *bannerWidget; - QHash manaBaseMap; QVBoxLayout *layout; QWidget *barContainer; QHBoxLayout *barLayout; diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp index 4515b723b..c094eb590 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp @@ -10,8 +10,8 @@ #include #include -ManaCurveWidget::ManaCurveWidget(QWidget *parent, DeckListModel *_deckListModel) - : QWidget(parent), deckListModel(_deckListModel) +ManaCurveWidget::ManaCurveWidget(QWidget *parent, DeckListStatisticsAnalyzer *_deckStatAnalyzer) + : QWidget(parent), deckStatAnalyzer(_deckStatAnalyzer) { layout = new QVBoxLayout(this); setLayout(layout); @@ -24,7 +24,7 @@ ManaCurveWidget::ManaCurveWidget(QWidget *parent, DeckListModel *_deckListModel) barLayout = new QHBoxLayout(barContainer); layout->addWidget(barContainer); - connect(deckListModel, &DeckListModel::dataChanged, this, &ManaCurveWidget::analyzeManaCurve); + connect(deckStatAnalyzer, &DeckListStatisticsAnalyzer::statsUpdated, this, &ManaCurveWidget::updateDisplay); retranslateUi(); } @@ -34,34 +34,6 @@ void ManaCurveWidget::retranslateUi() bannerWidget->setText(tr("Mana Curve")); } -void ManaCurveWidget::setDeckModel(DeckListModel *deckModel) -{ - deckListModel = deckModel; - connect(deckListModel, &DeckListModel::dataChanged, this, &ManaCurveWidget::analyzeManaCurve); - analyzeManaCurve(); -} - -std::unordered_map ManaCurveWidget::analyzeManaCurve() -{ - manaCurveMap.clear(); - - QList cardsInDeck = deckListModel->getDeckList()->getCardNodes(); - - for (auto currentCard : cardsInDeck) { - for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); - if (info) { - int cmc = info->getCmc().toInt(); - manaCurveMap[cmc]++; - } - } - } - - updateDisplay(); - - return manaCurveMap; -} - void ManaCurveWidget::updateDisplay() { // Clear the layout first @@ -73,6 +45,8 @@ void ManaCurveWidget::updateDisplay() } } + auto manaCurveMap = deckStatAnalyzer->getManaCurve(); + int highestEntry = 0; for (const auto &entry : manaCurveMap) { if (entry.second > highestEntry) { diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.h b/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.h index 7362e0c72..fad1fb0f8 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.h +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.h @@ -8,6 +8,7 @@ #define MANA_CURVE_WIDGET_H #include "../general/display/banner_widget.h" +#include "deck_list_statistics_analyzer.h" #include #include @@ -19,17 +20,14 @@ class ManaCurveWidget : public QWidget Q_OBJECT public: - explicit ManaCurveWidget(QWidget *parent, DeckListModel *deckListModel); + explicit ManaCurveWidget(QWidget *parent, DeckListStatisticsAnalyzer *deckStatAnalyzer); void updateDisplay(); public slots: - void setDeckModel(DeckListModel *deckModel); - std::unordered_map analyzeManaCurve(); void retranslateUi(); private: - DeckListModel *deckListModel; - std::unordered_map manaCurveMap; + DeckListStatisticsAnalyzer *deckStatAnalyzer; QVBoxLayout *layout; BannerWidget *bannerWidget; QWidget *barContainer; diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp index 63e4255b5..476bb8077 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp @@ -10,8 +10,8 @@ #include #include -ManaDevotionWidget::ManaDevotionWidget(QWidget *parent, DeckListModel *_deckListModel) - : QWidget(parent), deckListModel(_deckListModel) +ManaDevotionWidget::ManaDevotionWidget(QWidget *parent, DeckListStatisticsAnalyzer *_deckStatAnalyzer) + : QWidget(parent), deckStatAnalyzer(_deckStatAnalyzer) { layout = new QVBoxLayout(this); setLayout(layout); @@ -23,7 +23,7 @@ ManaDevotionWidget::ManaDevotionWidget(QWidget *parent, DeckListModel *_deckList barLayout = new QHBoxLayout(); layout->addLayout(barLayout); - connect(deckListModel, &DeckListModel::dataChanged, this, &ManaDevotionWidget::analyzeManaDevotion); + connect(deckStatAnalyzer, &DeckListStatisticsAnalyzer::statsUpdated, this, &ManaDevotionWidget::updateDisplay); retranslateUi(); } @@ -33,33 +33,6 @@ void ManaDevotionWidget::retranslateUi() bannerWidget->setText(tr("Mana Devotion")); } -void ManaDevotionWidget::setDeckModel(DeckListModel *deckModel) -{ - deckListModel = deckModel; - connect(deckListModel, &DeckListModel::dataChanged, this, &ManaDevotionWidget::analyzeManaDevotion); - analyzeManaDevotion(); -} - -std::unordered_map ManaDevotionWidget::analyzeManaDevotion() -{ - manaDevotionMap.clear(); - - QList cardsInDeck = deckListModel->getDeckList()->getCardNodes(); - - for (auto currentCard : cardsInDeck) { - for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); - if (info) { - auto devotion = countManaSymbols(info->getManaCost()); - mergeManaCounts(manaDevotionMap, devotion); - } - } - } - - updateDisplay(); - return manaDevotionMap; -} - void ManaDevotionWidget::updateDisplay() { // Clear the layout first @@ -69,6 +42,8 @@ void ManaDevotionWidget::updateDisplay() delete item; } + auto manaDevotionMap = deckStatAnalyzer->getDevotion(); + int highestEntry = 0; for (auto entry : manaDevotionMap) { if (highestEntry < entry.second) { @@ -89,50 +64,3 @@ void ManaDevotionWidget::updateDisplay() update(); // Update the widget display } - -std::unordered_map ManaDevotionWidget::countManaSymbols(const QString &manaString) -{ - std::unordered_map manaCounts = {{'W', 0}, {'U', 0}, {'B', 0}, {'R', 0}, {'G', 0}}; - - int len = manaString.length(); - for (int i = 0; i < len; ++i) { - if (manaString[i] == '{') { - ++i; // Move past '{' - if (i < len && manaCounts.find(manaString[i].toLatin1()) != manaCounts.end()) { - char mana1 = manaString[i].toLatin1(); - ++i; // Move to next character - if (i < len && manaString[i] == '/') { - ++i; // Move past '/' - if (i < len && manaCounts.find(manaString[i].toLatin1()) != manaCounts.end()) { - char mana2 = manaString[i].toLatin1(); - manaCounts[mana1]++; - manaCounts[mana2]++; - } else { - // Handle cases like "{W/}" where second part is invalid - manaCounts[mana1]++; - } - } else { - manaCounts[mana1]++; - } - } - // Ensure we always skip to the closing '}' - while (i < len && manaString[i] != '}') { - ++i; - } - } - // Check if the character is a standalone mana symbol (not inside {}) - else if (manaCounts.find(manaString[i].toLatin1()) != manaCounts.end()) { - manaCounts[manaString[i].toLatin1()]++; - } - } - - return manaCounts; -} - -void ManaDevotionWidget::mergeManaCounts(std::unordered_map &manaCounts1, - const std::unordered_map &manaCounts2) -{ - for (const auto &pair : manaCounts2) { - manaCounts1[pair.first] += pair.second; // Add values for matching keys - } -} diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.h b/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.h index b8ec7950a..ff2e86159 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.h +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.h @@ -8,6 +8,7 @@ #define MANA_DEVOTION_WIDGET_H #include "../general/display/banner_widget.h" +#include "deck_list_statistics_analyzer.h" #include #include @@ -20,21 +21,15 @@ class ManaDevotionWidget : public QWidget Q_OBJECT public: - explicit ManaDevotionWidget(QWidget *parent, DeckListModel *deckListModel); + explicit ManaDevotionWidget(QWidget *parent, DeckListStatisticsAnalyzer *deckStatAnalyzer); void updateDisplay(); - std::unordered_map countManaSymbols(const QString &manaString); - void mergeManaCounts(std::unordered_map &manaCounts1, const std::unordered_map &manaCounts2); - public slots: - void setDeckModel(DeckListModel *deckModel); - std::unordered_map analyzeManaDevotion(); void retranslateUi(); private: - DeckListModel *deckListModel; + DeckListStatisticsAnalyzer *deckStatAnalyzer; BannerWidget *bannerWidget; - std::unordered_map manaDevotionMap; QVBoxLayout *layout; QHBoxLayout *barLayout; }; diff --git a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index 1540df0bf..6dd55d545 100644 --- a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -84,7 +84,7 @@ void TabDeckEditorVisual::onDeckChanged() { AbstractTabDeckEditor::onDeckModified(); tabContainer->visualDeckView->constructZoneWidgetsFromDeckListModel(); - tabContainer->deckAnalytics->refreshDisplays(deckDockWidget->deckModel); + tabContainer->deckAnalytics->refreshDisplays(); tabContainer->sampleHandWidget->setDeckModel(deckDockWidget->deckModel); }