Scale things.

This commit is contained in:
Brübach, Lukas 2025-11-25 10:13:57 +01:00
parent b7dd1bc5a5
commit 9919a905f6
7 changed files with 77 additions and 20 deletions

View file

@ -126,36 +126,62 @@ void ArchidektApiResponseDeckEntryDisplayWidget::mousePressEvent(QMouseEvent *ev
actRequestNavigationToDeck(); actRequestNavigationToDeck();
} }
void ArchidektApiResponseDeckEntryDisplayWidget::setScaleFactor(int scale)
{
scaleFactor = scale;
updateScaledPreview();
}
void ArchidektApiResponseDeckEntryDisplayWidget::onPreviewImageLoadFinished(QNetworkReply *reply) void ArchidektApiResponseDeckEntryDisplayWidget::onPreviewImageLoadFinished(QNetworkReply *reply)
{ {
if (reply->url() != response.getFeatured()) { if (reply->url() != response.getFeatured()) {
return; return;
} }
if (reply->error() != QNetworkReply::NoError) { QPixmap loaded;
QPixmap pixmap;
CardPictureLoader::getCardBackLoadingFailedPixmap(pixmap, QSize(400, 400));
picture->setPixmap(pixmap.scaled(400, 400, Qt::KeepAspectRatio, Qt::SmoothTransformation));
previewWidget->update();
previewWidget->updateGeometry();
reply->deleteLater(); if (reply->error() != QNetworkReply::NoError || !loaded.loadFromData(reply->readAll())) {
return; CardPictureLoader::getCardBackLoadingFailedPixmap(loaded, QSize(400, 400));
} }
QByteArray imageData = reply->readAll(); originalPixmap = loaded;
QPixmap pixmap;
if (!pixmap.loadFromData(imageData)) { float ratio = float(originalPixmap.height()) / float(originalPixmap.width());
CardPictureLoader::getCardBackLoadingFailedPixmap(pixmap, QSize(400, 400)); previewWidget->setAspectRatio(ratio);
} previewWidget->setPreviewWidth(400);
picture->setPixmap(pixmap.scaled(400, 400, Qt::KeepAspectRatio, Qt::SmoothTransformation));
previewWidget->update(); // Initial scaling
previewWidget->updateGeometry(); updateScaledPreview();
reply->deleteLater(); 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) void ArchidektApiResponseDeckEntryDisplayWidget::resizeEvent(QResizeEvent *event)
{ {
QWidget::resizeEvent(event); QWidget::resizeEvent(event);

View file

@ -23,10 +23,12 @@ public:
ArchidektApiResponseDeckListingContainer response, ArchidektApiResponseDeckListingContainer response,
QNetworkAccessManager *imageNetworkManager); QNetworkAccessManager *imageNetworkManager);
void onPreviewImageLoadFinished(QNetworkReply *reply); void onPreviewImageLoadFinished(QNetworkReply *reply);
void updateScaledPreview();
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
public slots: public slots:
void actRequestNavigationToDeck(); void actRequestNavigationToDeck();
void setScaleFactor(int scale);
protected: protected:
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
@ -37,6 +39,8 @@ private:
QNetworkAccessManager *imageNetworkManager; QNetworkAccessManager *imageNetworkManager;
ArchidektDeckPreviewImageDisplayWidget *previewWidget; ArchidektDeckPreviewImageDisplayWidget *previewWidget;
QLabel *picture; QLabel *picture;
QPixmap originalPixmap;
int scaleFactor = 100;
}; };
#endif // COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_ENTRY_DISPLAY_WIDGET_H #endif // COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_ENTRY_DISPLAY_WIDGET_H

View file

