aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/mixxx/debc5051ddf02c4274cfe21eba3779a14a0fc55c.patch385
-rw-r--r--audio/mixxx/mixxx.SlackBuild7
-rw-r--r--audio/mixxx/mixxx.info10
3 files changed, 395 insertions, 7 deletions
diff --git a/audio/mixxx/debc5051ddf02c4274cfe21eba3779a14a0fc55c.patch b/audio/mixxx/debc5051ddf02c4274cfe21eba3779a14a0fc55c.patch
new file mode 100644
index 0000000000..2b5571edf9
--- /dev/null
+++ b/audio/mixxx/debc5051ddf02c4274cfe21eba3779a14a0fc55c.patch
@@ -0,0 +1,385 @@
+From debc5051ddf02c4274cfe21eba3779a14a0fc55c Mon Sep 17 00:00:00 2001
+From: ronso0 <ronso0@mixxx.org>
+Date: Thu, 27 Feb 2025 13:45:15 +0100
+Subject: [PATCH] Track info: fix size of cover art label
+
+* max height is now height of the three top rows
+* max width is now width of the two rightmost columns
+
+This prevents
+* flickering of single-track dialog when switching tracks
+* unintentional vertical stretching grid rows
+---
+ src/library/dlgtagfetcher.cpp | 8 ++--
+ src/library/dlgtrackinfo.cpp | 36 ++++++++++++++-
+ src/library/dlgtrackinfo.h | 4 ++
+ src/library/dlgtrackinfomulti.cpp | 31 +++++++++++--
+ src/library/dlgtrackinfomulti.h | 4 +-
+ src/widget/wcoverartlabel.cpp | 77 +++++++++++++++++++++++--------
+ src/widget/wcoverartlabel.h | 13 ++++--
+ 7 files changed, 139 insertions(+), 34 deletions(-)
+
+diff --git a/src/library/dlgtagfetcher.cpp b/src/library/dlgtagfetcher.cpp
+index 59361de64b87..b460db7d62ad 100644
+--- a/src/library/dlgtagfetcher.cpp
++++ b/src/library/dlgtagfetcher.cpp
+@@ -255,7 +255,7 @@ void DlgTagFetcher::loadTrack(const TrackPointer& pTrack) {
+ &DlgTagFetcher::slotTrackChanged);
+ }
+
+- m_pWFetchedCoverArtLabel->setCoverArt(CoverInfo{}, QPixmap{});
++ m_pWFetchedCoverArtLabel->setCoverInfoAndPixmap(CoverInfo{}, QPixmap{});
+
+ m_coverCache.clear();
+
+@@ -580,7 +580,7 @@ void DlgTagFetcher::tagSelected() {
+ m_data.m_selectedTag = tagIndex;
+
+ m_fetchedCoverArtByteArrays.clear();
+- m_pWFetchedCoverArtLabel->setCoverArt(CoverInfo{},
++ m_pWFetchedCoverArtLabel->setCoverInfoAndPixmap(CoverInfo{},
+ QPixmap(CoverArtUtils::defaultCoverLocation()));
+
+ const mixxx::musicbrainz::TrackRelease& trackRelease = m_data.m_tags[tagIndex];
+@@ -612,7 +612,7 @@ void DlgTagFetcher::slotCoverFound(
+ m_pTrack &&
+ m_pTrack->getLocation() == coverInfo.trackLocation) {
+ m_trackRecord.setCoverInfo(coverInfo);
+- m_pWCurrentCoverArtLabel->setCoverArt(coverInfo, pixmap);
++ m_pWCurrentCoverArtLabel->setCoverInfoAndPixmap(coverInfo, pixmap);
+ }
+ }
+
+@@ -673,7 +673,7 @@ void DlgTagFetcher::loadPixmapToLabel(const QPixmap& pixmap) {
+ statusMessage->clear();
+ statusMessage->setVisible(true);
+
+- m_pWFetchedCoverArtLabel->setCoverArt(coverInfo, pixmap);
++ m_pWFetchedCoverArtLabel->setCoverInfoAndPixmap(coverInfo, pixmap);
+
+ checkBoxCover->setEnabled(!pixmap.isNull());
+ }
+diff --git a/src/library/dlgtrackinfo.cpp b/src/library/dlgtrackinfo.cpp
+index 070658721c91..97dbf200d8b1 100644
+--- a/src/library/dlgtrackinfo.cpp
++++ b/src/library/dlgtrackinfo.cpp
+@@ -382,7 +382,7 @@ void DlgTrackInfo::replaceTrackRecord(
+ const auto coverInfo = CoverInfo(
+ m_trackRecord.getCoverInfo(),
+ trackLocation);
+- m_pWCoverArtLabel->setCoverArt(coverInfo, QPixmap());
++ m_pWCoverArtLabel->setCoverInfoAndPixmap(coverInfo, QPixmap());
+ // Executed concurrently
+ CoverArtCache::requestCover(this, coverInfo);
+
+@@ -508,6 +508,9 @@ void DlgTrackInfo::loadTrack(const QModelIndex& index) {
+ return;
+ }
+ TrackPointer pTrack = m_pTrackModel->getTrack(index);
++ VERIFY_OR_DEBUG_ASSERT(pTrack) {
++ return;
++ }
+ m_currentTrackIndex = index;
+ loadTrackInternal(pTrack);
+ if (m_pDlgTagFetcher && m_pDlgTagFetcher->isVisible()) {
+@@ -537,7 +540,7 @@ void DlgTrackInfo::slotCoverFound(
+ m_pLoadedTrack &&
+ m_pLoadedTrack->getLocation() == coverInfo.trackLocation) {
+ m_trackRecord.setCoverInfo(coverInfo);
+- m_pWCoverArtLabel->setCoverArt(coverInfo, pixmap);
++ m_pWCoverArtLabel->setCoverInfoAndPixmap(coverInfo, pixmap);
+ }
+ }
+
+@@ -863,3 +866,32 @@ void DlgTrackInfo::slotImportMetadataFromMusicBrainz() {
+ }
+ m_pDlgTagFetcher->show();
+ }
++
++void DlgTrackInfo::resizeEvent(QResizeEvent* pEvent) {
++ QDialog::resizeEvent(pEvent);
++
++ if (!isVisible()) {
++ // Likely one of the resize events before show().
++ // Widgets don't have their final size, yet, so it
++ // makes no sense to resize the cover label.
++ return;
++ }
++
++ // Set a maximum size on the cover label so it can use the available space
++ // but doesn't force-expand the dialog.
++ // The cover label spans across three tag rows and the two rightmost columns.
++ // Unfortunately we can't read row/column sizes directly, so we use the widgets.
++ int contHeight = txtTitle->height() + txtArtist->height() + txtAlbum->height();
++ int vSpacing = tags_layout->verticalSpacing();
++ int totalHeight = vSpacing * 2 + contHeight;
++
++ int contWidth = lblYear->width() + txtYear->width();
++ int hSpacing = tags_layout->horizontalSpacing();
++ int totalWidth = contWidth + hSpacing;
++
++ m_pWCoverArtLabel->setMaxSize(QSize(totalWidth, totalHeight));
++
++ // Also clamp height of the cover's parent widget. Keeping its height minimal
++ // can't be accomplished with QSizePolicies alone unfortunately.
++ coverWidget->setFixedHeight(totalHeight);
++}
+diff --git a/src/library/dlgtrackinfo.h b/src/library/dlgtrackinfo.h
+index 8949c530eb47..525042b5ed13 100644
+--- a/src/library/dlgtrackinfo.h
++++ b/src/library/dlgtrackinfo.h
+@@ -45,6 +45,10 @@ class DlgTrackInfo : public QDialog, public Ui::DlgTrackInfo {
+ void next();
+ void previous();
+
++ protected:
++ // used to set the maximum size of the cover label
++ void resizeEvent(QResizeEvent* pEvent) override;
++
+ private slots:
+ void slotNextButton();
+ void slotPrevButton();
+diff --git a/src/library/dlgtrackinfomulti.cpp b/src/library/dlgtrackinfomulti.cpp
+index bbcd07a46ca0..7977dd55bc71 100644
+--- a/src/library/dlgtrackinfomulti.cpp
++++ b/src/library/dlgtrackinfomulti.cpp
+@@ -613,10 +613,35 @@ void DlgTrackInfoMulti::addValuesToCommentBox(QSet<QString>& comments) {
+
+ void DlgTrackInfoMulti::resizeEvent(QResizeEvent* pEvent) {
+ Q_UNUSED(pEvent);
++ if (!isVisible()) {
++ // Likely one of the resize events before show().
++ // Dialog & widgets don't have their final size, yet,
++ // so it makes no sense to resize the cover label.
++ return;
++ }
++
+ // Limit comment popup to dialog width. This may introduce some linebreaks
+ // but is still much better than letting the popup expand to screen width,
+ // which it would do regrardless if it's actually necessary.
+ txtCommentBox->view()->parentWidget()->setMaximumWidth(width());
++
++ // Set a maximum size on the cover label so it can use the available space
++ // but doesn't force-expand the dialog.
++ // The cover label spans across three tag rows and the two rightmost columns.
++ // Unfortunately we can't read row/column sizes directly, so we use the widgets.
++ int contHeight = txtTitle->height() + txtArtist->height() + txtAlbum->height();
++ int vSpacing = tags_layout->verticalSpacing();
++ int totalHeight = vSpacing * 2 + contHeight;
++
++ int contWidth = lblYear->width() + txtYear->width();
++ int hSpacing = tags_layout->horizontalSpacing();
++ int totalWidth = contWidth + hSpacing;
++
++ m_pWCoverArtLabel->setMaxSize(QSize(totalWidth, totalHeight));
++
++ // Also clamp height of the cover's parent widget. Keeping its height minimal
++ // can't be accomplished with QSizePolicies alone unfortunately.
++ coverWidget->setFixedHeight(totalHeight);
+ }
+
+ void DlgTrackInfoMulti::saveTracks() {
+@@ -1043,12 +1068,12 @@ void DlgTrackInfoMulti::updateCoverArtFromTracks() {
+ // Just make sure the same track is used in slotCoverFound(): the track
+ // location has to match in order to load the cover image to the label.
+ auto trCover = pRefTrack->getCoverInfoWithLocation();
+- m_pWCoverArtLabel->setCoverArt(trCover, QPixmap());
++ m_pWCoverArtLabel->setCoverInfoAndPixmap(trCover, QPixmap());
+ CoverArtCache::requestCover(this, trCover);
+ } else {
+ // Set empty cover + track location
+ auto trCover = CoverInfo(CoverInfoRelative(), pRefTrack->getLocation());
+- m_pWCoverArtLabel->setCoverArt(trCover, QPixmap());
++ m_pWCoverArtLabel->setCoverInfoAndPixmap(trCover, QPixmap());
+ }
+ }
+
+@@ -1061,7 +1086,7 @@ void DlgTrackInfoMulti::slotCoverFound(
+ m_pLoadedTracks.cbegin().value()->getLocation() == coverInfo.trackLocation) {
+ // Track records have already been updated in slotCoverInfoSelected,
+ // now load the image to the label.
+- m_pWCoverArtLabel->setCoverArt(coverInfo, pixmap);
++ m_pWCoverArtLabel->setCoverInfoAndPixmap(coverInfo, pixmap);
+ }
+ }
+
+diff --git a/src/library/dlgtrackinfomulti.h b/src/library/dlgtrackinfomulti.h
+index d733bda4788f..4c069f549d95 100644
+--- a/src/library/dlgtrackinfomulti.h
++++ b/src/library/dlgtrackinfomulti.h
+@@ -31,11 +31,11 @@ class DlgTrackInfoMulti : public QDialog, public Ui::DlgTrackInfoMulti {
+ void loadTracks(const QList<TrackPointer>& pTracks);
+ void focusField(const QString& property);
+
++ protected:
+ /// We need this to set the max width of the comment QComboBox which has
+ /// issues with long lines / multi-line content. See init() for details.
++ /// Also used to set the maximum size of the cover label
+ void resizeEvent(QResizeEvent* event) override;
+-
+- protected:
+ bool eventFilter(QObject* pObj, QEvent* pEvent) override;
+
+ private slots:
+diff --git a/src/widget/wcoverartlabel.cpp b/src/widget/wcoverartlabel.cpp
+index 519c65b5de6f..fa08bc55767a 100644
+--- a/src/widget/wcoverartlabel.cpp
++++ b/src/widget/wcoverartlabel.cpp
+@@ -9,61 +9,100 @@
+
+ namespace {
+
+-constexpr QSize kDeviceIndependentCoverLabelSize = QSize(100, 100);
++// Device-independent size for the label
++constexpr QSize kDefaultSize = QSize(100, 100);
++
++// Size for the pixmap. Assumes frame width is 1px.
++constexpr QSize kDefaultPixmapSize = kDefaultSize - QSize(2, 2);
+
+ inline QPixmap scaleCoverLabel(
+- QWidget* parent,
+- QPixmap pixmap) {
+- const auto devicePixelRatioF = parent->devicePixelRatioF();
++ QLabel* pLabel,
++ QPixmap pixmap,
++ QSize size) {
++ VERIFY_OR_DEBUG_ASSERT(size.isValid()) {
++ size = kDefaultPixmapSize;
++ }
++ const auto devicePixelRatioF = pLabel->devicePixelRatioF();
+ pixmap.setDevicePixelRatio(devicePixelRatioF);
+ return pixmap.scaled(
+- kDeviceIndependentCoverLabelSize * devicePixelRatioF,
++ size * devicePixelRatioF,
+ Qt::KeepAspectRatio,
+ Qt::SmoothTransformation);
+ }
+
+-QPixmap createDefaultCover(QWidget* parent) {
++QPixmap createDefaultCover(QLabel* pLabel, QSize size) {
+ auto defaultCover = QPixmap(CoverArtUtils::defaultCoverLocation());
+- return scaleCoverLabel(parent, defaultCover);
++ return scaleCoverLabel(pLabel, defaultCover, size);
+ }
+
+ } // anonymous namespace
+
+-WCoverArtLabel::WCoverArtLabel(QWidget* parent, WCoverArtMenu* pCoverMenu)
+- : QLabel(parent),
++WCoverArtLabel::WCoverArtLabel(QWidget* pParent, WCoverArtMenu* pCoverMenu)
++ : QLabel(pParent),
+ m_pCoverMenu(pCoverMenu),
+ m_pDlgFullSize(make_parented<DlgCoverArtFullSize>(this, nullptr, pCoverMenu)),
+- m_defaultCover(createDefaultCover(this)) {
+- setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
++ m_maxSize(kDefaultSize),
++ m_pixmapSizeMax(kDefaultPixmapSize),
++ m_defaultCover(createDefaultCover(this, m_pixmapSizeMax)) {
++ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ setFrameShape(QFrame::Box);
+ setAlignment(Qt::AlignCenter);
+- setPixmap(m_defaultCover);
++ setPixmapAndResize(m_defaultCover);
+ }
+
+ WCoverArtLabel::~WCoverArtLabel() = default;
+
+-void WCoverArtLabel::setCoverArt(const CoverInfo& coverInfo,
++void WCoverArtLabel::setCoverInfoAndPixmap(const CoverInfo& coverInfo,
+ const QPixmap& px) {
+ if (m_pCoverMenu != nullptr) {
+ m_pCoverMenu->setCoverArt(coverInfo);
+ }
++ setPixmapAndResize(px);
++}
++
++void WCoverArtLabel::setPixmapAndResize(const QPixmap& px) {
+ if (px.isNull()) {
+ m_loadedCover = px;
+ m_fullSizeCover = px;
+ setPixmap(m_defaultCover);
+ } else {
+- m_loadedCover = scaleCoverLabel(this, px);
++ m_loadedCover = scaleCoverLabel(this, px, m_pixmapSizeMax);
+ m_fullSizeCover = px;
+ setPixmap(m_loadedCover);
+ }
+ #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
+- QSize frameSize = pixmap(Qt::ReturnByValue).size() / devicePixelRatioF();
++ QSize newSize = pixmap().size() / devicePixelRatioF();
+ #else
+- QSize frameSize = pixmap()->size() / devicePixelRatioF();
++ QSize newSize = pixmap()->size() / devicePixelRatioF();
+ #endif
+- frameSize += QSize(2, 2); // margin
+- setMinimumSize(frameSize);
+- setMaximumSize(frameSize);
++ // add the frame so the entire pixmap is visible
++ newSize += QSize(frameWidth() * 2, frameWidth() * 2);
++ if (size() != newSize) {
++ setFixedSize(newSize);
++ }
++}
++
++void WCoverArtLabel::setMaxSize(const QSize newSize) {
++ if (newSize == m_maxSize) {
++ return;
++ }
++
++ m_maxSize = newSize;
++ m_pixmapSizeMax = newSize - QSize(frameWidth() * 2, frameWidth() * 2);
++ // Skip resizing the pixmap and label if the pixmap already fits.
++ // Check if we got more space in one dimension and don't need it
++ // for the other.
++ const QSize pixmapSize = pixmap().size() / devicePixelRatioF();
++ if (m_pixmapSizeMax == pixmapSize ||
++ (m_pixmapSizeMax.height() == pixmapSize.height() &&
++ m_pixmapSizeMax.width() > pixmapSize.width()) ||
++ (m_pixmapSizeMax.width() == pixmapSize.width() &&
++ m_pixmapSizeMax.height() > pixmapSize.height())) {
++ return;
++ }
++
++ m_defaultCover = createDefaultCover(this, m_pixmapSizeMax);
++ setPixmapAndResize(m_fullSizeCover);
+ }
+
+ void WCoverArtLabel::slotCoverMenu(const QPoint& pos) {
+diff --git a/src/widget/wcoverartlabel.h b/src/widget/wcoverartlabel.h
+index 9b5421d26868..2611c7a140f4 100644
+--- a/src/widget/wcoverartlabel.h
++++ b/src/widget/wcoverartlabel.h
+@@ -19,24 +19,29 @@ class WCoverArtLabel : public QLabel {
+
+ ~WCoverArtLabel() override; // Verifies that the base destructor is virtual
+
+- void setCoverArt(const CoverInfo& coverInfo, const QPixmap& px);
++ void setCoverInfoAndPixmap(const CoverInfo& coverInfo, const QPixmap& px);
+ void loadTrack(TrackPointer pTrack);
++ void setMaxSize(const QSize size);
+
+ protected:
+- void mousePressEvent(QMouseEvent* event) override;
+- void contextMenuEvent(QContextMenuEvent* event) override;
++ void mousePressEvent(QMouseEvent* pEvent) override;
++ void contextMenuEvent(QContextMenuEvent* pEvent) override;
+
+ private slots:
+ void slotCoverMenu(const QPoint& pos);
+
+ private:
++ void setPixmapAndResize(const QPixmap& px);
++
+ WCoverArtMenu* m_pCoverMenu;
+
+ const parented_ptr<DlgCoverArtFullSize> m_pDlgFullSize;
+
+ TrackPointer m_pLoadedTrack;
+
+- const QPixmap m_defaultCover;
++ QSize m_maxSize;
++ QSize m_pixmapSizeMax;
++ QPixmap m_defaultCover;
+ QPixmap m_loadedCover;
+ QPixmap m_fullSizeCover;
+ };
diff --git a/audio/mixxx/mixxx.SlackBuild b/audio/mixxx/mixxx.SlackBuild
index e2ecff67b0..085d313c64 100644
--- a/audio/mixxx/mixxx.SlackBuild
+++ b/audio/mixxx/mixxx.SlackBuild
@@ -28,9 +28,9 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=mixxx
-VERSION=${VERSION:-2.5.0}
+VERSION=${VERSION:-2.5.1}
KEYFVER=${KEYFVER:-2.2.8}
-DJINVER=${DJINVER:-0.22.1}
+DJINVER=${DJINVER:-0.24.3}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -81,6 +81,9 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
+sed -i '/<QDomElement>/a #include <memory>' src/controllers/legacycontrollersettingsfactory.h
+patch -p1 -R < $CWD/debc5051ddf02c4274cfe21eba3779a14a0fc55c.patch
+
mkdir -p build
cd build
mkdir -p downloads
diff --git a/audio/mixxx/mixxx.info b/audio/mixxx/mixxx.info
index eb3c3417f8..05a1cace23 100644
--- a/audio/mixxx/mixxx.info
+++ b/audio/mixxx/mixxx.info
@@ -1,12 +1,12 @@
PRGNAM="mixxx"
-VERSION="2.5.0"
+VERSION="2.5.1"
HOMEPAGE="https://www.mixxx.org"
-DOWNLOAD="https://github.com/mixxxdj/mixxx/archive/2.5.0/mixxx-2.5.0.tar.gz \
+DOWNLOAD="https://github.com/mixxxdj/mixxx/archive/2.5.1/mixxx-2.5.1.tar.gz \
https://github.com/mixxxdj/libkeyfinder/archive/2.2.8/libkeyfinder-2.2.8.zip \
- https://github.com/xsco/libdjinterop/archive/0.22.1/libdjinterop-0.22.1.tar.gz"
-MD5SUM="9684638c12cd3eeda0403b6836cd3bde \
+ https://github.com/xsco/libdjinterop/archive/0.24.3/libdjinterop-0.24.3.tar.gz"
+MD5SUM="15dd2a5d8d70832bf63f7948e98308c7 \
020820804fd3e02bb8385943dceb688b \
- 48e03b58dc34b803a2670830729da8aa"
+ 6eca3d37816a2936367dc4a6e9621a6a"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="chromaprint faad2 googlebenchmark hidapi libebur128 libmodplug libmp4v2 libshout lilv microsoft-gsl opencore-amr portaudio portmidi protobuf3 rubberband soundtouch"