diff options
-rw-r--r-- | src/dlgtrackinfo.cpp | 18 | ||||
-rw-r--r-- | src/dlgtrackinfo.h | 3 | ||||
-rw-r--r-- | src/library/coverartcache.cpp | 2 | ||||
-rw-r--r-- | src/library/coverartcache.h | 25 | ||||
-rw-r--r-- | src/skin/legacyskinparser.cpp | 3 | ||||
-rw-r--r-- | src/widget/wcoverart.cpp | 27 | ||||
-rw-r--r-- | src/widget/wcoverart.h | 8 | ||||
-rw-r--r-- | src/widget/wcoverartmenu.cpp | 35 | ||||
-rw-r--r-- | src/widget/wcoverartmenu.h | 12 |
9 files changed, 89 insertions, 44 deletions
diff --git a/src/dlgtrackinfo.cpp b/src/dlgtrackinfo.cpp index 64b770fa02..cdd9c4a84b 100644 --- a/src/dlgtrackinfo.cpp +++ b/src/dlgtrackinfo.cpp @@ -81,9 +81,9 @@ void DlgTrackInfo::init(){ connect(CoverArtCache::instance(), SIGNAL(pixmapFound(int, QPixmap)), this, SLOT(slotPixmapFound(int, QPixmap)), Qt::DirectConnection); connect(m_pCoverMenu, - SIGNAL(coverLocationUpdated(const QString&, const QString&)), + SIGNAL(coverLocationUpdated(const QString&, const QString&, QPixmap)), this, - SLOT(slotCoverLocationUpdated(const QString&, const QString&))); + SLOT(slotCoverLocationUpdated(const QString&, const QString&, QPixmap))); } void DlgTrackInfo::closeEvent(QCloseEvent*) { @@ -229,9 +229,13 @@ QPixmap DlgTrackInfo::scaledCoverArt(QPixmap original) { } void DlgTrackInfo::slotCoverLocationUpdated(const QString& newLoc, - const QString& oldLoc) { + const QString& oldLoc, + QPixmap px) { if (isVisible() && m_loadedCover.first == oldLoc) { m_loadedCover.first = newLoc; + px = scaledCoverArt(px); + coverArt->setPixmap(px); + update(); } } @@ -398,6 +402,14 @@ void DlgTrackInfo::saveTrack() { qDebug() << "Deleting cue" << pCue->getId() << pCue->getHotCue(); m_pLoadedTrack->removeCue(pCue); } + + bool res = CoverArtCache::instance()->changeCoverArt(m_pLoadedTrack->getId(), + m_loadedCover.first); + + if (!res) { + QMessageBox::warning(this, tr("Change Cover Art"), + tr("Could not change the cover art.")); + } } void DlgTrackInfo::unloadTrack(bool save) { diff --git a/src/dlgtrackinfo.h b/src/dlgtrackinfo.h index d50ea09c18..5271cdde99 100644 --- a/src/dlgtrackinfo.h +++ b/src/dlgtrackinfo.h @@ -57,7 +57,8 @@ class DlgTrackInfo : public QDialog, public Ui::DlgTrackInfo { void slotOpenInFileBrowser(); void slotPixmapFound(int trackId, QPixmap pixmap); - void slotCoverLocationUpdated(const QString& newLoc, const QString& oldLoc); + void slotCoverLocationUpdated(const QString& newLoc, const QString& oldLoc, + QPixmap px); void slotCoverMenu(const QPoint& pos); private: diff --git a/src/library/coverartcache.cpp b/src/library/coverartcache.cpp index 239b08d872..331c4eb000 100644 --- a/src/library/coverartcache.cpp +++ b/src/library/coverartcache.cpp @@ -55,7 +55,7 @@ bool CoverArtCache::changeCoverArt(int trackId, } QImage img = rescaleBigImage(QImage(newCoverLocation)); - QString md5Hash = calculateMD5(img); // NULL is fine + QString md5Hash = calculateMD5(img); if (md5Hash.isEmpty()) { return false; } diff --git a/src/library/coverartcache.h b/src/library/coverartcache.h index 6d41986a1b..358d098e16 100644 --- a/src/library/coverartcache.h +++ b/src/library/coverartcache.h @@ -43,6 +43,20 @@ class CoverArtCache : public QObject, public Singleton<CoverArtCache> QString getDefaultCoverLocation() { return m_sDefaultCoverLocation; } QPixmap getDefaultCoverArt() { return m_defaultCover; } + + struct FutureResult { + int trackId; + QString coverLocation; + QString md5Hash; + QImage img; + QSize croppedSize; + bool issueRepaint; + bool newImgFound; + }; + + FutureResult searchImage(CoverArtDAO::CoverArtInfo coverInfo, + const QSize& croppedSize, + const bool emitSignals); public slots: void imageFound(); void imageLoaded(); @@ -59,18 +73,7 @@ class CoverArtCache : public QObject, public Singleton<CoverArtCache> virtual ~CoverArtCache(); friend class Singleton<CoverArtCache>; - struct FutureResult { - int trackId; - QString coverLocation; - QString md5Hash; - QImage img; - QSize croppedSize; - bool issueRepaint; - }; - FutureResult searchImage(CoverArtDAO::CoverArtInfo coverInfo, - const QSize& croppedSize, - const bool emitSignals); FutureResult loadImage(int trackId, const QString& coverLocation, const QString& md5Hash, diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index 6a46de01dd..8696cc7a20 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -961,7 +961,8 @@ QWidget* LegacySkinParser::parseSearchBox(QDomElement node) { } QWidget* LegacySkinParser::parseCoverArt(QDomElement node) { - WCoverArt* pCoverArt = new WCoverArt(m_pParent, m_pConfig); + WCoverArt* pCoverArt = new WCoverArt(m_pParent, m_pConfig, + m_pLibrary->getTrackCollection()); setupConnections(node, pCoverArt); setupBaseWidget(node, pCoverArt); setupWidget(node, pCoverArt); diff --git a/src/widget/wcoverart.cpp b/src/widget/wcoverart.cpp index b0297d82e9..37313d08c6 100644 --- a/src/widget/wcoverart.cpp +++ b/src/widget/wcoverart.cpp @@ -11,7 +11,8 @@ #include "library/coverartcache.h" WCoverArt::WCoverArt(QWidget* parent, - ConfigObject<ConfigValue>* pConfig) + ConfigObject<ConfigValue>* pConfig, + TrackCollection* pTrackCollection) : QWidget(parent), WBaseWidget(this), m_pConfig(pConfig), @@ -20,7 +21,8 @@ WCoverArt::WCoverArt(QWidget* parent, m_bCoverIsVisible(false), m_pMenu(new WCoverArtMenu(this)), m_loadedCover(CoverArtCache::instance()->getDefaultCoverArt()), - m_lastRequestedTrackId(-1) { + m_lastRequestedTrackId(-1), + m_trackDAO(pTrackCollection->getTrackDAO()) { // load icon to hide cover m_iconHide = QPixmap(":/images/library/ic_library_cover_hide.png"); m_iconHide = m_iconHide.scaled(20, @@ -37,12 +39,29 @@ WCoverArt::WCoverArt(QWidget* parent, connect(CoverArtCache::instance(), SIGNAL(pixmapFound(int, QPixmap)), this, SLOT(slotPixmapFound(int, QPixmap)), Qt::DirectConnection); + connect(m_pMenu, + SIGNAL(coverLocationUpdated(const QString&, const QString&, QPixmap)), + this, + SLOT(slotCoverLocationUpdated(const QString&, const QString&, QPixmap))); } WCoverArt::~WCoverArt() { delete m_pMenu; } +void WCoverArt::slotCoverLocationUpdated(const QString& newLoc, + const QString& oldLoc, + QPixmap px) { + Q_UNUSED(oldLoc); + Q_UNUSED(px); + bool res = CoverArtCache::instance()->changeCoverArt(m_lastRequestedTrackId, + newLoc); + if (!res) { + QMessageBox::warning(this, tr("Change Cover Art"), + tr("Could not change the cover art.")); + } +} + void WCoverArt::setup(QDomNode node, const SkinContext& context) { Q_UNUSED(node); setMouseTracking(TRUE); @@ -175,9 +194,11 @@ void WCoverArt::mousePressEvent(QMouseEvent* event) { m_bCoverIsVisible = false; resize(sizeHint()); } else if (event->button() == Qt::RightButton) { // show context-menu + TrackPointer pTrack = m_trackDAO.getTrack(m_lastRequestedTrackId); m_pMenu->show(event->globalPos(), m_lastRequestedCover, - m_lastRequestedTrackId); + m_lastRequestedTrackId, + pTrack); } } diff --git a/src/widget/wcoverart.h b/src/widget/wcoverart.h index f3c6b407a1..d4d51a3d7e 100644 --- a/src/widget/wcoverart.h +++ b/src/widget/wcoverart.h @@ -9,13 +9,15 @@ #include "configobject.h" #include "skin/skincontext.h" #include "trackinfoobject.h" +#include "library/trackcollection.h" #include "widget/wbasewidget.h" #include "widget/wcoverartmenu.h" class WCoverArt : public QWidget, public WBaseWidget { Q_OBJECT public: - WCoverArt(QWidget* parent, ConfigObject<ConfigValue>* pConfig); + WCoverArt(QWidget* parent, ConfigObject<ConfigValue>* pConfig, + TrackCollection* pTrackCollection); virtual ~WCoverArt(); void setup(QDomNode node, const SkinContext& context); @@ -29,6 +31,9 @@ class WCoverArt : public QWidget, public WBaseWidget { private slots: void slotPixmapFound(int trackId, QPixmap pixmap); + void slotCoverLocationUpdated(const QString& newLoc, + const QString& oldLoc, + QPixmap px); protected: void paintEvent(QPaintEvent*); @@ -54,6 +59,7 @@ class WCoverArt : public QWidget, public WBaseWidget { QPixmap m_iconShow; int m_lastRequestedTrackId; + TrackDAO& m_trackDAO; QPair<QString, QString> m_lastRequestedCover; }; diff --git a/src/widget/wcoverartmenu.cpp b/src/widget/wcoverartmenu.cpp index 9959dea2a9..2464bb968b 100644 --- a/src/widget/wcoverartmenu.cpp +++ b/src/widget/wcoverartmenu.cpp @@ -5,6 +5,7 @@ #include "dlgcoverartfullsize.h" #include "wcoverartmenu.h" #include "library/coverartcache.h" +#include "library/dao/coverartdao.h" WCoverArtMenu::WCoverArtMenu(QWidget *parent) : QMenu(parent), @@ -114,24 +115,25 @@ void WCoverArtMenu::slotChange() { newCover = selectedCover; } - bool res = CoverArtCache::instance()->changeCoverArt(m_pTrack->getId(), - newCover); - if (!res) { - QMessageBox::warning(this, tr("Change Cover Art"), - tr("Could not change the cover art!")); - return; - } - - emit(coverLocationUpdated(newCover, m_sCoverLocation)); - m_sCoverLocation = newCover; + QPixmap px(newCover); + emit(coverLocationUpdated(newCover, m_sCoverLocation, px)); } void WCoverArtMenu::slotReload() { if (m_iTrackId < 1) { return; } - CoverArtCache::instance()->changeCoverArt(m_iTrackId); - CoverArtCache::instance()->requestPixmap(m_iTrackId); + CoverArtDAO::CoverArtInfo info; + info.trackId = m_iTrackId; + info.album = m_pTrack->getAlbum(); + info.trackDirectory = m_pTrack->getDirectory(); + info.trackLocation = m_pTrack->getLocation(); + info.trackBaseName = QFileInfo(m_pTrack->getFilename()).baseName(); + CoverArtCache::FutureResult res = + CoverArtCache::instance()->searchImage(info, QSize(0,0), false); + QPixmap px; + px.convertFromImage(res.img); + emit(coverLocationUpdated(res.coverLocation, m_sCoverLocation, px)); } void WCoverArtMenu::slotUnset() { @@ -139,11 +141,6 @@ void WCoverArtMenu::slotUnset() { return; } QString newLoc = CoverArtCache::instance()->getDefaultCoverLocation(); - if (!CoverArtCache::instance()->changeCoverArt(m_iTrackId, newLoc)) { - QMessageBox::warning(this, tr("Unset Cover Art"), - tr("Could not unset the cover art!")); - return; - } - emit(coverLocationUpdated(newLoc, m_sCoverLocation)); - m_sCoverLocation = newLoc; + QPixmap px = CoverArtCache::instance()->getDefaultCoverArt(); + emit(coverLocationUpdated(newLoc, m_sCoverLocation, px)); } diff --git a/src/widget/wcoverartmenu.h b/src/widget/wcoverartmenu.h index 67d6739f4b..040688248d 100644 --- a/src/widget/wcoverartmenu.h +++ b/src/widget/wcoverartmenu.h @@ -10,9 +10,12 @@ 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 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(); @@ -21,7 +24,8 @@ class WCoverArtMenu : public QMenu { signals: void coverLocationUpdated(const QString& newLocation, - const QString& oldLocation); + const QString& oldLocation, + QPixmap px); private slots: void slotChange(); |