diff options
-rw-r--r-- | audio/mixxx/debc5051ddf02c4274cfe21eba3779a14a0fc55c.patch | 385 | ||||
-rw-r--r-- | audio/mixxx/mixxx.SlackBuild | 7 | ||||
-rw-r--r-- | audio/mixxx/mixxx.info | 10 |
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" |