[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.
This commit is contained in:
BruebachL 2025-12-02 13:51:08 +01:00 committed by GitHub
parent 364d0ca52b
commit f0ebd28148
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 215 additions and 202 deletions

View file

@ -10,8 +10,8 @@
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/deck_list/deck_list.h>
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<QString, int> ManaBaseWidget::analyzeManaBase()
{
manaBaseMap.clear();
QList<DecklistCardNode *> 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<QString, int> ManaBaseWidget::determineManaProduction(const QString &rulesText)
{
QHash<QString, int> 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<QString, int> &manaCounts1, const QHash<QString, int> &manaCounts2)
{
for (auto it = manaCounts2.constBegin(); it != manaCounts2.constEnd(); ++it) {
manaCounts1[it.key()] += it.value();
}
}