summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/dlgtrackinfo.cpp47
-rw-r--r--src/dlgtrackinfo.h4
-rw-r--r--src/trackinfoobject.cpp61
-rw-r--r--src/trackinfoobject.h1
-rw-r--r--src/widget/wcoverart.cpp21
-rw-r--r--src/widget/wcoverart.h4
-rw-r--r--src/widget/wcoverartlabel.cpp25
-rw-r--r--src/widget/wcoverartlabel.h6
-rw-r--r--src/widget/wcoverartmenu.cpp104
-rw-r--r--src/widget/wcoverartmenu.h17
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;