diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.cpp b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.cpp index d23255800..53e8d6879 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.cpp @@ -126,36 +126,62 @@ void ArchidektApiResponseDeckEntryDisplayWidget::mousePressEvent(QMouseEvent *ev actRequestNavigationToDeck(); } +void ArchidektApiResponseDeckEntryDisplayWidget::setScaleFactor(int scale) +{ + scaleFactor = scale; + updateScaledPreview(); +} + void ArchidektApiResponseDeckEntryDisplayWidget::onPreviewImageLoadFinished(QNetworkReply *reply) { if (reply->url() != response.getFeatured()) { return; } - if (reply->error() != QNetworkReply::NoError) { - QPixmap pixmap; - CardPictureLoader::getCardBackLoadingFailedPixmap(pixmap, QSize(400, 400)); - picture->setPixmap(pixmap.scaled(400, 400, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - previewWidget->update(); - previewWidget->updateGeometry(); + QPixmap loaded; - reply->deleteLater(); - return; + if (reply->error() != QNetworkReply::NoError || !loaded.loadFromData(reply->readAll())) { + CardPictureLoader::getCardBackLoadingFailedPixmap(loaded, QSize(400, 400)); } - QByteArray imageData = reply->readAll(); - QPixmap pixmap; + originalPixmap = loaded; - if (!pixmap.loadFromData(imageData)) { - CardPictureLoader::getCardBackLoadingFailedPixmap(pixmap, QSize(400, 400)); - } - picture->setPixmap(pixmap.scaled(400, 400, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - previewWidget->update(); - previewWidget->updateGeometry(); + float ratio = float(originalPixmap.height()) / float(originalPixmap.width()); + previewWidget->setAspectRatio(ratio); + previewWidget->setPreviewWidth(400); + + // Initial scaling + updateScaledPreview(); reply->deleteLater(); } +void ArchidektApiResponseDeckEntryDisplayWidget::updateScaledPreview() +{ + if (originalPixmap.isNull()) + return; + + int baseWidth = 400; + int newWidth = baseWidth * scaleFactor / 100; + + // 1. Resize the preview widget itself (keeps aspect ratio) + previewWidget->setPreviewWidth(newWidth); + + // 2. Scale pixmap from the original + QPixmap scaled = originalPixmap.scaled(previewWidget->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + + picture->setPixmap(scaled); + picture->setFixedSize(previewWidget->size()); + + // 3. Scale the whole outer widget width (this) + setFixedWidth(newWidth); + + layout->invalidate(); + layout->activate(); + layout->update(); + updateGeometry(); +} + void ArchidektApiResponseDeckEntryDisplayWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.h b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.h index 8dc799874..19d57fa84 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.h +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.h @@ -23,10 +23,12 @@ public: ArchidektApiResponseDeckListingContainer response, QNetworkAccessManager *imageNetworkManager); void onPreviewImageLoadFinished(QNetworkReply *reply); + void updateScaledPreview(); void resizeEvent(QResizeEvent *event) override; public slots: void actRequestNavigationToDeck(); + void setScaleFactor(int scale); protected: void mousePressEvent(QMouseEvent *event) override; @@ -37,6 +39,8 @@ private: QNetworkAccessManager *imageNetworkManager; ArchidektDeckPreviewImageDisplayWidget *previewWidget; QLabel *picture; + QPixmap originalPixmap; + int scaleFactor = 100; }; #endif // COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_ENTRY_DISPLAY_WIDGET_H diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.cpp b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.cpp index 534c2ba47..0b64cc4b7 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.cpp @@ -5,8 +5,9 @@ ArchidektApiResponseDeckListingsDisplayWidget::ArchidektApiResponseDeckListingsDisplayWidget( QWidget *parent, - ArchidektDeckListingApiResponse response) - : QWidget(parent) + ArchidektDeckListingApiResponse response, + CardSizeWidget *_cardSizeSlider) + : QWidget(parent), cardSizeSlider(_cardSizeSlider) { layout = new QHBoxLayout(this); setLayout(layout); @@ -27,6 +28,8 @@ ArchidektApiResponseDeckListingsDisplayWidget::ArchidektApiResponseDeckListingsD new ArchidektApiResponseDeckEntryDisplayWidget(this, deckListing, imageNetworkManager); connect(cardListDisplayWidget, &ArchidektApiResponseDeckEntryDisplayWidget::requestNavigation, this, &ArchidektApiResponseDeckListingsDisplayWidget::requestNavigation); + connect(cardSizeSlider->getSlider(), &QSlider::valueChanged, cardListDisplayWidget, + &ArchidektApiResponseDeckEntryDisplayWidget::setScaleFactor); flowWidget->addWidget(cardListDisplayWidget); } diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.h b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.h index e5062df3b..cdd445ed4 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.h +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.h @@ -1,6 +1,7 @@ #ifndef COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_LISTINGS_DISPLAY_WIDGET_H #define COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_LISTINGS_DISPLAY_WIDGET_H +#include "../../../../cards/card_size_widget.h" #include "../../../../general/layout_containers/flow_widget.h" #include "../api_response/archidekt_deck_listing_api_response.h" @@ -18,10 +19,13 @@ signals: void requestNavigation(QString url); public: - explicit ArchidektApiResponseDeckListingsDisplayWidget(QWidget *parent, ArchidektDeckListingApiResponse response); + explicit ArchidektApiResponseDeckListingsDisplayWidget(QWidget *parent, + ArchidektDeckListingApiResponse response, + CardSizeWidget *cardSizeSlider); void resizeEvent(QResizeEvent *event) override; private: + CardSizeWidget *cardSizeSlider; QHBoxLayout *layout; FlowWidget *flowWidget; QNetworkAccessManager *imageNetworkManager; diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.cpp b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.cpp index 94b484df1..4e9d344c5 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.cpp @@ -27,6 +27,20 @@ ArchidektDeckPreviewImageDisplayWidget::ArchidektDeckPreviewImageDisplayWidget(Q bottomRightLabel->raise(); } +void ArchidektDeckPreviewImageDisplayWidget::setAspectRatio(float ratio) +{ + aspectRatio = ratio; +} + +void ArchidektDeckPreviewImageDisplayWidget::setPreviewWidth(int width) +{ + int height = int(width * aspectRatio); + + setFixedSize(width, height); + updateGeometry(); + update(); +} + void ArchidektDeckPreviewImageDisplayWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.h b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.h index ad04090b0..ae9acb3f7 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.h +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.h @@ -16,6 +16,9 @@ class ArchidektDeckPreviewImageDisplayWidget : public QWidget public: explicit ArchidektDeckPreviewImageDisplayWidget(QWidget *parent = nullptr); + void setAspectRatio(float ratio); + void setPreviewWidth(int width); + QLabel *imageLabel; OverlayLabel *topLeftLabel; OverlayLabel *topRightLabel; @@ -24,6 +27,9 @@ public: protected: void resizeEvent(QResizeEvent *event) override; + +private: + float aspectRatio = 1.0f; }; #endif // COCKATRICE_ARCHIDEKT_DECK_PREVIEW_IMAGE_DISPLAY_WIDGET_H diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp b/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp index c2a11c94b..77ff7115d 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp @@ -289,7 +289,7 @@ void TabArchidekt::processTopDecksResponse(QJsonObject reply) currentPageLayout = new QVBoxLayout(currentPageDisplay); currentPageDisplay->setLayout(currentPageLayout); - auto display = new ArchidektApiResponseDeckListingsDisplayWidget(currentPageDisplay, deckData); + auto display = new ArchidektApiResponseDeckListingsDisplayWidget(currentPageDisplay, deckData, cardSizeSlider); connect(display, &ArchidektApiResponseDeckListingsDisplayWidget::requestNavigation, this, &TabArchidekt::actNavigatePage); currentPageLayout->addWidget(display);