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();
}
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);

View file

@ -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

View file

@ -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);
}

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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);