diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index a0e5ab36c..b12b1a27a 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -35,6 +35,8 @@ set(cockatrice_SOURCES src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_prices.cpp src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_commander_details.cpp src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.cpp + src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp + src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.cpp src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.cpp src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp new file mode 100644 index 000000000..1297fc157 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp @@ -0,0 +1,47 @@ +#include "edhrec_average_deck_api_response.h" + +#include +#include + +void EdhrecAverageDeckApiResponse::fromJson(const QJsonObject &json) +{ + // Parse the collapsed DeckStatistics + deckStats.fromJson(json); + + // Parse Archidekt section + QJsonArray archidektJson = json.value("archidekt").toArray(); + archidekt.fromJson(archidektJson); + + // Parse other fields + similar = json.value("similar").toObject(); + header = json.value("header").toString(); + panels = json.value("panels").toObject(); + description = json.value("description").toString(); + QJsonObject containerJson = json.value("container").toObject(); + container.fromJson(containerJson); + QJsonArray cardsJson = json.value("deck").toArray(); + deck.fromJson(cardsJson); +} + +void EdhrecAverageDeckApiResponse::debugPrint() const +{ + qDebug() << "Deck Statistics:"; + qDebug() << " Creature:" << deckStats.creature; + qDebug() << " Instant:" << deckStats.instant; + qDebug() << " Sorcery:" << deckStats.sorcery; + qDebug() << " Artifact:" << deckStats.artifact; + qDebug() << " Enchantment:" << deckStats.enchantment; + qDebug() << " Battle:" << deckStats.battle; + qDebug() << " Planeswalker:" << deckStats.planeswalker; + qDebug() << " Land:" << deckStats.land; + qDebug() << " Basic:" << deckStats.basic; + qDebug() << " Nonbasic:" << deckStats.nonbasic; + + archidekt.debugPrint(); + + qDebug() << "Similar:" << similar; + qDebug() << "Header:" << header; + qDebug() << "Panels:" << panels; + qDebug() << "Description:" << description; + container.debugPrint(); +} diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.h b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.h new file mode 100644 index 000000000..88927880d --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.h @@ -0,0 +1,30 @@ +#ifndef EDHREC_AVERAGE_DECK_API_RESPONSE_H +#define EDHREC_AVERAGE_DECK_API_RESPONSE_H + +#include "edhrec_deck_api_response.h" +#include "../commander/edhrec_commander_api_response_archidekt_links.h" +#include "../commander/edhrec_commander_api_response_average_deck_statistics.h" +#include "../commander/edhrec_commander_api_response_card_container.h" + +#include +#include +#include + +// Represents the main structure of the JSON +class EdhrecAverageDeckApiResponse +{ +public: + EdhrecCommanderApiResponseAverageDeckStatistics deckStats; + EdhrecCommanderApiResponseArchidektLinks archidekt; + QJsonObject similar; + QString header; + QJsonObject panels; + QString description; + EdhrecCommanderApiResponseCardContainer container; + EdhrecDeckApiResponse deck; + + void fromJson(const QJsonObject &json); + void debugPrint() const; +}; + +#endif // EDHREC_AVERAGE_DECK_API_RESPONSE_H diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp new file mode 100644 index 000000000..a2a015f72 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp @@ -0,0 +1,27 @@ +#include "edhrec_deck_api_response.h" + +#include "../../../../../../deck/deck_loader.h" + +#include +#include +#include +#include +#include + +void EdhrecDeckApiResponse::fromJson(const QJsonArray &json) +{ + QString deckList; + for (const QJsonValue &cardlistValue : json) { + deckList += cardlistValue.toString() + "\n"; + } + + deckLoader = new DeckLoader(); + + QTextStream stream(&deckList); + deckLoader->loadFromStream_Plain(stream, true); +} + +void EdhrecDeckApiResponse::debugPrint() const +{ + qDebug() << "Breadcrumb:"; +} diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.h b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.h new file mode 100644 index 000000000..b888cb134 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.h @@ -0,0 +1,27 @@ +#ifndef EDHREC_DECK_API_RESPONSE_H +#define EDHREC_DECK_API_RESPONSE_H + +#include "../../../../../../deck/deck_loader.h" + +#include +#include +#include +#include +#include + +class EdhrecDeckApiResponse +{ +public: + // Constructor + EdhrecDeckApiResponse() = default; + + // Parse deck-related data from JSON + void fromJson(const QJsonArray &json); + + // Debug method for logging + void debugPrint() const; + + DeckLoader *deckLoader; +}; + +#endif // EDHREC_DECK_API_RESPONSE_H diff --git a/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.cpp index 0cb4d1677..322c65aac 100644 --- a/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.cpp @@ -26,11 +26,13 @@ EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCom salt->setAlignment(Qt::AlignCenter); comboPushButton = new QPushButton(this); + averageDeckPushButton = new QPushButton(this); layout->addWidget(commanderPicture); layout->addWidget(label); layout->addWidget(salt); layout->addWidget(comboPushButton); + layout->addWidget(averageDeckPushButton); QWidget *currentParent = parentWidget(); TabEdhRecMain *parentTab = nullptr; @@ -45,6 +47,8 @@ EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCom if (parentTab) { connect(comboPushButton, &QPushButton::clicked, this, &EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestComboNavigation); + connect(averageDeckPushButton, &QPushButton::clicked, this, + &EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestAverageDeckNavigation); connect(this, &EdhrecCommanderResponseCommanderDetailsDisplayWidget::requestUrl, parentTab, &TabEdhRecMain::actNavigatePage); } @@ -57,9 +61,15 @@ void EdhrecCommanderResponseCommanderDetailsDisplayWidget::retranslateUi() label->setText(commanderDetails.getLabel()); salt->setText(tr("Salt: ") + QString::number(commanderDetails.getSalt())); comboPushButton->setText(tr("Combos")); + averageDeckPushButton->setText(tr("Average Deck")); } void EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestComboNavigation() { emit requestUrl("/combos/" + commanderDetails.getSanitized()); -} \ No newline at end of file +} + +void EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestAverageDeckNavigation() +{ + emit requestUrl("/average-decks/" + commanderDetails.getSanitized()); +} diff --git a/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.h index f78bf855b..b43ffdedb 100644 --- a/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.h +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.h @@ -20,6 +20,7 @@ public: public slots: void actRequestComboNavigation(); + void actRequestAverageDeckNavigation(); signals: void requestUrl(QString url); @@ -27,6 +28,7 @@ private: QLabel *label; QLabel *salt; QPushButton *comboPushButton; + QPushButton *averageDeckPushButton; QVBoxLayout *layout; CardInfoPictureWidget *commanderPicture; EdhrecCommanderApiResponseCommanderDetails commanderDetails; diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp index 80e70053f..46baddb1a 100644 --- a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp @@ -3,6 +3,8 @@ #include "../../../../game/cards/card_completer_proxy_model.h" #include "../../../../game/cards/card_database_manager.h" #include "../../../../game/cards/card_search_model.h" +#include "../../tab_supervisor.h" +#include "api_response/average_deck/edhrec_average_deck_api_response.h" #include "api_response/commander/edhrec_commander_api_response.h" #include "api_response/top_cards/edhrec_top_cards_api_response.h" #include "api_response/top_commanders/edhrec_top_commanders_api_response.h" @@ -226,6 +228,8 @@ void TabEdhRecMain::processApiJson(QNetworkReply *reply) processTopCardsResponse(jsonObj); } else if (responseUrl.startsWith("https://json.edhrec.com/pages/combos/")) { processCommanderResponse(jsonObj); + } else if (responseUrl.startsWith("https://json.edhrec.com/pages/average-decks/")) { + processAverageDeckResponse(jsonObj); } else { prettyPrintJson(jsonObj, 4); } @@ -341,6 +345,13 @@ void TabEdhRecMain::processCommanderResponse(QJsonObject reply) mainLayout->setStretch(1, 1); // Make sure currentPageDisplay takes remaining space } +void TabEdhRecMain::processAverageDeckResponse(QJsonObject reply) +{ + EdhrecAverageDeckApiResponse deckData; + deckData.fromJson(reply); + tabSupervisor->addVisualDeckEditorTab(deckData.deck.deckLoader); +} + void TabEdhRecMain::prettyPrintJson(const QJsonValue &value, int indentLevel) { const QString indent(indentLevel * 2, ' '); // Adjust spacing as needed for pretty printing diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h index 01d0bb936..5a4f3db2a 100644 --- a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h @@ -32,6 +32,7 @@ public slots: void processTopCardsResponse(QJsonObject reply); void processTopTagsResponse(QJsonObject reply); void processTopCommandersResponse(QJsonObject reply); + void processAverageDeckResponse(QJsonObject reply); void prettyPrintJson(const QJsonValue &value, int indentLevel); void setCard(CardInfoPtr _cardToQuery, bool isCommander = false); void actNavigatePage(QString url); diff --git a/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp b/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp index 38af03c59..393d08f3e 100644 --- a/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp +++ b/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp @@ -33,5 +33,7 @@ void TabDeckStorageVisual::actOpenLocalDeck(const QString &filePath) return; } + DeckLoader lol; + emit openDeckEditor(&deckLoader); }