diff options
-rw-r--r-- | src/dlgtrackinfo.cpp | 47 | ||||
-rw-r--r-- | src/dlgtrackinfo.h | 4 | ||||
-rw-r--r-- | src/trackinfoobject.cpp | 61 | ||||
-rw-r--r-- | src/trackinfoobject.h | 1 | ||||
-rw-r--r-- | src/widget/wcoverart.cpp | 21 | ||||
-rw-r--r-- | src/widget/wcoverart.h | 4 | ||||
-rw-r--r-- | src/widget/wcoverartlabel.cpp | 25 | ||||
-rw-r--r-- | src/widget/wcoverartlabel.h | 6 | ||||
-rw-r--r-- | src/widget/wcoverartmenu.cpp | 104 | ||||
-rw-r--r-- | src/widget/wcoverartmenu.h | 17 |
10 files changed, 100 insertions, 190 deletions
diff --git a/src/dlgtrackinfo.cpp b/src/dlgtrackinfo.cpp index 1edc640211..119cd3830c 100644 --- a/src/dlgtrackinfo.cpp +++ b/src/dlgtrackinfo.cpp @@ -85,10 +85,8 @@ void DlgTrackInfo::init(){ connect(pCache, SIGNAL(pixmapFound(int, QPixmap)), this, SLOT(slotPixmapFound(int, QPixmap))); } - connect(m_pWCoverArtLabel, - SIGNAL(coverLocationUpdated(const QString&, const QString&, QPixmap)), - this, - SLOT(slotCoverLocationUpdated(const QString&, const QString&, QPixmap))); + connect(m_pWCoverArtLabel, SIGNAL(coverArtSelected(const CoverArt&)), + this, SLOT(slotCoverArtSelected(const CoverArt&))); } void DlgTrackInfo::OK() { @@ -172,14 +170,21 @@ void DlgTrackInfo::populateFields(TrackPointer pTrack) { bpmHalve->setEnabled(enableBpmEditing); bpmTwoThirds->setEnabled(enableBpmEditing); bpmThreeFourth->setEnabled(enableBpmEditing); + + m_loadedCover = pTrack->getCoverInfo(); + m_loadedCover.trackId = pTrack->getId(); + m_loadedCover.trackLocation = pTrack->getLocation(); + CoverArtCache* pCache = CoverArtCache::instance(); + if (pCache != NULL) { + pCache->requestCover(m_loadedCover); + } } void DlgTrackInfo::loadTrack(TrackPointer pTrack) { m_pLoadedTrack = pTrack; - m_loadedCover = pTrack->getCoverInfo(); clear(); - if (m_pLoadedTrack == NULL) { + if (m_pLoadedTrack.isNull()) { return; } @@ -189,15 +194,11 @@ void DlgTrackInfo::loadTrack(TrackPointer pTrack) { disconnect(this, SLOT(updateTrackMetadata())); connect(pTrack.data(), SIGNAL(changed(TrackInfoObject*)), this, SLOT(updateTrackMetadata())); - - CoverArtCache* pCache = CoverArtCache::instance(); - if (pCache != NULL) { - pCache->requestCover(m_loadedCover); - } } void DlgTrackInfo::slotPixmapFound(int trackId, QPixmap pixmap) { - if (m_pLoadedTrack == NULL) { + qDebug() << "DlgTrackInfo::slotPixmapFound" << trackId << pixmap.size(); + if (m_pLoadedTrack.isNull()) { return; } @@ -206,17 +207,21 @@ void DlgTrackInfo::slotPixmapFound(int trackId, QPixmap pixmap) { } } -void DlgTrackInfo::slotCoverLocationUpdated(const QString& newLoc, - const QString& oldLoc, - QPixmap pixmap) { - if (isVisible() && m_loadedCover.coverLocation == oldLoc) { - m_loadedCover.coverLocation = newLoc; - m_pWCoverArtLabel->setCoverArt(m_pLoadedTrack, m_loadedCover, pixmap); +void DlgTrackInfo::slotCoverArtSelected(const CoverArt& art) { + qDebug() << "DlgTrackInfo::slotCoverArtSelected" << art; + m_loadedCover = art.info; + if (m_pLoadedTrack) { + m_loadedCover.trackId = m_pLoadedTrack->getId(); + m_loadedCover.trackLocation = m_pLoadedTrack->getLocation(); + } + CoverArtCache* pCache = CoverArtCache::instance(); + if (pCache != NULL) { + pCache->requestCover(m_loadedCover); } } void DlgTrackInfo::slotOpenInFileBrowser() { - if (m_pLoadedTrack == NULL) { + if (m_pLoadedTrack.isNull()) { return; } @@ -383,7 +388,6 @@ void DlgTrackInfo::unloadTrack(bool save) { clear(); disconnect(this, SLOT(updateTrackMetadata())); m_pLoadedTrack.clear(); - m_loadedCover = CoverInfo(); } void DlgTrackInfo::clear() { @@ -409,6 +413,9 @@ void DlgTrackInfo::clear() { m_cueMap.clear(); cueTable->clearContents(); cueTable->setRowCount(0); + + m_loadedCover = CoverInfo(); + m_pWCoverArtLabel->setCoverArt(TrackPointer(), CoverInfo(), QPixmap()); } void DlgTrackInfo::slotBpmDouble() { diff --git a/src/dlgtrackinfo.h b/src/dlgtrackinfo.h index 856c92bd80..c0ea90fee8 100644 --- a/src/dlgtrackinfo.h +++ b/src/dlgtrackinfo.h @@ -56,9 +56,7 @@ class DlgTrackInfo : public QDialog, public Ui::DlgTrackInfo { void slotOpenInFileBrowser(); void slotPixmapFound(int trackId, QPixmap pixmap); - void slotCoverLocationUpdated(const QString& newLoc, - const QString& oldLoc, - QPixmap pixmap); + void slotCoverArtSelected(const CoverArt& art); private: void populateFields(TrackPointer pTrack); diff --git a/src/trackinfoobject.cpp b/src/trackinfoobject.cpp index fb85b6ebc3..50b7ec7b89 100644 --- a/src/trackinfoobject.cpp +++ b/src/trackinfoobject.cpp @@ -1043,64 +1043,3 @@ CoverArt TrackInfoObject::getCoverArt() const { QMutexLocker lock(&m_qMutex); return m_coverArt; } - -void TrackInfoObject::reloadCoverArt() { - // TODO(rryan): Reduce code duplication from other places. - QMutexLocker lock(&m_qMutex); - m_coverArt = CoverArt(); - - // Log parsing of header information in developer mode. This is useful for - // tracking down corrupt files. - const QString& canonicalLocation = m_fileInfo.canonicalFilePath(); - if (CmdlineArgs::Instance().getDeveloper()) { - qDebug() << "TrackInfoObject::reloadCoverArt()" << canonicalLocation; - } - - // Parse the information stored in the sound file. - SoundSourceProxy proxy(canonicalLocation, m_pSecurityToken); - Mixxx::SoundSource* pProxiedSoundSource = proxy.getProxiedSoundSource(); - if (pProxiedSoundSource != NULL) { - m_coverArt.image = proxy.parseCoverArt(); - if (!m_coverArt.image.isNull()) { - m_coverArt.info.hash = CoverArtUtils::calculateHash( - m_coverArt.image); - m_coverArt.info.coverLocation = QString(); - m_coverArt.info.type = CoverInfo::METADATA; - m_coverArt.info.source = CoverInfo::GUESSED; - qDebug() << "reloadCoverArt found metadata cover art" - << m_coverArt.info.hash - << m_coverArt.info.type - << m_coverArt.info.source - << m_coverArt.info.coverLocation; - setDirty(true); - return; - } else { - qDebug() << "reloadCoverArt didn't find metadata cover art"; - } - } - - // Search for image files in the track directory. - QRegExp coverArtFilenames(CoverArtUtils::supportedCoverArtExtensionsRegex(), - Qt::CaseInsensitive); - - QDirIterator it(m_fileInfo.path(), QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); - QFile currentFile; - QFileInfo currentFileInfo; - QLinkedList<QFileInfo> possibleCovers; - while (it.hasNext()) { - it.next(); - currentFileInfo = it.fileInfo(); - if (currentFileInfo.isFile() && - coverArtFilenames.indexIn(currentFileInfo.fileName()) != -1) { - possibleCovers.append(currentFileInfo); - } - } - - m_coverArt = CoverArtUtils::selectCoverArtForTrack(this, possibleCovers); - qDebug() << "reloadCoverArt file cover art?" - << m_coverArt.info.hash - << m_coverArt.info.type - << m_coverArt.info.source - << m_coverArt.info.coverLocation; - setDirty(true); -} diff --git a/src/trackinfoobject.h b/src/trackinfoobject.h index 28b1be0060..7cf5534a40 100644 --- a/src/trackinfoobject.h +++ b/src/trackinfoobject.h @@ -271,7 +271,6 @@ class TrackInfoObject : public QObject { void setCoverInfo(const CoverInfo& cover); CoverInfo getCoverInfo() const; - void reloadCoverArt(); void setCoverArt(const CoverArt& cover); CoverArt getCoverArt() const; diff --git a/src/widget/wcoverart.cpp b/src/widget/wcoverart.cpp index 7548ef9ea3..521f381b2c 100644 --- a/src/widget/wcoverart.cpp +++ b/src/widget/wcoverart.cpp @@ -31,10 +31,8 @@ WCoverArt::WCoverArt(QWidget* parent, connect(pCache, SIGNAL(pixmapFound(int, QPixmap)), this, SLOT(slotPixmapFound(int, QPixmap))); } - connect(m_pMenu, - SIGNAL(coverLocationUpdated(const QString&, const QString&, QPixmap)), - this, - SLOT(slotCoverLocationUpdated(const QString&, const QString&, QPixmap))); + connect(m_pMenu, SIGNAL(coverArtSelected(const CoverArt&)), + this, SLOT(slotCoverArtSelected(const CoverArt&))); } WCoverArt::~WCoverArt() { @@ -77,22 +75,13 @@ void WCoverArt::setup(QDomNode node, const SkinContext& context) { m_defaultCoverScaled = scaledCoverArt(m_defaultCover); } -void WCoverArt::slotCoverLocationUpdated(const QString& newLoc, - const QString& oldLoc, - QPixmap newCover) { - Q_UNUSED(oldLoc); - Q_UNUSED(newCover); - +void WCoverArt::slotCoverArtSelected(const CoverArt& art) { if (m_loadedTrack.isNull()) { return; } - - CoverArt art; - art.info.coverLocation = newLoc; - art.info.source = CoverInfo::USER_SELECTED; - art.info.type = CoverInfo::FILE; - // TODO(rryan): hash m_loadedTrack->setCoverArt(art); + // TODO(rryan): listen to TIO signal instead + slotLoadTrack(m_loadedTrack); } void WCoverArt::slotEnable(bool enable) { diff --git a/src/widget/wcoverart.h b/src/widget/wcoverart.h index 1b1a9f4ee1..d071b3ee1b 100644 --- a/src/widget/wcoverart.h +++ b/src/widget/wcoverart.h @@ -33,9 +33,7 @@ class WCoverArt : public QWidget, public WBaseWidget { private slots: void slotPixmapFound(int trackId, QPixmap pixmap); - void slotCoverLocationUpdated(const QString& newLoc, - const QString& oldLoc, - QPixmap px); + void slotCoverArtSelected(const CoverArt& art); protected: void paintEvent(QPaintEvent*); diff --git a/src/widget/wcoverartlabel.cpp b/src/widget/wcoverartlabel.cpp index b026ae09f7..e5bc937ad6 100644 --- a/src/widget/wcoverartlabel.cpp +++ b/src/widget/wcoverartlabel.cpp @@ -1,3 +1,5 @@ +#include <QtDebug> + #include "widget/wcoverartlabel.h" #include "library/coverartutils.h" @@ -6,8 +8,6 @@ static const QSize s_labelDisplaySize = QSize(100, 100); WCoverArtLabel::WCoverArtLabel(QWidget* parent) : QLabel(parent), - m_pTrack(TrackPointer()), - m_coverInfo(CoverInfo()), m_pCoverMenu(new WCoverArtMenu(this)), m_pDlgFullSize(new DlgCoverArtFullSize()), m_defaultCover(CoverArtUtils::defaultCoverLocation()) { @@ -17,10 +17,8 @@ WCoverArtLabel::WCoverArtLabel(QWidget* parent) setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotCoverMenu(QPoint))); - connect(m_pCoverMenu, - SIGNAL(coverLocationUpdated(const QString&, const QString&, QPixmap)), - this, - SIGNAL(coverLocationUpdated(const QString&, const QString&, QPixmap))); + connect(m_pCoverMenu, SIGNAL(coverArtSelected(const CoverArt&)), + this, SIGNAL(coverArtSelected(const CoverArt&))); m_defaultCover = m_defaultCover.scaled(s_labelDisplaySize, Qt::KeepAspectRatio, @@ -33,9 +31,17 @@ WCoverArtLabel::~WCoverArtLabel() { delete m_pDlgFullSize; } -void WCoverArtLabel::setCoverArt(TrackPointer track, CoverInfo info, QPixmap px) { - m_pTrack = track; +void WCoverArtLabel::setCoverArt(TrackPointer pTrack, const CoverInfo& info, QPixmap px) { + qDebug() << "WCoverArtLabel::setCoverArt" << info << px.size(); + + // Clear the WCoverArtMenu to release the TrackPointer it holds (we may as + // well have a WCoverArtMenu::setCoverArt method to match this one but the + // existing pattern is passing them in through show() so that's what we + // do).. + m_pCoverMenu->clear(); + m_coverInfo = info; + m_pTrack = pTrack; if (px.isNull()) { setPixmap(m_defaultCover); @@ -51,9 +57,6 @@ void WCoverArtLabel::setCoverArt(TrackPointer track, CoverInfo info, QPixmap px) } void WCoverArtLabel::slotCoverMenu(const QPoint& pos) { - if (m_pTrack == NULL) { - return; - } m_pCoverMenu->show(mapToGlobal(pos), m_coverInfo, m_pTrack); } diff --git a/src/widget/wcoverartlabel.h b/src/widget/wcoverartlabel.h index 82e7f2e20a..ac1f062f2b 100644 --- a/src/widget/wcoverartlabel.h +++ b/src/widget/wcoverartlabel.h @@ -15,12 +15,10 @@ class WCoverArtLabel : public QLabel { WCoverArtLabel(QWidget* parent = 0); virtual ~WCoverArtLabel(); - void setCoverArt(TrackPointer track, CoverInfo info, QPixmap px); + void setCoverArt(TrackPointer pTrack, const CoverInfo& info, QPixmap px); signals: - void coverLocationUpdated(const QString& newLocation, - const QString& oldLocation, - QPixmap newCover); + void coverArtSelected(const CoverArt& art); protected: void leaveEvent(QEvent*); diff --git a/src/widget/wcoverartmenu.cpp b/src/widget/wcoverartmenu.cpp index 875abe8514..ab6643cb37 100644 --- a/src/widget/wcoverartmenu.cpp +++ b/src/widget/wcoverartmenu.cpp @@ -1,5 +1,5 @@ #include <QFileDialog> -#include <QStringBuilder> +#include <QFileInfo> #include "widget/wcoverartmenu.h" #include "library/coverartutils.h" @@ -7,7 +7,6 @@ WCoverArtMenu::WCoverArtMenu(QWidget *parent) : QMenu(parent) { createActions(); - addActions(); } WCoverArtMenu::~WCoverArtMenu() { @@ -20,43 +19,48 @@ void WCoverArtMenu::createActions() { m_pChange = new QAction(tr("Choose new cover", "change cover art location"), this); connect(m_pChange, SIGNAL(triggered()), this, SLOT(slotChange())); + addAction(m_pChange); m_pUnset = new QAction(tr("Unset cover", "unset cover art - load default"), this); connect(m_pUnset, SIGNAL(triggered()), this, SLOT(slotUnset())); + addAction(m_pUnset); m_pReload = new QAction(tr("Reload from track/folder", "reload just cover art, using the search algorithm"), this); connect(m_pReload, SIGNAL(triggered()), this, SLOT(slotReload())); + addAction(m_pReload); } -void WCoverArtMenu::addActions() { - addAction(m_pChange); - addAction(m_pUnset); - addAction(m_pReload); +void WCoverArtMenu::clear() { + m_coverInfo = CoverInfo(); + m_pTrack.clear(); } void WCoverArtMenu::show(QPoint pos, CoverInfo info, TrackPointer pTrack) { - if (info.trackId < 1) { - return; - } m_coverInfo = info; m_pTrack = pTrack; popup(pos); } void WCoverArtMenu::slotChange() { - if (m_coverInfo.trackId < 1 || m_pTrack.isNull()) { - return; - } - // get initial directory (trackdir or coverdir) QString initialDir; - QString trackPath = m_pTrack->getDirectory(); - if (m_coverInfo.coverLocation.isEmpty()) { - initialDir = trackPath; - } else { - initialDir = m_coverInfo.coverLocation; + + QFileInfo track; + if (m_pTrack) { + track = m_pTrack->getFileInfo(); + } else if (!m_coverInfo.trackLocation.isEmpty()) { + track = QFileInfo(m_coverInfo.trackLocation); + } + + // If the cover is from file metadata then use the directory the track is + // in. + if (m_coverInfo.type == CoverInfo::METADATA) { + initialDir = track.absolutePath(); + } else if (m_coverInfo.type == CoverInfo::FILE) { + QFileInfo file(track.dir(), m_coverInfo.coverLocation); + initialDir = file.absolutePath(); } QStringList extensions = CoverArtUtils::supportedCoverArtExtensions(); @@ -69,58 +73,36 @@ void WCoverArtMenu::slotChange() { // open file dialog QString selectedCover = QFileDialog::getOpenFileName( this, tr("Change Cover Art"), initialDir, supportedText); - if (selectedCover.isEmpty()) { return; } - // if the cover comes from an external dir, - // we copy it to the track directory. - QString newCover; - QFileInfo fileInfo(selectedCover); - QString coverPath = fileInfo.absolutePath(); - if (trackPath == coverPath) { - newCover = selectedCover; - } else { - QDir trackDir(trackPath); - QString ext = fileInfo.suffix(); - QString mixxxCoverFile = trackDir.filePath("mixxx-cover." % ext); - QStringList filepaths; - filepaths << trackDir.filePath("cover." % ext) - << trackDir.filePath("album." % ext) - << mixxxCoverFile; - - foreach (QString filepath, filepaths) { - if (QFile::copy(selectedCover, filepath)) { - newCover = filepath; - break; - } - } - - if (newCover.isEmpty()) { - // overwrites "mixxx-cover" - QFile::remove(mixxxCoverFile); - if (QFile::copy(selectedCover, mixxxCoverFile)) { - newCover = mixxxCoverFile; - } - } - } + // TODO(rryan): Ask if user wants to copy the file. - QPixmap px(newCover); - emit(coverLocationUpdated(newCover, m_coverInfo.coverLocation, px)); + CoverArt art; + art.image = QImage(selectedCover); + if (art.image.isNull()) { + // TODO(rryan): feedback + return; + } + art.info.type = CoverInfo::FILE; + art.info.source = CoverInfo::USER_SELECTED; + art.info.coverLocation = selectedCover; + art.info.hash = CoverArtUtils::calculateHash(art.image); + qDebug() << "WCoverArtMenu::slotChange emit" << art; + emit(coverArtSelected(art)); } void WCoverArtMenu::slotReload() { - if (m_coverInfo.trackId < 1 || m_pTrack.isNull()) { - return; - } - // TODO(rryan): implement, need to signal to parent + CoverArt art = CoverArtUtils::guessCoverArt(m_pTrack); + qDebug() << "WCoverArtMenu::slotReload emit" << art; + emit(coverArtSelected(art)); } void WCoverArtMenu::slotUnset() { - if (m_coverInfo.trackId < 1) { - return; - } - QPixmap px; - emit(coverLocationUpdated(QString(), m_coverInfo.coverLocation, QPixmap())); + CoverArt art; + art.info.type = CoverInfo::NONE; + art.info.source = CoverInfo::USER_SELECTED; + qDebug() << "WCoverArtMenu::slotUnset emit" << art; + emit(coverArtSelected(art)); } diff --git a/src/widget/wcoverartmenu.h b/src/widget/wcoverartmenu.h index c882551f5e..d9356d1c1f 100644 --- a/src/widget/wcoverartmenu.h +++ b/src/widget/wcoverartmenu.h @@ -9,24 +9,22 @@ #include "trackinfoobject.h" #include "library/coverart.h" +// This class implements a context-menu with all CoverArt user actions. Callers +// MUST use the method show(...) to open the menu. do NOT use exec() or +// popup(). This class does not change the database -- it emits a +// coverArtSelected signal when the user performs an action. It is up to the +// parent to decide how to handle the action. class WCoverArtMenu : public QMenu { Q_OBJECT public: - // This class implements a context-menu with all CoverArt actions. Callers - // MUST use the method show(...) to open the menu. do NOT use exec() or - // popup(). This class does NOT CHANGE the database. When the cover is - // changed through any of the offered options the 'coverLocationUpdated' - // signal will be emitted and the widget using this menu can decide when and - // if the new cover should be saved. WCoverArtMenu(QWidget *parent = 0); virtual ~WCoverArtMenu(); void show(QPoint pos, CoverInfo info, TrackPointer pTrack); + void clear(); signals: - void coverLocationUpdated(const QString& newLocation, - const QString& oldLocation, - QPixmap newCover); + void coverArtSelected(const CoverArt& art); private slots: void slotChange(); @@ -35,7 +33,6 @@ class WCoverArtMenu : public QMenu { private: void createActions(); - void addActions(); QAction* m_pChange; QAction* m_pReload; |