diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 3a1cb2924..b12b1a27a 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -18,19 +18,28 @@ set(cockatrice_SOURCES src/client/network/spoiler_background_updater.cpp src/client/sound_engine.cpp src/client/tabs/abstract_tab_deck_editor.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_archidekt_links.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_average_deck_statistics.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_container.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_details.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_list.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_prices.cpp - src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_commander_details.cpp - src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.cpp - src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp - src/client/tabs/api/edhrec/edhrec_commander_api_response_commander_details_display_widget.cpp - src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp src/client/tabs/api/edhrec/tab_edhrec.cpp + src/client/tabs/api/edhrec/tab_edhrec_main.cpp + src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.cpp + src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.cpp + src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.cpp + src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.cpp + src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.cpp + src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.cpp + src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.cpp + src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_archidekt_links.cpp + src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.cpp + src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_details.cpp + src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_list.cpp + src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_container.cpp + 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 src/client/tabs/tab.cpp src/client/tabs/tab_account.cpp src/client/tabs/tab_admin.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..fcf95ed3e --- /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 "../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 "edhrec_deck_api_response.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/api_response/edhrec_commander_api_response.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_archidekt_links.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_archidekt_links.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_archidekt_links.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_archidekt_links.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_archidekt_links.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_archidekt_links.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_archidekt_links.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_archidekt_links.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_average_deck_statistics.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_average_deck_statistics.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_average_deck_statistics.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_average_deck_statistics.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_container.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_container.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_container.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_container.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_container.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_container.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_container.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_container.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_details.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_details.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_details.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_details.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_details.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_details.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_details.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_details.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_list.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_list.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_list.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_list.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_list.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_list.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_list.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_list.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_prices.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_prices.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_prices.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_prices.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_prices.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_prices.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_card_prices.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_card_prices.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_commander_details.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_commander_details.cpp similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_commander_details.cpp rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_commander_details.cpp diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_commander_details.h b/cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_commander_details.h similarity index 100% rename from cockatrice/src/client/tabs/api/edhrec/api_response/edhrec_commander_api_response_commander_details.h rename to cockatrice/src/client/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_commander_details.h diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.cpp new file mode 100644 index 000000000..26122ce89 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.cpp @@ -0,0 +1,19 @@ +#include "edhrec_top_cards_api_response.h" + +#include +#include + +void EdhrecTopCardsApiResponse::fromJson(const QJsonObject &json) +{ + header = json.value("header").toString(); + description = json.value("description").toString(); + QJsonObject containerJson = json.value("container").toObject(); + container.fromJson(containerJson); +} + +void EdhrecTopCardsApiResponse::debugPrint() const +{ + qDebug() << "Header:" << header; + qDebug() << "Description:" << description; + container.debugPrint(); +} \ No newline at end of file diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.h b/cockatrice/src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.h new file mode 100644 index 000000000..0a9d14425 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.h @@ -0,0 +1,22 @@ +#ifndef EDHREC_TOP_CARDS_API_RESPONSE_H +#define EDHREC_TOP_CARDS_API_RESPONSE_H + +#include "../commander/edhrec_commander_api_response_card_container.h" + +#include +#include +#include + +// Represents the main structure of the JSON +class EdhrecTopCardsApiResponse +{ +public: + QString header; + QString description; + EdhrecCommanderApiResponseCardContainer container; + + void fromJson(const QJsonObject &json); + void debugPrint() const; +}; + +#endif // EDHREC_TOP_CARDS_API_RESPONSE_H diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.cpp new file mode 100644 index 000000000..83b10c9e5 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.cpp @@ -0,0 +1,19 @@ +#include "edhrec_top_commanders_api_response.h" + +#include +#include + +void EdhrecTopCommandersApiResponse::fromJson(const QJsonObject &json) +{ + header = json.value("header").toString(); + description = json.value("description").toString(); + QJsonObject containerJson = json.value("container").toObject(); + container.fromJson(containerJson); +} + +void EdhrecTopCommandersApiResponse::debugPrint() const +{ + qDebug() << "Header:" << header; + qDebug() << "Description:" << description; + container.debugPrint(); +} \ No newline at end of file diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.h b/cockatrice/src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.h new file mode 100644 index 000000000..9aa2b80df --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.h @@ -0,0 +1,22 @@ +#ifndef EDHREC_TOP_COMMANDERS_API_RESPONSE_H +#define EDHREC_TOP_COMMANDERS_API_RESPONSE_H + +#include "../commander/edhrec_commander_api_response_card_container.h" + +#include +#include +#include + +// Represents the main structure of the JSON +class EdhrecTopCommandersApiResponse +{ +public: + QString header; + QString description; + EdhrecCommanderApiResponseCardContainer container; + + void fromJson(const QJsonObject &json); + void debugPrint() const; +}; + +#endif // EDHREC_TOP_COMMANDERS_API_RESPONSE_H diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.cpp b/cockatrice/src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.cpp new file mode 100644 index 000000000..56eb4fa4f --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.cpp @@ -0,0 +1,19 @@ +#include "edhrec_top_tags_api_response.h" + +#include +#include + +void EdhrecTopTagsApiResponse::fromJson(const QJsonObject &json) +{ + header = json.value("header").toString(); + description = json.value("description").toString(); + QJsonObject containerJson = json.value("container").toObject(); + container.fromJson(containerJson); +} + +void EdhrecTopTagsApiResponse::debugPrint() const +{ + qDebug() << "Header:" << header; + qDebug() << "Description:" << description; + container.debugPrint(); +} \ No newline at end of file diff --git a/cockatrice/src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.h b/cockatrice/src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.h new file mode 100644 index 000000000..32932149c --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.h @@ -0,0 +1,22 @@ +#ifndef EDHREC_TOP_TAGS_API_RESPONSE_H +#define EDHREC_TOP_TAGS_API_RESPONSE_H + +#include "../commander/edhrec_commander_api_response_card_container.h" + +#include +#include +#include + +// Represents the main structure of the JSON +class EdhrecTopTagsApiResponse +{ +public: + QString header; + QString description; + EdhrecCommanderApiResponseCardContainer container; + + void fromJson(const QJsonObject &json); + void debugPrint() const; +}; + +#endif // EDHREC_TOP_TAGS_API_RESPONSE_H diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.cpp similarity index 58% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.cpp rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.cpp index 87853b9aa..9573cbcbd 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.cpp @@ -1,6 +1,7 @@ #include "edhrec_commander_api_response_card_details_display_widget.h" -#include "../../../../game/cards/card_database_manager.h" +#include "../../../../../../game/cards/card_database_manager.h" +#include "../../tab_edhrec_main.h" EdhrecCommanderApiResponseCardDetailsDisplayWidget::EdhrecCommanderApiResponseCardDetailsDisplayWidget( QWidget *parent, @@ -11,14 +12,17 @@ EdhrecCommanderApiResponseCardDetailsDisplayWidget::EdhrecCommanderApiResponseCa setLayout(layout); cardPictureWidget = new CardInfoPictureWidget(this); - cardPictureWidget->setCard(CardDatabaseManager::getInstance()->getCard(toDisplay.name)); + cardPictureWidget->setCard(CardDatabaseManager::getInstance()->guessCard(toDisplay.sanitized)); label = new QLabel(this); label->setText(toDisplay.name + "\n" + toDisplay.label); label->setAlignment(Qt::AlignHCenter); + int inclusionRate = 0; // Set label color based on inclusion rate - int inclusionRate = (toDisplay.numDecks * 100) / toDisplay.potentialDecks; + if (toDisplay.potentialDecks != 0) { + inclusionRate = (toDisplay.numDecks * 100) / toDisplay.potentialDecks; + } QColor labelColor; if (inclusionRate <= 30) { @@ -38,4 +42,26 @@ EdhrecCommanderApiResponseCardDetailsDisplayWidget::EdhrecCommanderApiResponseCa layout->addWidget(cardPictureWidget); layout->addWidget(label); + + QWidget *currentParent = parentWidget(); + TabEdhRecMain *parentTab = nullptr; + + while (currentParent) { + if ((parentTab = qobject_cast(currentParent))) { + break; + } + currentParent = currentParent->parentWidget(); + } + + if (parentTab) { + connect(cardPictureWidget, &CardInfoPictureWidget::cardClicked, this, + &EdhrecCommanderApiResponseCardDetailsDisplayWidget::actRequestPageNavigation); + connect(this, &EdhrecCommanderApiResponseCardDetailsDisplayWidget::requestUrl, parentTab, + &TabEdhRecMain::actNavigatePage); + } +} + +void EdhrecCommanderApiResponseCardDetailsDisplayWidget::actRequestPageNavigation() +{ + emit requestUrl(toDisplay.url); } diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.h similarity index 73% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.h rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.h index 1cd76989c..313f73c55 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_details_display_widget.h +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_details_display_widget.h @@ -1,8 +1,8 @@ #ifndef EDHREC_COMMANDER_API_RESPONSE_CARD_DETAILS_DISPLAY_WIDGET_H #define EDHREC_COMMANDER_API_RESPONSE_CARD_DETAILS_DISPLAY_WIDGET_H -#include "../../../ui/widgets/cards/card_info_picture_widget.h" -#include "api_response/edhrec_commander_api_response_card_details.h" +#include "../../../../../ui/widgets/cards/card_info_picture_widget.h" +#include "../../api_response/commander/edhrec_commander_api_response_card_details.h" #include #include @@ -15,6 +15,10 @@ public: explicit EdhrecCommanderApiResponseCardDetailsDisplayWidget( QWidget *parent, const EdhrecCommanderApiResponseCardDetails &_toDisplay); +public slots: + void actRequestPageNavigation(); +signals: + void requestUrl(QString url); private: EdhrecCommanderApiResponseCardDetails toDisplay; diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.cpp similarity index 93% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.cpp index 0d1f1e8f3..7b1ae1488 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.cpp @@ -1,6 +1,6 @@ #include "edhrec_commander_api_response_card_list_display_widget.h" -#include "../../../ui/widgets/general/display/banner_widget.h" +#include "../../../../../ui/widgets/general/display/banner_widget.h" #include "edhrec_commander_api_response_card_details_display_widget.h" #include diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.h similarity index 77% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.h index 9df667929..63428c2c1 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_card_list_display_widget.h @@ -1,9 +1,9 @@ #ifndef EDHREC_COMMANDER_API_RESPONSE_CARD_LIST_DISPLAY_WIDGET_H #define EDHREC_COMMANDER_API_RESPONSE_CARD_LIST_DISPLAY_WIDGET_H -#include "../../../ui/widgets/general/display/banner_widget.h" -#include "../../../ui/widgets/general/layout_containers/flow_widget.h" -#include "api_response/edhrec_commander_api_response_card_list.h" +#include "../../../../../ui/widgets/general/display/banner_widget.h" +#include "../../../../../ui/widgets/general/layout_containers/flow_widget.h" +#include "../../api_response/commander/edhrec_commander_api_response_card_list.h" #include #include 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 new file mode 100644 index 000000000..322c65aac --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.cpp @@ -0,0 +1,75 @@ +#include "edhrec_commander_api_response_commander_details_display_widget.h" + +#include "../../../../../../game/cards/card_database_manager.h" +#include "../../../../../ui/widgets/cards/card_info_picture_widget.h" +#include "../../tab_edhrec_main.h" + +#include +#include + +EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCommanderDetailsDisplayWidget( + QWidget *parent, + const EdhrecCommanderApiResponseCommanderDetails &_commanderDetails) + : QWidget(parent), commanderDetails(_commanderDetails) +{ + layout = new QVBoxLayout(this); + setLayout(layout); + + commanderPicture = new CardInfoPictureWidget(this); + commanderPicture->setCard(CardDatabaseManager::getInstance()->getCard(commanderDetails.getName())); + + commanderDetails.debugPrint(); + + label = new QLabel(this); + label->setAlignment(Qt::AlignCenter); + salt = new QLabel(this); + 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; + + while (currentParent) { + if ((parentTab = qobject_cast(currentParent))) { + break; + } + currentParent = currentParent->parentWidget(); + } + + if (parentTab) { + connect(comboPushButton, &QPushButton::clicked, this, + &EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestComboNavigation); + connect(averageDeckPushButton, &QPushButton::clicked, this, + &EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestAverageDeckNavigation); + connect(this, &EdhrecCommanderResponseCommanderDetailsDisplayWidget::requestUrl, parentTab, + &TabEdhRecMain::actNavigatePage); + } + + retranslateUi(); +} + +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()); +} + +void EdhrecCommanderResponseCommanderDetailsDisplayWidget::actRequestAverageDeckNavigation() +{ + emit requestUrl("/average-decks/" + commanderDetails.getSanitized()); +} diff --git a/cockatrice/src/client/tabs/api/edhrec/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 similarity index 65% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_commander_details_display_widget.h rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_commander_details_display_widget.h index 85970d503..b43ffdedb 100644 --- a/cockatrice/src/client/tabs/api/edhrec/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 @@ -1,10 +1,11 @@ #ifndef EDHREC_COMMANDER_API_RESPONSE_COMMANDER_DETAILS_DISPLAY_WIDGET_H #define EDHREC_COMMANDER_API_RESPONSE_COMMANDER_DETAILS_DISPLAY_WIDGET_H -#include "../../../ui/widgets/cards/card_info_picture_widget.h" -#include "api_response/edhrec_commander_api_response_commander_details.h" +#include "../../../../../ui/widgets/cards/card_info_picture_widget.h" +#include "../../api_response/commander/edhrec_commander_api_response_commander_details.h" #include +#include #include #include @@ -17,9 +18,17 @@ public: const EdhrecCommanderApiResponseCommanderDetails &_commanderDetails); void retranslateUi(); +public slots: + void actRequestComboNavigation(); + void actRequestAverageDeckNavigation(); +signals: + void requestUrl(QString url); + private: QLabel *label; QLabel *salt; + QPushButton *comboPushButton; + QPushButton *averageDeckPushButton; QVBoxLayout *layout; CardInfoPictureWidget *commanderPicture; EdhrecCommanderApiResponseCommanderDetails commanderDetails; diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.cpp similarity index 96% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.cpp index 3cab65bf8..199608e8b 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.cpp @@ -1,7 +1,7 @@ #include "edhrec_commander_api_response_display_widget.h" -#include "../../../ui/widgets/cards/card_info_picture_widget.h" -#include "api_response/edhrec_commander_api_response.h" +#include "../../../../../ui/widgets/cards/card_info_picture_widget.h" +#include "../../api_response/commander/edhrec_commander_api_response.h" #include "edhrec_commander_api_response_card_list_display_widget.h" #include "edhrec_commander_api_response_commander_details_display_widget.h" diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.h similarity index 89% rename from cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h rename to cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.h index d1e95e3d6..e98841613 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h +++ b/cockatrice/src/client/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.h @@ -1,7 +1,7 @@ #ifndef EDHREC_COMMANDER_API_RESPONSE_DISPLAY_WIDGET_H #define EDHREC_COMMANDER_API_RESPONSE_DISPLAY_WIDGET_H -#include "api_response/edhrec_commander_api_response.h" +#include "../../api_response/commander/edhrec_commander_api_response.h" #include #include diff --git a/cockatrice/src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.cpp new file mode 100644 index 000000000..958594554 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.cpp @@ -0,0 +1,45 @@ +#include "edhrec_top_cards_api_response_display_widget.h" + +#include "../../api_response/top_cards/edhrec_top_cards_api_response.h" +#include "../commander/edhrec_commander_api_response_card_list_display_widget.h" + +EdhrecTopCardsApiResponseDisplayWidget::EdhrecTopCardsApiResponseDisplayWidget(QWidget *parent, + EdhrecTopCardsApiResponse response) + : QWidget(parent) +{ + layout = new QHBoxLayout(this); + setLayout(layout); + + cardDisplayLayout = new QVBoxLayout(this); + + // Add card list widgets + auto edhrec_commander_api_response_card_lists = response.container.getCardlists(); + for (const EdhrecCommanderApiResponseCardList &card_list : edhrec_commander_api_response_card_lists) { + auto cardListDisplayWidget = new EdhrecCommanderApiResponseCardListDisplayWidget(this, card_list); + cardDisplayLayout->addWidget(cardListDisplayWidget); + } + + // Create a QScrollArea to hold the card display widgets + scrollArea = new QScrollArea(this); + scrollArea->setWidgetResizable(true); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + // Set the cardDisplayLayout inside the scroll area + auto scrollWidget = new QWidget(scrollArea); + scrollWidget->setLayout(cardDisplayLayout); + scrollArea->setWidget(scrollWidget); + + layout->addWidget(scrollArea); +} + +void EdhrecTopCardsApiResponseDisplayWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + layout->invalidate(); + layout->activate(); + layout->update(); + if (scrollArea && scrollArea->widget()) { + scrollArea->widget()->resize(event->size()); + } +} diff --git a/cockatrice/src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.h new file mode 100644 index 000000000..4b7a34d6a --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.h @@ -0,0 +1,25 @@ +#ifndef EDHREC_TOP_CARDS_API_RESPONSE_DISPLAY_WIDGET_H +#define EDHREC_TOP_CARDS_API_RESPONSE_DISPLAY_WIDGET_H + +#include "../../api_response/top_cards/edhrec_top_cards_api_response.h" + +#include +#include +#include +#include + +class EdhrecTopCardsApiResponseDisplayWidget : public QWidget +{ + Q_OBJECT + +public: + explicit EdhrecTopCardsApiResponseDisplayWidget(QWidget *parent, EdhrecTopCardsApiResponse response); + void resizeEvent(QResizeEvent *event) override; + +private: + QHBoxLayout *layout; + QVBoxLayout *cardDisplayLayout; + QScrollArea *scrollArea; +}; + +#endif // EDHREC_TOP_CARDS_API_RESPONSE_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.cpp new file mode 100644 index 000000000..8419ddad0 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.cpp @@ -0,0 +1,47 @@ +#include "edhrec_top_commanders_api_response_display_widget.h" + +#include "../../api_response/top_commanders/edhrec_top_commanders_api_response.h" +#include "../commander/edhrec_commander_api_response_card_list_display_widget.h" + +EdhrecTopCommandersApiResponseDisplayWidget::EdhrecTopCommandersApiResponseDisplayWidget( + QWidget *parent, + EdhrecTopCommandersApiResponse response) + : QWidget(parent) +{ + layout = new QHBoxLayout(this); + setLayout(layout); + + cardDisplayLayout = new QVBoxLayout(this); + + // Add card list widgets + auto edhrec_commander_api_response_card_lists = response.container.getCardlists(); + for (const EdhrecCommanderApiResponseCardList &card_list : edhrec_commander_api_response_card_lists) { + auto cardListDisplayWidget = new EdhrecCommanderApiResponseCardListDisplayWidget(this, card_list); + cardDisplayLayout->addWidget(cardListDisplayWidget); + } + + // Create a QScrollArea to hold the card display widgets + scrollArea = new QScrollArea(this); + scrollArea->setWidgetResizable(true); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + // Set the cardDisplayLayout inside the scroll area + auto scrollWidget = new QWidget(scrollArea); + scrollWidget->setLayout(cardDisplayLayout); + scrollArea->setWidget(scrollWidget); + + layout->addWidget(scrollArea); +} + +void EdhrecTopCommandersApiResponseDisplayWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + qDebug() << event->size(); + layout->invalidate(); + layout->activate(); + layout->update(); + if (scrollArea && scrollArea->widget()) { + scrollArea->widget()->resize(event->size()); + } +} diff --git a/cockatrice/src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.h new file mode 100644 index 000000000..e8774d38b --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.h @@ -0,0 +1,25 @@ +#ifndef EDHREC_TOP_COMMANDERS_API_RESPONSE_DISPLAY_WIDGET_H +#define EDHREC_TOP_COMMANDERS_API_RESPONSE_DISPLAY_WIDGET_H + +#include "../../api_response/top_commanders/edhrec_top_commanders_api_response.h" + +#include +#include +#include +#include + +class EdhrecTopCommandersApiResponseDisplayWidget : public QWidget +{ + Q_OBJECT + +public: + explicit EdhrecTopCommandersApiResponseDisplayWidget(QWidget *parent, EdhrecTopCommandersApiResponse response); + void resizeEvent(QResizeEvent *event) override; + +private: + QHBoxLayout *layout; + QVBoxLayout *cardDisplayLayout; + QScrollArea *scrollArea; +}; + +#endif // EDHREC_TOP_COMMANDERS_API_RESPONSE_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.cpp new file mode 100644 index 000000000..fe727027d --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.cpp @@ -0,0 +1,45 @@ +#include "edhrec_top_tags_api_response_display_widget.h" + +#include "../../api_response/top_tags/edhrec_top_tags_api_response.h" +#include "../commander/edhrec_commander_api_response_card_list_display_widget.h" + +EdhrecTopTagsApiResponseDisplayWidget::EdhrecTopTagsApiResponseDisplayWidget(QWidget *parent, + EdhrecTopTagsApiResponse response) + : QWidget(parent) +{ + layout = new QHBoxLayout(this); + setLayout(layout); + + cardDisplayLayout = new QVBoxLayout(this); + + // Add card list widgets + auto edhrec_commander_api_response_card_lists = response.container.getCardlists(); + for (const EdhrecCommanderApiResponseCardList &card_list : edhrec_commander_api_response_card_lists) { + auto cardListDisplayWidget = new EdhrecCommanderApiResponseCardListDisplayWidget(this, card_list); + cardDisplayLayout->addWidget(cardListDisplayWidget); + } + + // Create a QScrollArea to hold the card display widgets + scrollArea = new QScrollArea(this); + scrollArea->setWidgetResizable(true); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + // Set the cardDisplayLayout inside the scroll area + auto scrollWidget = new QWidget(scrollArea); + scrollWidget->setLayout(cardDisplayLayout); + scrollArea->setWidget(scrollWidget); + + layout->addWidget(scrollArea); +} + +void EdhrecTopTagsApiResponseDisplayWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + layout->invalidate(); + layout->activate(); + layout->update(); + if (scrollArea && scrollArea->widget()) { + scrollArea->widget()->resize(event->size()); + } +} diff --git a/cockatrice/src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.h new file mode 100644 index 000000000..d67875058 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.h @@ -0,0 +1,25 @@ +#ifndef EDHREC_TOP_TAGS_API_RESPONSE_DISPLAY_WIDGET_H +#define EDHREC_TOP_TAGS_API_RESPONSE_DISPLAY_WIDGET_H + +#include "../../api_response/top_tags/edhrec_top_tags_api_response.h" + +#include +#include +#include +#include + +class EdhrecTopTagsApiResponseDisplayWidget : public QWidget +{ + Q_OBJECT + +public: + explicit EdhrecTopTagsApiResponseDisplayWidget(QWidget *parent, EdhrecTopTagsApiResponse response); + void resizeEvent(QResizeEvent *event) override; + +private: + QHBoxLayout *layout; + QVBoxLayout *cardDisplayLayout; + QScrollArea *scrollArea; +}; + +#endif // EDHREC_TOP_TAGS_API_RESPONSE_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_commander_details_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_commander_details_display_widget.cpp deleted file mode 100644 index 58b77df73..000000000 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_commander_details_display_widget.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "edhrec_commander_api_response_commander_details_display_widget.h" - -#include "../../../../game/cards/card_database_manager.h" -#include "../../../ui/widgets/cards/card_info_picture_widget.h" - -#include - -EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCommanderDetailsDisplayWidget( - QWidget *parent, - const EdhrecCommanderApiResponseCommanderDetails &_commanderDetails) - : QWidget(parent), commanderDetails(_commanderDetails) -{ - layout = new QVBoxLayout(this); - setLayout(layout); - - commanderPicture = new CardInfoPictureWidget(this); - commanderPicture->setCard(CardDatabaseManager::getInstance()->getCard(commanderDetails.getName())); - - commanderDetails.debugPrint(); - - label = new QLabel(this); - label->setAlignment(Qt::AlignCenter); - salt = new QLabel(this); - salt->setAlignment(Qt::AlignCenter); - - layout->addWidget(commanderPicture); - layout->addWidget(label); - layout->addWidget(salt); - retranslateUi(); -} - -void EdhrecCommanderResponseCommanderDetailsDisplayWidget::retranslateUi() -{ - label->setText(commanderDetails.getLabel()); - salt->setText(tr("Salt: ") + QString::number(commanderDetails.getSalt())); -} \ No newline at end of file diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp index 4165a27b9..251469ee0 100644 --- a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp @@ -1,7 +1,7 @@ #include "tab_edhrec.h" -#include "api_response/edhrec_commander_api_response.h" -#include "edhrec_commander_api_response_display_widget.h" +#include "api_response/commander/edhrec_commander_api_response.h" +#include "display/commander/edhrec_commander_api_response_display_widget.h" #include #include diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h index af8d0cd49..ff299fadc 100644 --- a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h @@ -4,9 +4,8 @@ #include "../../../../game/cards/card_info.h" #include "../../../ui/widgets/general/layout_containers/flow_widget.h" #include "../../tab.h" -#include "edhrec_commander_api_response_display_widget.h" +#include "display/commander/edhrec_commander_api_response_display_widget.h" -#include #include class TabEdhRec : public Tab diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp new file mode 100644 index 000000000..64a1d1d04 --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.cpp @@ -0,0 +1,378 @@ +#include "tab_edhrec_main.h" + +#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" +#include "api_response/top_tags/edhrec_top_tags_api_response.h" +#include "display/commander/edhrec_commander_api_response_display_widget.h" +#include "display/top_cards/edhrec_top_cards_api_response_display_widget.h" +#include "display/top_commander/edhrec_top_commanders_api_response_display_widget.h" +#include "display/top_tags/edhrec_top_tags_api_response_display_widget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static bool canBeCommander(const CardInfoPtr &cardInfo) +{ + return ((cardInfo->getCardType().contains("Legendary", Qt::CaseInsensitive) && + cardInfo->getCardType().contains("Creature", Qt::CaseInsensitive))) || + cardInfo->getText().contains("can be your commander", Qt::CaseInsensitive); +} + +TabEdhRecMain::TabEdhRecMain(TabSupervisor *_tabSupervisor) : Tab(_tabSupervisor) +{ + networkManager = new QNetworkAccessManager(this); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) + networkManager->setTransferTimeout(); // Use Qt's default timeout +#endif + + networkManager->setRedirectPolicy(QNetworkRequest::ManualRedirectPolicy); + connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(processApiJson(QNetworkReply *))); + + container = new QWidget(this); + mainLayout = new QVBoxLayout(container); + container->setLayout(mainLayout); + + navigationContainer = new QWidget(container); + navigationContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + navigationLayout = new QHBoxLayout(navigationContainer); + navigationLayout->setSpacing(5); + navigationContainer->setLayout(navigationLayout); + + cardsPushButton = new QPushButton(navigationContainer); + connect(cardsPushButton, &QPushButton::clicked, this, &TabEdhRecMain::getTopCards); + topCommandersPushButton = new QPushButton(navigationContainer); + connect(topCommandersPushButton, &QPushButton::clicked, this, &TabEdhRecMain::getTopCommanders); + tagsPushButton = new QPushButton(navigationContainer); + connect(tagsPushButton, &QPushButton::clicked, this, &TabEdhRecMain::getTopTags); + + searchBar = new QLineEdit(this); + auto cardDatabaseModel = new CardDatabaseModel(CardDatabaseManager::getInstance(), false, this); + auto displayModel = new CardDatabaseDisplayModel(this); + displayModel->setSourceModel(cardDatabaseModel); + CardSearchModel *searchModel = new CardSearchModel(displayModel, this); + + CardCompleterProxyModel *proxyModel = new CardCompleterProxyModel(this); + proxyModel->setSourceModel(searchModel); + proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + proxyModel->setFilterRole(Qt::DisplayRole); + + QCompleter *completer = new QCompleter(proxyModel, this); + completer->setCompletionRole(Qt::DisplayRole); + completer->setCompletionMode(QCompleter::PopupCompletion); + completer->setCaseSensitivity(Qt::CaseInsensitive); + completer->setFilterMode(Qt::MatchContains); + completer->setMaxVisibleItems(10); + searchBar->setCompleter(completer); + + // Update suggestions dynamically + connect(searchBar, &QLineEdit::textChanged, searchModel, &CardSearchModel::updateSearchResults); + connect(searchBar, &QLineEdit::textChanged, this, [=](const QString &text) { + // Ensure substring matching + QString pattern = ".*" + QRegularExpression::escape(text) + ".*"; + proxyModel->setFilterRegularExpression(QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption)); + + if (!text.isEmpty()) { + completer->complete(); // Force the dropdown to appear + } + }); + + searchPushButton = new QPushButton(navigationContainer); + connect(searchPushButton, &QPushButton::clicked, this, [=, this]() { doSearch(); }); + + navigationLayout->addWidget(cardsPushButton); + navigationLayout->addWidget(topCommandersPushButton); + navigationLayout->addWidget(tagsPushButton); + navigationLayout->addWidget(searchBar); + navigationLayout->addWidget(searchPushButton); + + currentPageDisplay = new QWidget(container); + currentPageLayout = new QVBoxLayout(currentPageDisplay); + currentPageDisplay->setLayout(currentPageLayout); + + mainLayout->addWidget(navigationContainer); + mainLayout->addWidget(currentPageDisplay); + + // Ensure navigation stays at the top and currentPageDisplay takes remaining space + mainLayout->setStretch(0, 0); // navigationContainer gets minimum space + mainLayout->setStretch(1, 1); // currentPageDisplay expands as much as possible + + setCentralWidget(container); + + TabEdhRecMain::retranslateUi(); + + getTopCards(); +} + +void TabEdhRecMain::retranslateUi() +{ + cardsPushButton->setText(tr("&Cards")); + topCommandersPushButton->setText(tr("Top Commanders")); + tagsPushButton->setText(tr("Tags")); + searchBar->setPlaceholderText(tr("Search for a card ...")); + searchPushButton->setText(tr("Search")); +} + +void TabEdhRecMain::doSearch() +{ + CardInfoPtr searchedCard = CardDatabaseManager::getInstance()->getCard(searchBar->text()); + if (!searchedCard) { + return; + } + + setCard(searchedCard, canBeCommander(searchedCard)); +} + +void TabEdhRecMain::setCard(CardInfoPtr _cardToQuery, bool isCommander) +{ + cardToQuery = _cardToQuery; + + if (!cardToQuery) { + qDebug() << "Invalid card information provided."; + return; + } + + QString cardName = cardToQuery->getName(); + QString formattedName = cardName.toLower().replace(" ", "-").remove(QRegularExpression("[^a-z0-9\\-]")); + + QString url; + if (isCommander) { + url = QString("https://json.edhrec.com/pages/commanders/%1.json").arg(formattedName); + } else { + url = QString("https://json.edhrec.com/pages/cards/%1.json").arg(formattedName); + } + + QNetworkRequest request{QUrl(url)}; + + networkManager->get(request); +} + +void TabEdhRecMain::actNavigatePage(QString url) +{ + QNetworkRequest request{QUrl("https://json.edhrec.com/pages" + url + ".json")}; + + networkManager->get(request); +} + +void TabEdhRecMain::getTopCards() +{ + QNetworkRequest request{QUrl("https://json.edhrec.com/pages/top/year.json")}; + + networkManager->get(request); +} + +void TabEdhRecMain::getTopCommanders() +{ + QNetworkRequest request{QUrl("https://json.edhrec.com/pages/commanders/year.json")}; + + networkManager->get(request); +} + +void TabEdhRecMain::getTopTags() +{ + QNetworkRequest request{QUrl("https://json.edhrec.com/pages/tags.json")}; + + networkManager->get(request); +} + +void TabEdhRecMain::processApiJson(QNetworkReply *reply) +{ + if (reply->error() != QNetworkReply::NoError) { + qDebug() << "Network error occurred:" << reply->errorString(); + reply->deleteLater(); + return; + } + + QByteArray responseData = reply->readAll(); + QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); + + if (!jsonDoc.isObject()) { + qDebug() << "Invalid JSON response received."; + reply->deleteLater(); + return; + } + + QJsonObject jsonObj = jsonDoc.object(); + + // Get the actual URL from the reply + QString responseUrl = reply->url().toString(); + + // Check if the response URL matches a commander request + if (responseUrl.startsWith("https://json.edhrec.com/pages/commanders/year.json")) { + processTopCommandersResponse(jsonObj); + } else if (responseUrl.startsWith("https://json.edhrec.com/pages/commanders/")) { + processCommanderResponse(jsonObj); + } else if (responseUrl.startsWith("https://json.edhrec.com/pages/cards/")) { + processCommanderResponse(jsonObj); + } else if (responseUrl.startsWith("https://json.edhrec.com/pages/tags/")) { + processCommanderResponse(jsonObj); + } else if (responseUrl.startsWith("https://json.edhrec.com/pages/tags.json")) { + processTopTagsResponse(jsonObj); + } else if (responseUrl.startsWith("https://json.edhrec.com/pages/top/year.json")) { + 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); + } + + reply->deleteLater(); +} + +void TabEdhRecMain::processTopCardsResponse(QJsonObject reply) +{ + EdhrecTopCardsApiResponse deckData; + deckData.fromJson(reply); + + // **Remove previous page display to prevent stacking** + if (currentPageDisplay) { + mainLayout->removeWidget(currentPageDisplay); + delete currentPageDisplay; + currentPageDisplay = nullptr; + } + + // **Create new currentPageDisplay** + currentPageDisplay = new QWidget(container); + currentPageLayout = new QVBoxLayout(currentPageDisplay); + currentPageDisplay->setLayout(currentPageLayout); + + auto display = new EdhrecTopCardsApiResponseDisplayWidget(currentPageDisplay, deckData); + currentPageLayout->addWidget(display); + + mainLayout->addWidget(currentPageDisplay); + + // **Ensure layout stays correct** + mainLayout->setStretch(0, 0); // Keep navigationContainer at the top + mainLayout->setStretch(1, 1); // Make sure currentPageDisplay takes remaining space +} + +void TabEdhRecMain::processTopTagsResponse(QJsonObject reply) +{ + EdhrecTopTagsApiResponse deckData; + deckData.fromJson(reply); + + // **Remove previous page display to prevent stacking** + if (currentPageDisplay) { + mainLayout->removeWidget(currentPageDisplay); + delete currentPageDisplay; + currentPageDisplay = nullptr; + } + + // **Create new currentPageDisplay** + currentPageDisplay = new QWidget(container); + currentPageLayout = new QVBoxLayout(currentPageDisplay); + currentPageDisplay->setLayout(currentPageLayout); + + auto display = new EdhrecTopTagsApiResponseDisplayWidget(currentPageDisplay, deckData); + currentPageLayout->addWidget(display); + + mainLayout->addWidget(currentPageDisplay); + + // **Ensure layout stays correct** + mainLayout->setStretch(0, 0); // Keep navigationContainer at the top + mainLayout->setStretch(1, 1); // Make sure currentPageDisplay takes remaining space +} + +void TabEdhRecMain::processTopCommandersResponse(QJsonObject reply) +{ + EdhrecTopCommandersApiResponse deckData; + deckData.fromJson(reply); + + // **Remove previous page display to prevent stacking** + if (currentPageDisplay) { + mainLayout->removeWidget(currentPageDisplay); + delete currentPageDisplay; + currentPageDisplay = nullptr; + } + + // **Create new currentPageDisplay** + currentPageDisplay = new QWidget(container); + currentPageLayout = new QVBoxLayout(currentPageDisplay); + currentPageDisplay->setLayout(currentPageLayout); + + auto display = new EdhrecTopCommandersApiResponseDisplayWidget(currentPageDisplay, deckData); + currentPageLayout->addWidget(display); + + mainLayout->addWidget(currentPageDisplay); + + // **Ensure layout stays correct** + mainLayout->setStretch(0, 0); // Keep navigationContainer at the top + mainLayout->setStretch(1, 1); // Make sure currentPageDisplay takes remaining space +} + +void TabEdhRecMain::processCommanderResponse(QJsonObject reply) +{ + EdhrecCommanderApiResponse deckData; + deckData.fromJson(reply); + + // **Remove previous page display to prevent stacking** + if (currentPageDisplay) { + mainLayout->removeWidget(currentPageDisplay); + delete currentPageDisplay; + currentPageDisplay = nullptr; + } + + // **Create new currentPageDisplay** + currentPageDisplay = new QWidget(container); + currentPageLayout = new QVBoxLayout(currentPageDisplay); + currentPageDisplay->setLayout(currentPageLayout); + + auto display = new EdhrecCommanderApiResponseDisplayWidget(currentPageDisplay, deckData); + currentPageLayout->addWidget(display); + + mainLayout->addWidget(currentPageDisplay); + + // **Ensure layout stays correct** + mainLayout->setStretch(0, 0); // Keep navigationContainer at the top + 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 + + if (value.isObject()) { + QJsonObject obj = value.toObject(); + for (auto it = obj.begin(); it != obj.end(); ++it) { + qDebug().noquote() << indent + it.key() + ":"; + prettyPrintJson(it.value(), indentLevel + 1); + } + } else if (value.isArray()) { + QJsonArray array = value.toArray(); + for (int i = 0; i < array.size(); ++i) { + qDebug().noquote() << indent + QString("[%1]:").arg(i); + prettyPrintJson(array[i], indentLevel + 1); + } + } else if (value.isString()) { + qDebug().noquote() << indent + "\"" + value.toString() + "\""; + } else if (value.isDouble()) { + qDebug().noquote() << indent + QString::number(value.toDouble()); + } else if (value.isBool()) { + qDebug().noquote() << indent + (value.toBool() ? "true" : "false"); + } else if (value.isNull()) { + qDebug().noquote() << indent + "null"; + } +} diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h new file mode 100644 index 000000000..5a4f3db2a --- /dev/null +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec_main.h @@ -0,0 +1,61 @@ +#ifndef TAB_EDHREC_MAIN_H +#define TAB_EDHREC_MAIN_H + +#include "../../../../game/cards/card_database.h" +#include "../../../ui/widgets/general/layout_containers/flow_widget.h" +#include "../../tab.h" +#include "display/commander/edhrec_commander_api_response_display_widget.h" + +#include +#include +#include +#include + +class TabEdhRecMain : public Tab +{ + Q_OBJECT +public: + explicit TabEdhRecMain(TabSupervisor *_tabSupervisor); + + void retranslateUi() override; + void doSearch(); + QString getTabText() const override + { + auto cardName = cardToQuery.isNull() ? QString() : cardToQuery->getName(); + return tr("EDHREC: ") + cardName; + } + + QNetworkAccessManager *networkManager; + +public slots: + void processApiJson(QNetworkReply *reply); + 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); + void getTopCards(); + void getTopCommanders(); + void getTopTags(); + +private: + QWidget *container; + QWidget *navigationContainer; + QWidget *currentPageDisplay; + QVBoxLayout *mainLayout; + QHBoxLayout *navigationLayout; + QVBoxLayout *currentPageLayout; + QPushButton *cardsPushButton; + QPushButton *topCommandersPushButton; + QPushButton *tagsPushButton; + QLineEdit *searchBar; + QPushButton *searchPushButton; + CardInfoPtr cardToQuery; + EdhrecCommanderApiResponseDisplayWidget *displayWidget; + + void processCommanderResponse(QJsonObject reply); +}; + +#endif // TAB_EDHREC_MAIN_H diff --git a/cockatrice/src/client/tabs/tab_supervisor.cpp b/cockatrice/src/client/tabs/tab_supervisor.cpp index 810541363..5d9600d11 100644 --- a/cockatrice/src/client/tabs/tab_supervisor.cpp +++ b/cockatrice/src/client/tabs/tab_supervisor.cpp @@ -6,6 +6,7 @@ #include "../../server/user/user_list_widget.h" #include "../../settings/cache_settings.h" #include "../ui/pixel_map_generator.h" +#include "api/edhrec/tab_edhrec_main.h" #include "pb/event_game_joined.pb.h" #include "pb/event_notify_user.pb.h" #include "pb/event_user_message.pb.h" @@ -136,6 +137,9 @@ TabSupervisor::TabSupervisor(AbstractClient *_client, QMenu *tabsMenu, QWidget * aTabVisualDeckEditor = new QAction(this); connect(aTabVisualDeckEditor, &QAction::triggered, this, [this] { addVisualDeckEditorTab(nullptr); }); + aTabEdhRec = new QAction(this); + connect(aTabEdhRec, &QAction::triggered, this, [this] { addEdhrecMainTab(); }); + aTabVisualDeckStorage = new QAction(this); aTabVisualDeckStorage->setCheckable(true); connect(aTabVisualDeckStorage, &QAction::triggered, this, &TabSupervisor::actTabVisualDeckStorage); @@ -186,6 +190,7 @@ void TabSupervisor::retranslateUi() // tab menu actions aTabDeckEditor->setText(tr("Deck Editor")); aTabVisualDeckEditor->setText(tr("Visual Deck Editor")); + aTabEdhRec->setText(tr("EDHRec")); aTabVisualDeckStorage->setText(tr("&Visual Deck Storage")); aTabVisualDatabaseDisplay->setText(tr("Visual Database Display")); aTabServer->setText(tr("Server")); @@ -383,6 +388,7 @@ void TabSupervisor::resetTabsMenu() tabsMenu->clear(); tabsMenu->addAction(aTabDeckEditor); tabsMenu->addAction(aTabVisualDeckEditor); + tabsMenu->addAction(aTabEdhRec); tabsMenu->addSeparator(); tabsMenu->addAction(aTabVisualDeckStorage); tabsMenu->addAction(aTabVisualDatabaseDisplay); @@ -831,6 +837,15 @@ TabDeckEditorVisual *TabSupervisor::addVisualDeckEditorTab(const DeckLoader *dec return tab; } +TabEdhRecMain *TabSupervisor::addEdhrecMainTab() +{ + auto *tab = new TabEdhRecMain(this); + + myAddTab(tab); + setCurrentWidget(tab); + return tab; +} + TabVisualDatabaseDisplay *TabSupervisor::addVisualDatabaseDisplayTab() { auto *tab = new TabVisualDatabaseDisplay(this); diff --git a/cockatrice/src/client/tabs/tab_supervisor.h b/cockatrice/src/client/tabs/tab_supervisor.h index ba2324fed..0ca13ac41 100644 --- a/cockatrice/src/client/tabs/tab_supervisor.h +++ b/cockatrice/src/client/tabs/tab_supervisor.h @@ -5,6 +5,7 @@ #include "../../server/user/user_list_proxy.h" #include "abstract_tab_deck_editor.h" #include "api/edhrec/tab_edhrec.h" +#include "api/edhrec/tab_edhrec_main.h" #include "tab_visual_database_display.h" #include "visual_deck_editor/tab_deck_editor_visual.h" #include "visual_deck_editor/tab_deck_editor_visual_tab_widget.h" @@ -94,8 +95,8 @@ private: QList deckEditorTabs; bool isLocalGame; - QAction *aTabDeckEditor, *aTabVisualDeckEditor, *aTabVisualDeckStorage, *aTabVisualDatabaseDisplay, *aTabServer, - *aTabAccount, *aTabDeckStorage, *aTabReplays, *aTabAdmin, *aTabLog; + QAction *aTabDeckEditor, *aTabVisualDeckEditor, *aTabEdhRec, *aTabVisualDeckStorage, *aTabVisualDatabaseDisplay, + *aTabServer, *aTabAccount, *aTabDeckStorage, *aTabReplays, *aTabAdmin, *aTabLog; int myAddTab(Tab *tab, QAction *manager = nullptr); void addCloseButtonToTab(Tab *tab, int tabIndex, QAction *manager); @@ -154,6 +155,7 @@ public slots: TabDeckEditor *addDeckEditorTab(const DeckLoader *deckToOpen); TabDeckEditorVisual *addVisualDeckEditorTab(const DeckLoader *deckToOpen); TabVisualDatabaseDisplay *addVisualDatabaseDisplayTab(); + TabEdhRecMain *addEdhrecMainTab(); TabEdhRec *addEdhrecTab(const CardInfoPtr &cardToQuery, bool isCommander = false); void openReplay(GameReplay *replay); void maximizeMainWindow(); diff --git a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp index 4d7c10e14..0a33594f4 100644 --- a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp @@ -283,6 +283,8 @@ void CardInfoPictureWidget::mousePressEvent(QMouseEvent *event) if (event->button() == Qt::RightButton) { createRightClickMenu()->popup(QCursor::pos()); } + + emit cardClicked(); } QMenu *CardInfoPictureWidget::createRightClickMenu() diff --git a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h index 02b0fd8f5..04e7a852e 100644 --- a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h +++ b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h @@ -34,6 +34,7 @@ signals: void hoveredOnCard(CardInfoPtr hoveredCard); void cardScaleFactorChanged(int _scale); void cardChanged(CardInfoPtr card); + void cardClicked(); protected: void resizeEvent(QResizeEvent *event) override;