diff --git a/ChangeLog b/ChangeLog index b0709e231..9bd494013 100644 --- a/ChangeLog +++ b/ChangeLog @@ -59,6 +59,8 @@ 29. Add option to draw (15% opacity) tiled cover as background to lyrics page. 30. When clicking on a label, pass focus to buddy widget. If this buddy is a checkbox, then also toggle its state. +31. When groping songs into albums, take into account song year. Its possible + for an artist to release two albums with the same name in different years! 0.6.1 ----- diff --git a/gui/covers.cpp b/gui/covers.cpp index 68d91082c..fbca0b2fb 100644 --- a/gui/covers.cpp +++ b/gui/covers.cpp @@ -185,14 +185,14 @@ static AppCover otherAppCover(const Covers::Job &job) #endif AppCover app; app.filename=kdeDir+QLatin1String("/share/apps/amarok/albumcovers/large/")+ - QCryptographicHash::hash(job.artist.toLower().toLocal8Bit()+job.album.toLower().toLocal8Bit(), + QCryptographicHash::hash(job.song.albumArtist().toLower().toLocal8Bit()+job.song.album.toLower().toLocal8Bit(), QCryptographicHash::Md5).toHex(); app.img=QImage(app.filename); if (app.img.isNull()) { app.filename=xdgConfig()+QLatin1String("/Clementine/albumcovers/")+ - QCryptographicHash::hash(job.artist.toLower().toUtf8()+job.album.toLower().toUtf8(), + QCryptographicHash::hash(job.song.albumArtist().toLower().toUtf8()+job.song.album.toLower().toUtf8(), QCryptographicHash::Sha1).toHex()+QLatin1String(".jpg"); app.img=QImage(app.filename); @@ -299,15 +299,15 @@ Covers::Covers() void Covers::stop() { if (queueThread) { - disconnect(queue, SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), this, SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &))); + disconnect(queue, SIGNAL(cover(const Song &, const QImage &, const QString &)), this, SIGNAL(cover(const Song &, const QImage &, const QString &))); disconnect(queue, SIGNAL(download(const Song &)), this, SLOT(download(const Song &))); Utils::stopThread(queueThread); } } -static inline QString cacheKey(const QString &artist, const QString &album, int size) +static inline QString cacheKey(const Song &song, int size) { - return artist+QLatin1String(" - ")+album+QChar(':')+QString::number(size); + return song.albumArtist()+QChar(':')+song.album+QChar(':')+QString::number(song.year)+QChar(':')+QString::number(size); } static QSet cacheSizes; @@ -318,7 +318,7 @@ QPixmap * Covers::get(const Song &song, int size, bool isSingleTracks) return 0; } - QString key=cacheKey(song.albumArtist(), song.album, size); + QString key=cacheKey(song, size); QPixmap *pix(cache.object(key)); if (!pix) { @@ -342,11 +342,11 @@ QPixmap * Covers::get(const Song &song, int size, bool isSingleTracks) // If we have downloaded a cover, we can remove the dummy entry - so that the next time get() is called, // it can read the saved file! -void Covers::clearDummyCache(const QString &artist, const QString &album) +void Covers::clearDummyCache(const Song &song) { bool hadDummy=false; foreach (int s, cacheSizes) { - QString key=cacheKey(artist, album, s); + QString key=cacheKey(song, s); QPixmap *pix(cache.object(key)); if (pix && pix->width()<2) { @@ -356,7 +356,7 @@ void Covers::clearDummyCache(const QString &artist, const QString &album) } if (hadDummy) { - emit coverRetrieved(artist, album); + emit coverRetrieved(song); } } @@ -410,7 +410,7 @@ Covers::Image Covers::getImage(const Song &song, bool isSingleTracks) } } - Job job(song.albumArtist(), song.album, dirName); + Job job(song, dirName); // See if amarok, or clementine, has it... AppCover app=otherAppCover(job); @@ -437,7 +437,7 @@ void Covers::requestCover(const Song &song, bool urgent) queue=new CoverQueue; queueThread=new QThread(this); queue->moveToThread(queueThread); - connect(queue, SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), this, SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &))); + connect(queue, SIGNAL(cover(const Song &, const QImage &, const QString &)), this, SIGNAL(cover(const Song &, const QImage &, const QString &))); connect(queue, SIGNAL(download(const Song &)), this, SLOT(download(const Song &))); queueThread->start(); } @@ -485,7 +485,7 @@ void CoverQueue::getNextCover() if (img.img.isNull()) { emit download(song); } else { - emit cover(song.albumArtist(), song.album, img.img, img.fileName); + emit cover(song, img.img, img.fileName); } } @@ -508,7 +508,7 @@ void Covers::download(const Song &song) : MPDParseUtils::getDir((haveAbsPath ? QString() : Settings::self()->mpdDir())+song.file); } - Job job(song.albumArtist(), song.album, dirName); + Job job(song, dirName); // Query lastfm... if (!rpc) { @@ -558,7 +558,7 @@ void Covers::albumInfo(QVariant &value, QNetworkReply *reply) jobs.remove(it.key()); jobs.insert(manager->get(QNetworkRequest(u)), job); } else { - emit cover(job.artist, job.album, QImage(), QString()); + emit cover(job.song, QImage(), QString()); } } reply->deleteLater(); @@ -572,7 +572,7 @@ void Covers::albumFailure(int, const QString &, QNetworkReply *reply) if (it!=end) { Job job=it.value(); AppCover app=otherAppCover(job); - emit cover(job.artist, job.album, app.img, app.filename); + emit cover(job.song, app.img, app.filename); jobs.remove(it.key()); } @@ -602,9 +602,9 @@ void Covers::jobFinished(QNetworkReply *reply) if (img.isNull()) { AppCover app=otherAppCover(job); - emit cover(job.artist, job.album, app.img, app.filename); + emit cover(job.song, app.img, app.filename); } else { - emit cover(job.artist, job.album, img, fileName); + emit cover(job.song, img, fileName); } } @@ -621,17 +621,17 @@ QString Covers::saveImg(const Job &job, const QImage &img, const QByteArray &raw if (saveInMpdDir && canSaveTo(job.dir)) { savedName=save(mimeType, extension, job.dir+constFileName, img, raw); if (!savedName.isEmpty()) { - clearDummyCache(job.artist, job.album); + clearDummyCache(job.song); return savedName; } } // Could not save with album, save in cache dir... - QString dir = Network::cacheDir(constCoverDir+encodeName(job.artist)); + QString dir = Network::cacheDir(constCoverDir+encodeName(job.song.albumArtist())); if (!dir.isEmpty()) { - savedName=save(mimeType, extension, dir+encodeName(job.album), img, raw); + savedName=save(mimeType, extension, dir+encodeName(job.song.album), img, raw); if (!savedName.isEmpty()) { - clearDummyCache(job.artist, job.album); + clearDummyCache(job.song); return savedName; } } @@ -645,7 +645,7 @@ QHash::Iterator Covers::findJob(const Song &song) QHash::Iterator end(jobs.end()); for (; it!=end; ++it) { - if ((*it).artist==song.albumArtist() && (*it).album==song.album) { + if ((*it).song.year==song.year && (*it).song.albumArtist()==song.albumArtist() && (*it).song.album==song.album) { return it; } } diff --git a/gui/covers.h b/gui/covers.h index 23976354c..88c7a7482 100644 --- a/gui/covers.h +++ b/gui/covers.h @@ -55,7 +55,7 @@ private Q_SLOTS: Q_SIGNALS: void getNext(); - void cover(const QString &artist, const QString &album, const QImage &img, const QString &file); + void cover(const Song &song, const QImage &img, const QString &file); void download(const Song &song); private: @@ -70,10 +70,9 @@ class Covers : public QObject public: struct Job { - Job(const QString &ar, const QString &al, const QString &d) - : artist(ar), album(al), dir(d) { } - QString artist; - QString album; + Job(const Song &s, const QString &d) + : song(s), dir(d) { } + Song song; QString dir; }; @@ -106,8 +105,8 @@ public Q_SLOTS: void download(const Song &song); Q_SIGNALS: - void cover(const QString &artist, const QString &album, const QImage &img, const QString &file); - void coverRetrieved(const QString &artist, const QString &album); + void cover(const Song &song, const QImage &img, const QString &file); + void coverRetrieved(const Song &song); private Q_SLOTS: void albumInfo(QVariant &value, QNetworkReply *reply); @@ -117,7 +116,7 @@ private Q_SLOTS: private: QString saveImg(const Job &job, const QImage &img, const QByteArray &raw); QHash::Iterator findJob(const Song &song); - void clearDummyCache(const QString &artist, const QString &album); + void clearDummyCache(const Song &song); private: MaiaXmlRpcClient *rpc; diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index d9f7b19fc..db38c987c 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -696,8 +696,7 @@ MainWindow::MainWindow(QWidget *parent) menuButton->setIcon(Icon("configure")); volumeButton->setIcon(Icon("audio-volume-high")); - connect(Covers::self(), SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), - SLOT(cover(const QString &, const QString &, const QImage &, const QString &))); + connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)), SLOT(cover(const Song &, const QImage &, const QString &))); menuButton->setMenu(mainMenu); menuButton->setPopupMode(QToolButton::InstantPopup); @@ -2394,9 +2393,9 @@ void MainWindow::tabToggled(int index) sidebarModeChanged(); } -void MainWindow::cover(const QString &artist, const QString &album, const QImage &img, const QString &file) +void MainWindow::cover(const Song &song, const QImage &img, const QString &file) { - if (artist==current.albumArtist() && album==current.album) { + if (song.year==current.year && song.albumArtist()==current.albumArtist() && song.album==current.album) { if (img.isNull()) { coverSong=Song(); coverWidget->setPixmap(currentIsStream() ? noStreamCover : noCover); diff --git a/gui/mainwindow.h b/gui/mainwindow.h index e58bdf2ce..8d4c727a0 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -272,7 +272,7 @@ private Q_SLOTS: void sidebarModeChanged(); void currentTabChanged(int index); void tabToggled(int index); - void cover(const QString &artist, const QString &album, const QImage &img, const QString &file); + void cover(const Song &song, const QImage &img, const QString &file); void showLibraryTab() { showTab(PAGE_LIBRARY); } void showAlbumsTab() { showTab(PAGE_ALBUMS); } void showFoldersTab() { showTab(PAGE_FOLDERS); } diff --git a/models/albumsmodel.cpp b/models/albumsmodel.cpp index 8f8c46bb2..61c458ab5 100644 --- a/models/albumsmodel.cpp +++ b/models/albumsmodel.cpp @@ -395,15 +395,15 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root) for (int i = 0; i < root->childCount(); i++) { MusicLibraryItemArtist *artistItem = static_cast(root->childItem(i)); - QString artist=artistItem->data(); + const QString &artist=artistItem->data(); for (int j = 0; j < artistItem->childCount(); j++) { MusicLibraryItemAlbum *albumItem = static_cast(artistItem->childItem(j)); - QString album=albumItem->data(); + const QString &album=albumItem->data(); bool found=false; it=items.begin(); end=items.end(); for (; it!=end; ++it) { - if ((*it)->artist==artist && (*it)->album==album) { + if ((*it)->year==albumItem->year() && (*it)->artist==artist && (*it)->album==album) { if (!resettingModel) { QModelIndex albumIndex=index(items.indexOf(*it), 0, QModelIndex()); bool hadSongs=!(*it)->songs.isEmpty(); @@ -430,7 +430,7 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root) } if (!found) { - AlbumItem *a=new AlbumItem(artist, album); + AlbumItem *a=new AlbumItem(artist, album, albumItem->year()); a->setSongs(albumItem); a->genres=albumItem->genres(); a->updated=true; @@ -479,7 +479,7 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root) // } // } -void AlbumsModel::setCover(const QString &artist, const QString &album, const QImage &img, const QString &file) +void AlbumsModel::setCover(const Song &song, const QImage &img, const QString &file) { Q_UNUSED(file) if (img.isNull()) { @@ -490,7 +490,7 @@ void AlbumsModel::setCover(const QString &artist, const QString &album, const QI QList::Iterator end=items.end(); for (int row=0; it!=end; ++it, ++row) { - if ((*it)->artist==artist && (*it)->album==album) { + if ((*it)->year==song.year && (*it)->artist==song.albumArtist() && (*it)->album==song.album) { (*it)->cover=new QPixmap(QPixmap::fromImage(img.scaled(QSize(iconSize(), iconSize()), Qt::KeepAspectRatio, Qt::SmoothTransformation))); QModelIndex idx=index(row, 0, QModelIndex()); emit dataChanged(idx, idx); @@ -516,14 +516,14 @@ void AlbumsModel::setEnabled(bool e) enabled=e; if (enabled) { - connect(Covers::self(), SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), - this, SLOT(setCover(const QString &, const QString &, const QImage &, const QString &))); + connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)), + this, SLOT(setCover(const Song &, const QImage &, const QString &))); // connect(MusicLibraryModel::self(), SIGNAL(updated(const MusicLibraryItemRoot *)), AlbumsModel::self(), SLOT(update(const MusicLibraryItemRoot *))); update(MusicLibraryModel::self()->root()); } else { clear(); - disconnect(Covers::self(), SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), - this, SLOT(setCover(const QString &, const QString &, const QImage &, const QString &))); + disconnect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)), + this, SLOT(setCover(const Song&, const QImage &, const QString &))); // disconnect(MusicLibraryModel::self(), SIGNAL(updated(const MusicLibraryItemRoot *)), AlbumsModel::self(), SLOT(update(const MusicLibraryItemRoot *))); } } @@ -545,9 +545,10 @@ void AlbumsModel::setAlbumSort(int s) } } -AlbumsModel::AlbumItem::AlbumItem(const QString &ar, const QString &al) +AlbumsModel::AlbumItem::AlbumItem(const QString &ar, const QString &al, quint16 y) : artist(ar) , album(al) + , year(y) , cover(0) , updated(false) , coverRequested(false) @@ -567,9 +568,7 @@ bool AlbumsModel::AlbumItem::operator<(const AlbumItem &o) const if (AlbumsModel::Sort_ArtistAlbumYear==sortAlbums) { int compare=ProxyModel::compareStrings(artist, o.artist); if (0==compare) { - int y=songs.count() ? songs.at(0)->year : 0; - int oy=o.songs.count() ? o.songs.at(0)->year : 0; - return yfile; Covers::self()->requestCover(s, urgent); } diff --git a/models/albumsmodel.h b/models/albumsmodel.h index af7762a21..79bb919cd 100644 --- a/models/albumsmodel.h +++ b/models/albumsmodel.h @@ -76,7 +76,7 @@ public: struct AlbumItem : public Item { - AlbumItem(const QString &ar, const QString &al); + AlbumItem(const QString &ar, const QString &al, quint16 y); virtual ~AlbumItem(); bool operator<(const AlbumItem &o) const; bool isAlbum() { return true; } @@ -88,6 +88,7 @@ public: QString artist; QString album; QString name; + quint16 year; QList songs; QSet genres; QPixmap *cover; @@ -120,7 +121,7 @@ public: // void getCovers(); public Q_SLOTS: - void setCover(const QString &artist, const QString &album, const QImage &img, const QString &file); + void setCover(const Song &song, const QImage &img, const QString &file); void update(const MusicLibraryItemRoot *root); private: diff --git a/models/devicesmodel.cpp b/models/devicesmodel.cpp index 0baa61f6f..85ac2bf1a 100644 --- a/models/devicesmodel.cpp +++ b/models/devicesmodel.cpp @@ -334,8 +334,8 @@ void DevicesModel::setEnabled(bool e) if (enabled) { connect(MediaDeviceCache::self(), SIGNAL(deviceAdded(const QString &)), this, SLOT(deviceAdded(const QString &))); - connect(Covers::self(), SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), - this, SLOT(setCover(const QString &, const QString &, const QImage &, const QString &))); + connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)), + this, SLOT(setCover(const Song &, const QImage &, const QString &))); MediaDeviceCache::self()->refreshCache(); QStringList deviceUdiList=MediaDeviceCache::self()->getAll(); foreach (const QString &udi, deviceUdiList) { @@ -346,8 +346,8 @@ void DevicesModel::setEnabled(bool e) } } else { disconnect(MediaDeviceCache::self(), SIGNAL(deviceAdded(const QString &)), this, SLOT(deviceAdded(const QString &))); - disconnect(Covers::self(), SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), - this, SLOT(setCover(const QString &, const QString &, const QImage &, const QString &))); + disconnect(Covers::self(), SIGNAL(cover(cconst Song &, const QImage &, const QString &)), + this, SLOT(setCover(const Song &, const QImage &, const QString &))); } } @@ -359,7 +359,7 @@ Device * DevicesModel::device(const QString &udi) return 0; } -void DevicesModel::setCover(const QString &artist, const QString &album, const QImage &img, const QString &file) +void DevicesModel::setCover(const Song &song, const QImage &img, const QString &file) { Q_UNUSED(file) if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) { @@ -370,9 +370,6 @@ void DevicesModel::setCover(const QString &artist, const QString &album, const Q return; } - Song song; - song.artist=artist; - song.album=album; int i=0; foreach (MusicLibraryItem *device, devices) { MusicLibraryItemArtist *artistItem = static_cast(device)->artist(song, false); diff --git a/models/devicesmodel.h b/models/devicesmodel.h index 529432f0c..72611be28 100644 --- a/models/devicesmodel.h +++ b/models/devicesmodel.h @@ -65,7 +65,7 @@ public: QMimeData * mimeData(const QModelIndexList &indexes) const; public Q_SLOTS: - void setCover(const QString &artist, const QString &album, const QImage &img, const QString &file); + void setCover(const Song &song, const QImage &img, const QString &file); void deviceAdded(const QString &udi); void deviceRemoved(const QString &udi); void deviceUpdating(const QString &udi, bool state); diff --git a/models/musiclibraryitemalbum.cpp b/models/musiclibraryitemalbum.cpp index 162e8a930..217304c67 100644 --- a/models/musiclibraryitemalbum.cpp +++ b/models/musiclibraryitemalbum.cpp @@ -128,6 +128,7 @@ const QPixmap & MusicLibraryItemAlbum::cover() Song song; song.albumartist=parentItem()->data(); song.album=m_itemData; + song.year=m_year; song.file=static_cast(childItem(0))->file(); Covers::self()->requestCover(song, true); // Covers::Image img=Covers::self()->get(song, Song::SingleTracks==m_type); diff --git a/models/musiclibraryitemartist.cpp b/models/musiclibraryitemartist.cpp index 36673ae91..0ea18aff2 100644 --- a/models/musiclibraryitemartist.cpp +++ b/models/musiclibraryitemartist.cpp @@ -59,7 +59,7 @@ MusicLibraryItemArtist::MusicLibraryItemArtist(const QString &data, MusicLibrary MusicLibraryItemAlbum * MusicLibraryItemArtist::album(const Song &s, bool create) { - QHash::ConstIterator it=m_indexes.find(songAlbum(s)); + QHash::ConstIterator it=m_indexes.find(Song::AlbumKey(s.year, songAlbum(s))); if (m_indexes.end()==it) { return create ? createAlbum(s) : 0; @@ -69,9 +69,9 @@ MusicLibraryItemAlbum * MusicLibraryItemArtist::album(const Song &s, bool create MusicLibraryItemAlbum * MusicLibraryItemArtist::createAlbum(const Song &s) { - QString albumName=songAlbum(s); - MusicLibraryItemAlbum *item=new MusicLibraryItemAlbum(albumName, s.year, this); - m_indexes.insert(albumName, m_childItems.count()); + Song::AlbumKey key(s.year, songAlbum(s)); + MusicLibraryItemAlbum *item=new MusicLibraryItemAlbum(key.name, s.year, this); + m_indexes.insert(key, m_childItems.count()); m_childItems.append(item); return item; } @@ -112,9 +112,9 @@ bool MusicLibraryItemArtist::isFromSingleTracks(const Song &s) const } #ifdef ENABLE_KDE_SUPPORT - QHash::ConstIterator it=m_indexes.find(i18n("Single Tracks")); + QHash::ConstIterator it=m_indexes.find(Song::AlbumKey(0, i18n("Single Tracks"))); #else - QHash::ConstIterator it=m_indexes.find(QObject::tr("Single Tracks")); + QHash::ConstIterator it=m_indexes.find(Song::AlbumKey(0, QObject::tr("Single Tracks"))); #endif if (m_indexes.end()!=it) { @@ -131,15 +131,15 @@ void MusicLibraryItemArtist::remove(MusicLibraryItemAlbum *album) return; } - QHash::Iterator it=m_indexes.begin(); - QHash::Iterator end=m_indexes.end(); + QHash::Iterator it=m_indexes.begin(); + QHash::Iterator end=m_indexes.end(); for (; it!=end; ++it) { if ((*it)>index) { (*it)--; } } - m_indexes.remove(album->data()); + m_indexes.remove(Song::AlbumKey(album->year(), album->data())); delete m_childItems.takeAt(index); } @@ -162,6 +162,6 @@ void MusicLibraryItemArtist::updateIndexes() QList::iterator it=m_childItems.begin(); QList::iterator end=m_childItems.end(); for (int i=0; it!=end; ++it, ++i) { - m_indexes.insert((*it)->data(), i); + m_indexes.insert(Song::AlbumKey(static_cast(*it)->year(), (*it)->data()), i); } } \ No newline at end of file diff --git a/models/musiclibraryitemartist.h b/models/musiclibraryitemartist.h index b9d851ec5..f74d3d944 100644 --- a/models/musiclibraryitemartist.h +++ b/models/musiclibraryitemartist.h @@ -31,8 +31,8 @@ #include #include #include "musiclibraryitem.h" +#include "song.h" -class Song; class MusicLibraryItemRoot; class MusicLibraryItemAlbum; @@ -62,7 +62,7 @@ public: private: bool m_various; QString m_nonTheArtist; - QHash m_indexes; + QHash m_indexes; }; #endif diff --git a/models/musiclibrarymodel.cpp b/models/musiclibrarymodel.cpp index 5e45cba1a..c17ec31b3 100644 --- a/models/musiclibrarymodel.cpp +++ b/models/musiclibrarymodel.cpp @@ -83,8 +83,8 @@ MusicLibraryModel::MusicLibraryModel(QObject *parent) : QAbstractItemModel(parent) , rootItem(new MusicLibraryItemRoot) { - connect(Covers::self(), SIGNAL(cover(const QString &, const QString &, const QImage &, const QString &)), - this, SLOT(setCover(const QString &, const QString &, const QImage &, const QString &))); + connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)), + this, SLOT(setCover(const Song &, const QImage &, const QString &))); } MusicLibraryModel::~MusicLibraryModel() @@ -533,7 +533,7 @@ bool MusicLibraryModel::update(const QSet &songs) return updatedSongs; } -void MusicLibraryModel::setCover(const QString &artist, const QString &album, const QImage &img, const QString &file) +void MusicLibraryModel::setCover(const Song &song, const QImage &img, const QString &file) { Q_UNUSED(file) if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) { @@ -544,9 +544,6 @@ void MusicLibraryModel::setCover(const QString &artist, const QString &album, co return; } - Song song; - song.artist=artist; - song.album=album; MusicLibraryItemArtist *artistItem = rootItem->artist(song, false); if (artistItem) { MusicLibraryItemAlbum *albumItem = artistItem->album(song, false); diff --git a/models/musiclibrarymodel.h b/models/musiclibrarymodel.h index c4c08279a..493c90566 100644 --- a/models/musiclibrarymodel.h +++ b/models/musiclibrarymodel.h @@ -77,7 +77,7 @@ public: public Q_SLOTS: void updateMusicLibrary(MusicLibraryItemRoot * root, QDateTime dbUpdate = QDateTime(), bool fromFile = false); - void setCover(const QString &artist, const QString &album, const QImage &img, const QString &file); + void setCover(const Song &song, const QImage &img, const QString &file); Q_SIGNALS: // void updated(const MusicLibraryItemRoot *root); diff --git a/mpd/mpdparseutils.cpp b/mpd/mpdparseutils.cpp index e0ef91020..9b2cb6059 100644 --- a/mpd/mpdparseutils.cpp +++ b/mpd/mpdparseutils.cpp @@ -388,7 +388,7 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data) if (!artistItem || currentSong.albumArtist()!=artistItem->data()) { artistItem = rootItem->artist(currentSong); } - if (!albumItem || albumItem->parentItem()!=artistItem || currentSong.album!=albumItem->data()) { + if (!albumItem || currentSong.year!=albumItem->year() || albumItem->parentItem()!=artistItem || currentSong.album!=albumItem->data()) { albumItem = artistItem->album(currentSong); } diff --git a/mpd/song.cpp b/mpd/song.cpp index a3a7d5d00..b8b066862 100644 --- a/mpd/song.cpp +++ b/mpd/song.cpp @@ -138,20 +138,20 @@ void Song::fillEmptyFields() void Song::setKey() { static quint16 currentKey=0; - static QMap keys; + static QMap keys; if (isStream() && !isCantataStream()) { key=0; return; } - QString albumAndArtist=albumArtist()+QLatin1String("::")+album; - QMap::ConstIterator it=keys.find(albumAndArtist); + AlbumKey albumKey(year, albumArtist()+QChar(':')+album); + QMap::ConstIterator it=keys.find(albumKey); if (it!=keys.end()) { key=it.value(); } else { currentKey++; // Key 0 is for streams, so we need to increment before setting... - keys.insert(albumAndArtist, currentKey); + keys.insert(albumKey, currentKey); key=currentKey; } } diff --git a/mpd/song.h b/mpd/song.h index eb47a292d..c9c376b35 100644 --- a/mpd/song.h +++ b/mpd/song.h @@ -36,6 +36,21 @@ struct Song { static const quint16 constNullKey; + struct AlbumKey { + AlbumKey(quint16 y, const QString &n) + : year(y) + , name(n) { + } + bool operator==(const AlbumKey &o) const { + return year==o.year && name==o.name; + } + bool operator<(const AlbumKey &o) const { + return yearsetData(parent, 0, Role_DropAdjust); } -void GroupedView::coverRetrieved(const QString &artist, const QString &album) +void GroupedView::coverRetrieved(const Song &s) { if (filterActive) { return; @@ -621,7 +621,7 @@ void GroupedView::coverRetrieved(const QString &artist, const QString &album) if (key!=lastKey && !isRowHidden(i, QModelIndex())) { Song song=child.data(GroupedView::Role_Song).value(); - if (song.albumArtist()==artist && song.album==album) { + if (song.year==s.year && song.albumArtist()==s.albumArtist() && song.album==s.album) { dataChanged(child, child); } } @@ -632,7 +632,7 @@ void GroupedView::coverRetrieved(const QString &artist, const QString &album) if (key!=lastKey && !isRowHidden(i, QModelIndex())) { Song song=index.data(GroupedView::Role_Song).value(); - if (song.albumArtist()==artist && song.album==album) { + if (song.year==s.year && song.albumArtist()==s.albumArtist() && song.album==s.album) { dataChanged(index, index); } } diff --git a/widgets/groupedview.h b/widgets/groupedview.h index de9f52589..9d649d74f 100644 --- a/widgets/groupedview.h +++ b/widgets/groupedview.h @@ -26,6 +26,7 @@ #include #include "treeview.h" +class Song; class GroupedView : public TreeView { @@ -79,7 +80,7 @@ public: public Q_SLOTS: void updateRows(const QModelIndex &parent); - void coverRetrieved(const QString &artist, const QString &album); + void coverRetrieved(const Song &song); private Q_SLOTS: void itemClicked(const QModelIndex &index); diff --git a/widgets/itemview.cpp b/widgets/itemview.cpp index c17b530e9..967f88484 100644 --- a/widgets/itemview.cpp +++ b/widgets/itemview.cpp @@ -469,9 +469,9 @@ void ItemView::setMode(Mode m) } if (Mode_GroupedTree==mode) { - connect(Covers::self(), SIGNAL(coverRetrieved(const QString &, const QString &)), groupedView, SLOT(coverRetrieved(const QString &, const QString &))); + connect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), groupedView, SLOT(coverRetrieved(const Song &))); } else if (groupedView) { - disconnect(Covers::self(), SIGNAL(coverRetrieved(const QString &, const QString &)), groupedView, SLOT(coverRetrieved(const QString &, const QString &))); + disconnect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), groupedView, SLOT(coverRetrieved(const Song &))); } stackedWidget->setCurrentIndex(Mode_Tree==mode || Mode_GroupedTree==mode ? 0 : 1); diff --git a/widgets/playqueueview.cpp b/widgets/playqueueview.cpp index 94dc96524..4c6c12f21 100644 --- a/widgets/playqueueview.cpp +++ b/widgets/playqueueview.cpp @@ -202,9 +202,9 @@ void PlayQueueView::setGrouped(bool g) grouped=g; setCurrentWidget(grouped ? static_cast(groupedView) : static_cast(treeView)); if (grouped) { - connect(Covers::self(), SIGNAL(coverRetrieved(const QString &, const QString &)), groupedView, SLOT(coverRetrieved(const QString &, const QString &))); + connect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), groupedView, SLOT(coverRetrieved(const Song &))); } else { - disconnect(Covers::self(), SIGNAL(coverRetrieved(const QString &, const QString &)), groupedView, SLOT(coverRetrieved(const QString &, const QString &))); + disconnect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), groupedView, SLOT(coverRetrieved(const Song &))); } } }