Implement deck analytics widgets. (#5837)

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
BruebachL 2025-04-16 16:23:13 +02:00 committed by GitHub
parent 67db245aea
commit 854208ea0a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 782 additions and 1 deletions

View file

@ -0,0 +1,105 @@
#include "visual_deck_editor_sample_hand_widget.h"
#include "../../../../deck/deck_loader.h"
#include "../../../../game/cards/card_database_manager.h"
#include "../cards/card_info_picture_widget.h"
#include <random>
VisualDeckEditorSampleHandWidget::VisualDeckEditorSampleHandWidget(QWidget *parent, DeckListModel *_deckListModel)
: QWidget(parent), deckListModel(_deckListModel)
{
layout = new QVBoxLayout(this);
setLayout(layout);
resetButton = new QPushButton(this);
connect(resetButton, SIGNAL(clicked()), this, SLOT(updateDisplay()));
layout->addWidget(resetButton);
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff);
layout->addWidget(flowWidget);
for (CardInfoPtr card : getRandomCards(7)) {
auto displayWidget = new CardInfoPictureWidget(this);
displayWidget->setCard(card);
flowWidget->addWidget(displayWidget);
}
}
void VisualDeckEditorSampleHandWidget::retranslateUi()
{
resetButton->setText(tr("Reset"));
}
void VisualDeckEditorSampleHandWidget::setDeckModel(DeckListModel *deckModel)
{
deckListModel = deckModel;
// connect(deckListModel, &DeckListModel::dataChanged, this, &VisualDeckEditorSampleHandWidget::updateDisplay);
updateDisplay();
}
void VisualDeckEditorSampleHandWidget::updateDisplay()
{
flowWidget->clearLayout();
for (CardInfoPtr card : getRandomCards(7)) {
auto displayWidget = new CardInfoPictureWidget(this);
displayWidget->setCard(card);
flowWidget->addWidget(displayWidget);
}
}
QList<CardInfoPtr> VisualDeckEditorSampleHandWidget::getRandomCards(int amountToGet)
{
QList<CardInfoPtr> mainDeckCards;
QList<CardInfoPtr> randomCards;
if (!deckListModel)
return randomCards;
DeckList *decklist = deckListModel->getDeckList();
if (!decklist)
return randomCards;
InnerDecklistNode *listRoot = decklist->getRoot();
if (!listRoot)
return randomCards;
// Collect all cards in the main deck, allowing duplicates based on their count
for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
if (!currentZone)
continue;
if (currentZone->getName() != DECK_ZONE_MAIN)
continue; // Only process the main deck
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(
currentCard->getName(), currentCard->getCardProviderId());
if (info) {
mainDeckCards.append(info);
}
}
}
}
if (mainDeckCards.isEmpty())
return randomCards;
// Shuffle the deck
std::random_device rd;
std::mt19937 rng(rd());
std::shuffle(mainDeckCards.begin(), mainDeckCards.end(), rng);
// Select amountToGet cards
for (int i = 0; i < qMin(amountToGet, mainDeckCards.size()); ++i) {
randomCards.append(mainDeckCards.at(i));
}
std::sort(randomCards.begin(), randomCards.end(),
[](const CardInfoPtr &a, const CardInfoPtr &b) { return a->getCmc() < b->getCmc(); });
return randomCards;
}

View file

@ -0,0 +1,29 @@
#ifndef VISUAL_DECK_EDITOR_SAMPLE_HAND_WIDGET_H
#define VISUAL_DECK_EDITOR_SAMPLE_HAND_WIDGET_H
#include "../../../../deck/deck_list_model.h"
#include "../general/layout_containers/flow_widget.h"
#include <QPushButton>
#include <QWidget>
class VisualDeckEditorSampleHandWidget : public QWidget
{
Q_OBJECT
public:
VisualDeckEditorSampleHandWidget(QWidget *parent, DeckListModel *deckListModel);
QList<CardInfoPtr> getRandomCards(int amountToGet);
public slots:
void updateDisplay();
void setDeckModel(DeckListModel *deckModel);
void retranslateUi();
private:
DeckListModel *deckListModel;
QVBoxLayout *layout;
QPushButton *resetButton;
FlowWidget *flowWidget;
};
#endif // VISUAL_DECK_EDITOR_SAMPLE_HAND_WIDGET_H