@ -5,8 +5,9 @@
ArchidektApiResponseDeckListingsDisplayWidget::ArchidektApiResponseDeckListingsDisplayWidget( ArchidektApiResponseDeckListingsDisplayWidget::ArchidektApiResponseDeckListingsDisplayWidget(
QWidget *parent, QWidget *parent,
ArchidektDeckListingApiResponse response) ArchidektDeckListingApiResponse response,
: QWidget(parent) CardSizeWidget *_cardSizeSlider)
: QWidget(parent), cardSizeSlider(_cardSizeSlider)
{ {
layout = new QHBoxLayout(this); layout = new QHBoxLayout(this);
setLayout(layout); setLayout(layout);
@ -27,6 +28,8 @@ ArchidektApiResponseDeckListingsDisplayWidget::ArchidektApiResponseDeckListingsD
new ArchidektApiResponseDeckEntryDisplayWidget(this, deckListing, imageNetworkManager); new ArchidektApiResponseDeckEntryDisplayWidget(this, deckListing, imageNetworkManager);
connect(cardListDisplayWidget, &ArchidektApiResponseDeckEntryDisplayWidget::requestNavigation, this, connect(cardListDisplayWidget, &ArchidektApiResponseDeckEntryDisplayWidget::requestNavigation, this,
&ArchidektApiResponseDeckListingsDisplayWidget::requestNavigation); &ArchidektApiResponseDeckListingsDisplayWidget::requestNavigation);
connect(cardSizeSlider->getSlider(), &QSlider::valueChanged, cardListDisplayWidget,
&ArchidektApiResponseDeckEntryDisplayWidget::setScaleFactor);
flowWidget->addWidget(cardListDisplayWidget); flowWidget->addWidget(cardListDisplayWidget);
} }

View file

@ -1,6 +1,7 @@
#ifndef COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_LISTINGS_DISPLAY_WIDGET_H #ifndef COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_LISTINGS_DISPLAY_WIDGET_H
#define 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 "../../../../general/layout_containers/flow_widget.h"
#include "../api_response/archidekt_deck_listing_api_response.h" #include "../api_response/archidekt_deck_listing_api_response.h"
@ -18,10 +19,13 @@ signals:
void requestNavigation(QString url); void requestNavigation(QString url);
public: public:
explicit ArchidektApiResponseDeckListingsDisplayWidget(QWidget *parent, ArchidektDeckListingApiResponse response); explicit ArchidektApiResponseDeckListingsDisplayWidget(QWidget *parent,
ArchidektDeckListingApiResponse response,
CardSizeWidget *cardSizeSlider);
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
private: private:
CardSizeWidget *cardSizeSlider;
QHBoxLayout *layout; QHBoxLayout *layout;
FlowWidget *flowWidget; FlowWidget *flowWidget;
QNetworkAccessManager *imageNetworkManager; QNetworkAccessManager *imageNetworkManager;

View file

@ -27,6 +27,20 @@ ArchidektDeckPreviewImageDisplayWidget::ArchidektDeckPreviewImageDisplayWidget(Q
bottomRightLabel->raise(); 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) void ArchidektDeckPreviewImageDisplayWidget::resizeEvent(QResizeEvent *event)
{ {
QWidget::resizeEvent(event); QWidget::resizeEvent(event);

View file

@ -16,6 +16,9 @@ class ArchidektDeckPreviewImageDisplayWidget : public QWidget
public: public:
explicit ArchidektDeckPreviewImageDisplayWidget(QWidget *parent = nullptr); explicit ArchidektDeckPreviewImageDisplayWidget(QWidget *parent = nullptr);
void setAspectRatio(float ratio);
void setPreviewWidth(int width);
QLabel *imageLabel; QLabel *imageLabel;
OverlayLabel *topLeftLabel; OverlayLabel *topLeftLabel;
OverlayLabel *topRightLabel; OverlayLabel *topRightLabel;
@ -24,6 +27,9 @@ public:
protected: protected:
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
private:
float aspectRatio = 1.0f;
}; };
#endif // COCKATRICE_ARCHIDEKT_DECK_PREVIEW_IMAGE_DISPLAY_WIDGET_H #endif // COCKATRICE_ARCHIDEKT_DECK_PREVIEW_IMAGE_DISPLAY_WIDGET_H

View file

@ -289,7 +289,7 @@ void TabArchidekt::processTopDecksResponse(QJsonObject reply)
currentPageLayout = new QVBoxLayout(currentPageDisplay); currentPageLayout = new QVBoxLayout(currentPageDisplay);
currentPageDisplay->setLayout(currentPageLayout); currentPageDisplay->setLayout(currentPageLayout);
auto display = new ArchidektApiResponseDeckListingsDisplayWidget(currentPageDisplay, deckData); auto display = new ArchidektApiResponseDeckListingsDisplayWidget(currentPageDisplay, deckData, cardSizeSlider);
connect(display, &ArchidektApiResponseDeckListingsDisplayWidget::requestNavigation, this, connect(display, &ArchidektApiResponseDeckListingsDisplayWidget::requestNavigation, this,
&TabArchidekt::actNavigatePage); &TabArchidekt::actNavigatePage);
currentPageLayout->addWidget(display); currentPageLayout->addWidget(display);