From 7d76319faaee8b43bbc463653f08ef02dca85c14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Tue, 25 Feb 2025 08:58:11 +0100 Subject: [PATCH] Add a sample hand widget. --- .../tab_deck_editor_visual.cpp | 2 +- .../tab_deck_editor_visual_tab_widget.cpp | 3 + .../tab_deck_editor_visual_tab_widget.h | 2 + .../visual_deck_editor_sample_hand_widget.cpp | 100 ++++++++++++++++++ .../visual_deck_editor_sample_hand_widget.h | 28 +++++ 5 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp create mode 100644 cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.h diff --git a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index e6751e44f..26422d702 100644 --- a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -393,12 +393,12 @@ void TabDeckEditorVisual::openDeckFromFile(const QString &fileName, DeckOpenLoca deckMenu->setSaveStatus(true); tabContainer->visualDeckView->updateDisplay(); tabContainer->deckAnalytics->refreshDisplays(deckDockWidget->deckModel); + tabContainer->sampleHandWidget->setDeckModel(deckDockWidget->deckModel); } void TabDeckEditorVisual::setDeck(DeckLoader *_deck) { TabGenericDeckEditor::setDeck(_deck); - qDebug() << "set the deck"; } void TabDeckEditorVisual::showPrintingSelector() diff --git a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp index b88b3ffb5..5fb68cac9 100644 --- a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp +++ b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp @@ -38,11 +38,14 @@ TabDeckEditorVisualTabWidget::TabDeckEditorVisualTabWidget(QWidget *parent, deckAnalytics = new DeckAnalyticsWidget(this, deckModel); deckAnalytics->setObjectName("deckAnalytics"); + sampleHandWidget = new VisualDeckEditorSampleHandWidget(this, deckModel); + // printingSelector = new PrintingSelector(this, this->deckModel); this->addNewTab(visualDeckView, "Visual Deck View"); this->addNewTab(visualDatabaseDisplay, "Visual Database Display"); this->addNewTab(deckAnalytics, "Deck Analytics"); + this->addNewTab(sampleHandWidget, "Sample Hand"); } void TabDeckEditorVisualTabWidget::onCardChanged(CardInfoPtr activeCard) diff --git a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.h b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.h index 00da329d1..1dd0ef462 100644 --- a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.h +++ b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.h @@ -4,6 +4,7 @@ #include "../../ui/widgets/deck_analytics/deck_analytics_widget.h" #include "../../ui/widgets/printing_selector/printing_selector.h" #include "../../ui/widgets/visual_database_display/visual_database_display_widget.h" +#include "../../ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.h" #include "../../ui/widgets/visual_deck_editor/visual_deck_editor_widget.h" #include "../tab_generic_deck_editor.h" @@ -33,6 +34,7 @@ public: DeckAnalyticsWidget *deckAnalytics; VisualDatabaseDisplayWidget *visualDatabaseDisplay; PrintingSelector *printingSelector; + VisualDeckEditorSampleHandWidget *sampleHandWidget; public slots: void onCardChanged(CardInfoPtr activeCard); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp new file mode 100644 index 000000000..0d2b410ff --- /dev/null +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp @@ -0,0 +1,100 @@ +#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 + +VisualDeckEditorSampleHandWidget::VisualDeckEditorSampleHandWidget(QWidget *parent, DeckListModel *_deckListModel) + : QWidget(parent), deckListModel(_deckListModel) +{ + layout = new QVBoxLayout(this); + setLayout(layout); + + resetButton = new QPushButton("Reset"); + 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::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 VisualDeckEditorSampleHandWidget::getRandomCards(int amountToGet) +{ + QList mainDeckCards; + QList 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(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(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; +} diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.h new file mode 100644 index 000000000..d6ebfa906 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.h @@ -0,0 +1,28 @@ +#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 +#include + +class VisualDeckEditorSampleHandWidget : public QWidget +{ + Q_OBJECT +public: + VisualDeckEditorSampleHandWidget(QWidget *parent, DeckListModel *deckListModel); + QList getRandomCards(int amountToGet); + +public slots: + void updateDisplay(); + void setDeckModel(DeckListModel *deckModel); + +private: + DeckListModel *deckListModel; + QVBoxLayout *layout; + QPushButton *resetButton; + FlowWidget *flowWidget; +}; + +#endif // VISUAL_DECK_EDITOR_SAMPLE_HAND_WIDGET_H