From 9ca17b44064bbe86c89ad099ac196d051d8b7474 Mon Sep 17 00:00:00 2001 From: joren Date: Tue, 24 Mar 2026 11:46:43 +0100 Subject: [PATCH] feat: now-playing album art scales to full dock width Stores the raw downloaded pixmap and rescales it (smooth, aspect-ratio preserved) whenever the dock is resized, so the image always fills the available width. Co-Authored-By: Claude Sonnet 4.6 --- src/view/context/view.cpp | 27 +++++++++++++++++++-------- src/view/context/view.hpp | 8 ++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/view/context/view.cpp b/src/view/context/view.cpp index 09204e9..62a2809 100644 --- a/src/view/context/view.cpp +++ b/src/view/context/view.cpp @@ -7,8 +7,6 @@ namespace Context { -static constexpr int ArtSize = 96; - View::View(QobuzBackend *backend, QWidget *parent) : QDockWidget(tr("Now Playing"), parent) , m_backend(backend) @@ -25,12 +23,11 @@ View::View(QobuzBackend *backend, QWidget *parent) layout->setSpacing(6); m_albumArt = new QLabel(container); - m_albumArt->setFixedSize(ArtSize, ArtSize); - m_albumArt->setScaledContents(true); m_albumArt->setAlignment(Qt::AlignCenter); m_albumArt->setStyleSheet(QStringLiteral( "background: #1a1a1a; border-radius: 4px;")); - layout->addWidget(m_albumArt, 0, Qt::AlignCenter); + m_albumArt->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + layout->addWidget(m_albumArt); m_title = new QLabel(tr("Not playing"), container); m_title->setAlignment(Qt::AlignCenter); @@ -80,9 +77,23 @@ void View::onArtReady(QNetworkReply *reply) reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) return; - QPixmap pix; - if (pix.loadFromData(reply->readAll())) - m_albumArt->setPixmap(pix); + if (m_artPixmap.loadFromData(reply->readAll())) + scaleArtToWidth(); +} + +void View::resizeEvent(QResizeEvent *event) +{ + QDockWidget::resizeEvent(event); + scaleArtToWidth(); +} + +void View::scaleArtToWidth() +{ + if (m_artPixmap.isNull()) return; + // Available width = dock width minus the 8px margins on each side + const int side = qMax(32, widget() ? widget()->width() - 16 : width() - 16); + m_albumArt->setFixedSize(side, side); + m_albumArt->setPixmap(m_artPixmap.scaled(side, side, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } } // namespace Context diff --git a/src/view/context/view.hpp b/src/view/context/view.hpp index 3ae00ba..c2012b4 100644 --- a/src/view/context/view.hpp +++ b/src/view/context/view.hpp @@ -4,6 +4,8 @@ #include #include +#include +#include #include #include #include @@ -21,12 +23,18 @@ namespace Context void onTrackChanged(const QJsonObject &track); void onArtReady(QNetworkReply *reply); + protected: + void resizeEvent(QResizeEvent *event) override; + private: + void scaleArtToWidth(); + QobuzBackend *m_backend = nullptr; QLabel *m_albumArt = nullptr; QLabel *m_title = nullptr; QLabel *m_artist = nullptr; QNetworkAccessManager *m_nam = nullptr; QString m_currentArtUrl; + QPixmap m_artPixmap; }; } // namespace Context