From fed58ddd258de084ce9bd2c66bfbdafe31d99671 Mon Sep 17 00:00:00 2001 From: craig Date: Mon, 5 Dec 2011 19:33:27 +0000 Subject: [PATCH] Store maps of items, to speed up loading --- models/musiclibraryitemalbum.cpp | 22 ++----------- models/musiclibraryitemalbum.h | 6 +--- models/musiclibraryitemartist.cpp | 29 +++++++---------- models/musiclibraryitemartist.h | 9 +++--- models/musiclibraryitemroot.cpp | 28 +++++++---------- models/musiclibraryitemroot.h | 8 ++--- models/musiclibraryitemsong.cpp | 25 ++++----------- models/musiclibraryitemsong.h | 6 ++-- models/musiclibrarymodel.cpp | 48 +++++++++++++--------------- mpd/mpdparseutils.cpp | 52 +++---------------------------- 10 files changed, 67 insertions(+), 166 deletions(-) diff --git a/models/musiclibraryitemalbum.cpp b/models/musiclibraryitemalbum.cpp index 8990449ce..c9686b622 100644 --- a/models/musiclibraryitemalbum.cpp +++ b/models/musiclibraryitemalbum.cpp @@ -64,7 +64,6 @@ void MusicLibraryItemAlbum::setCoverSize(MusicLibraryItemAlbum::CoverSize size) } } - MusicLibraryItemAlbum::MusicLibraryItemAlbum(const QString &data, const QString &dir, MusicLibraryItem *parent) : MusicLibraryItem(data, MusicLibraryItem::Type_Album) , m_dir(dir) @@ -78,20 +77,9 @@ MusicLibraryItemAlbum::~MusicLibraryItemAlbum() qDeleteAll(m_childItems); } -void MusicLibraryItemAlbum::appendChild(MusicLibraryItem * const item) +void MusicLibraryItemAlbum::appendSong(MusicLibraryItemSong * const song) { - m_childItems.append(static_cast(item)); -} - -/** - * Insert a new child item at a given place - * - * @param child The child item - * @param place The place to insert the child item - */ -void MusicLibraryItemAlbum::insertChild(MusicLibraryItem * const child, const int place) -{ - m_childItems.insert(place, static_cast(child)); + m_childItems.append(song); } MusicLibraryItem * MusicLibraryItemAlbum::child(int row) const @@ -114,12 +102,6 @@ int MusicLibraryItemAlbum::row() const return m_parentItem->m_childItems.indexOf(const_cast(this)); } -void MusicLibraryItemAlbum::clearChildren() -{ - qDeleteAll(m_childItems); - m_childItems.clear(); -} - bool MusicLibraryItemAlbum::setCover(const QImage &img) { if (m_coverIsDefault) { diff --git a/models/musiclibraryitemalbum.h b/models/musiclibraryitemalbum.h index a484332f9..4a0cfb91a 100644 --- a/models/musiclibraryitemalbum.h +++ b/models/musiclibraryitemalbum.h @@ -52,15 +52,11 @@ public: MusicLibraryItemAlbum(const QString &data, const QString &dir, MusicLibraryItem *parent = 0); ~MusicLibraryItemAlbum(); - void appendChild(MusicLibraryItem * const child); - void insertChild(MusicLibraryItem * const child, const int place); - + void appendSong(MusicLibraryItemSong * const song); MusicLibraryItem * child(int row) const; int childCount() const; int row() const; MusicLibraryItem * parent() const; - void clearChildren(); - bool setCover(const QImage &img); const QPixmap & cover(); bool hasRealCover() const { return !m_coverIsDefault; } diff --git a/models/musiclibraryitemartist.cpp b/models/musiclibraryitemartist.cpp index afc91314c..0d531aba9 100644 --- a/models/musiclibraryitemartist.cpp +++ b/models/musiclibraryitemartist.cpp @@ -27,6 +27,8 @@ #include "musiclibraryitemroot.h" #include "musiclibraryitemartist.h" #include "musiclibraryitemalbum.h" +#include "song.h" +#include "mpdparseutils.h" MusicLibraryItemArtist::MusicLibraryItemArtist(const QString &data, MusicLibraryItem *parent) : MusicLibraryItem(data, MusicLibraryItem::Type_Artist), @@ -42,20 +44,17 @@ MusicLibraryItemArtist::~MusicLibraryItemArtist() qDeleteAll(m_childItems); } -void MusicLibraryItemArtist::appendChild(MusicLibraryItem * const item) +MusicLibraryItemAlbum * MusicLibraryItemArtist::album(const Song &s) { - m_childItems.append(static_cast(item)); -} + QMap::Iterator it=m_indexes.find(s.album); -/** - * Insert a new child item at a given place - * - * @param child The child item - * @param place The place to insert the child item - */ -void MusicLibraryItemArtist::insertChild(MusicLibraryItem * const child, const int place) -{ - m_childItems.insert(place, static_cast(child)); + if (m_indexes.end()==it) { + MusicLibraryItemAlbum *item=new MusicLibraryItemAlbum(s.album, MPDParseUtils::getDir(s.file), this); + m_indexes[s.album]=m_childItems.count(); + m_childItems.append(item); + return item; + } + return m_childItems.at(*it); } MusicLibraryItem * MusicLibraryItemArtist::child(int row) const @@ -83,12 +82,6 @@ int MusicLibraryItemArtist::row() const return m_parentItem->m_childItems.indexOf(const_cast(this)); } -void MusicLibraryItemArtist::clearChildren() -{ - qDeleteAll(m_childItems); - m_childItems.clear(); -} - const QString & MusicLibraryItemArtist::baseArtist() const { return nonTheArtist.isEmpty() ? m_itemData : nonTheArtist; diff --git a/models/musiclibraryitemartist.h b/models/musiclibraryitemartist.h index 1c75bc2fe..6da97a701 100644 --- a/models/musiclibraryitemartist.h +++ b/models/musiclibraryitemartist.h @@ -29,8 +29,10 @@ #include #include +#include #include "musiclibraryitem.h" +class Song; class MusicLibraryItemRoot; class MusicLibraryItemAlbum; @@ -40,20 +42,17 @@ public: MusicLibraryItemArtist(const QString &data, MusicLibraryItem *parent = 0); ~MusicLibraryItemArtist(); - void appendChild(MusicLibraryItem * const child); - void insertChild(MusicLibraryItem * const child, const int place); - + MusicLibraryItemAlbum * album(const Song &s); MusicLibraryItem * child(int row) const; int childCount() const; int row() const; MusicLibraryItem * parent() const; void setParent(MusicLibraryItem * const parent); - void clearChildren(); - const QString & baseArtist() const; private: QString nonTheArtist; + QMap m_indexes; QList m_childItems; MusicLibraryItemRoot *m_parentItem; diff --git a/models/musiclibraryitemroot.cpp b/models/musiclibraryitemroot.cpp index 88a90e314..fa67d1375 100644 --- a/models/musiclibraryitemroot.cpp +++ b/models/musiclibraryitemroot.cpp @@ -26,6 +26,7 @@ #include "musiclibraryitemroot.h" #include "musiclibraryitemartist.h" +#include "song.h" MusicLibraryItemRoot::MusicLibraryItemRoot(const QString &data) : MusicLibraryItem(data, MusicLibraryItem::Type_Root) @@ -37,20 +38,18 @@ MusicLibraryItemRoot::~MusicLibraryItemRoot() qDeleteAll(m_childItems); } -void MusicLibraryItemRoot::appendChild(MusicLibraryItem * const item) +MusicLibraryItemArtist * MusicLibraryItemRoot::artist(const Song &s) { - m_childItems.append(static_cast(item)); -} + QString aa=s.albumArtist(); + QMap::Iterator it=m_indexes.find(aa); -/** - * Insert a new child item at a given place - * - * @param child The child item - * @param place The place to insert the child item - */ -void MusicLibraryItemRoot::insertChild(MusicLibraryItem * const child, const int place) -{ - m_childItems.insert(place, static_cast(child)); + if (m_indexes.end()==it) { + MusicLibraryItemArtist *item=new MusicLibraryItemArtist(aa, this); + m_indexes[aa]=m_childItems.count(); + m_childItems.append(item); + return item; + } + return m_childItems.at(*it); } MusicLibraryItem * MusicLibraryItemRoot::child(int row) const @@ -62,8 +61,3 @@ int MusicLibraryItemRoot::childCount() const { return m_childItems.count(); } - -void MusicLibraryItemRoot::clearChildren() -{ - qDeleteAll(m_childItems); -} diff --git a/models/musiclibraryitemroot.h b/models/musiclibraryitemroot.h index 5b50f8bb0..8b2c2633e 100644 --- a/models/musiclibraryitemroot.h +++ b/models/musiclibraryitemroot.h @@ -29,8 +29,10 @@ #include #include +#include #include "musiclibraryitem.h" +class Song; class MusicLibraryItemArtist; class MusicLibraryItemRoot : public MusicLibraryItem @@ -39,14 +41,12 @@ public: MusicLibraryItemRoot(const QString &data=QString()); ~MusicLibraryItemRoot(); - void appendChild(MusicLibraryItem * const child); - void insertChild(MusicLibraryItem * const child, const int place); - + MusicLibraryItemArtist * artist(const Song &s); MusicLibraryItem * child(int row) const; int childCount() const; - void clearChildren(); private: + QMap m_indexes; QList m_childItems; friend class MusicLibraryItemArtist; diff --git a/models/musiclibraryitemsong.cpp b/models/musiclibraryitemsong.cpp index b7f9efed3..a8903755f 100644 --- a/models/musiclibraryitemsong.cpp +++ b/models/musiclibraryitemsong.cpp @@ -26,11 +26,13 @@ #include "musiclibraryitemalbum.h" #include "musiclibraryitemsong.h" +#include "song.h" -MusicLibraryItemSong::MusicLibraryItemSong(const QString &data, MusicLibraryItem *parent) - : MusicLibraryItem(data, MusicLibraryItem::Type_Song), - m_track(0), - m_disc(0), +MusicLibraryItemSong::MusicLibraryItemSong(const Song &s, MusicLibraryItem *parent) + : MusicLibraryItem(s.displayTitle(), MusicLibraryItem::Type_Song), + m_track(s.track), + m_file(s.file), + m_disc(s.disc), m_parentItem(static_cast(parent)) { } @@ -54,21 +56,6 @@ const QString & MusicLibraryItemSong::file() const return m_file; } -void MusicLibraryItemSong::setFile(const QString &filename) -{ - m_file = filename; -} - -void MusicLibraryItemSong::setTrack(quint32 track_nr) -{ - m_track = track_nr; -} - -void MusicLibraryItemSong::setDisc(quint32 disc_nr) -{ - m_disc = disc_nr; -} - quint32 MusicLibraryItemSong::track() const { return m_track; diff --git a/models/musiclibraryitemsong.h b/models/musiclibraryitemsong.h index 74bd1e187..f70332945 100644 --- a/models/musiclibraryitemsong.h +++ b/models/musiclibraryitemsong.h @@ -31,20 +31,18 @@ #include #include "musiclibraryitem.h" +class Song; class MusicLibraryItemAlbum; class MusicLibraryItemSong : public MusicLibraryItem { public: - MusicLibraryItemSong(const QString &data, MusicLibraryItem *parent = 0); + MusicLibraryItemSong(const Song &s, MusicLibraryItem *parent = 0); ~MusicLibraryItemSong(); int row() const; MusicLibraryItem * parent() const; const QString & file() const; - void setFile(const QString &filename); - void setTrack(quint32 track_nr); - void setDisc(quint32 disc_nr); quint32 track() const; quint32 disc() const; QString genre() const { diff --git a/models/musiclibrarymodel.cpp b/models/musiclibrarymodel.cpp index e10506098..bc6a07727 100644 --- a/models/musiclibrarymodel.cpp +++ b/models/musiclibrarymodel.cpp @@ -313,9 +313,10 @@ bool MusicLibraryModel::fromXML(const QDateTime db_update) QFile file(dir + filename); MusicLibraryItemRoot * const rootItem = new MusicLibraryItemRoot("Artist / Album / Song"); - MusicLibraryItemArtist *artistItem = NULL; - MusicLibraryItemAlbum *albumItem = NULL; - MusicLibraryItemSong *songItem = NULL; + MusicLibraryItemArtist *artistItem = 0; + MusicLibraryItemAlbum *albumItem = 0; + MusicLibraryItemSong *songItem = 0; + Song song; file.open(QIODevice::ReadOnly); @@ -354,40 +355,35 @@ bool MusicLibraryModel::fromXML(const QDateTime db_update) if (valid) { //New artist element. Create it an add it if (element == "Artist") { - QString artist_string = reader.attributes().value("name").toString(); - - artistItem = new MusicLibraryItemArtist(artist_string, rootItem); - rootItem->appendChild(artistItem); + song.artist=reader.attributes().value("name").toString(); + artistItem = rootItem->artist(song); } // New album element. Create it and add it to the artist if (element == "Album") { - QString album_string = reader.attributes().value("title").toString(); - QString dir_string = reader.attributes().value("dir").toString(); - - albumItem = new MusicLibraryItemAlbum(album_string, dir_string, artistItem); - artistItem->appendChild(albumItem); + song.album=reader.attributes().value("title").toString(); + song.file=reader.attributes().value("dir").toString(); + if (!song.file.isEmpty()) { + song.file.append("dummy.mp3"); + } + albumItem = artistItem->album(song); } // New track element. Create it and add it to the album if (element == "Track") { - QString track_name = reader.attributes().value("title").toString(); - songItem = new MusicLibraryItemSong(track_name, albumItem); + song.title=reader.attributes().value("title").toString(); + song.file=reader.attributes().value("filename").toString(); - QString track_file = reader.attributes().value("filename").toString(); - songItem->setFile(track_file); + QString str=reader.attributes().value("track").toString(); + song.track=str.isEmpty() ? 0 : str.toUInt(); + str=reader.attributes().value("disc").toString(); + song.disc=str.isEmpty() ? 0 : str.toUInt(); + + songItem = new MusicLibraryItemSong(song, albumItem); + + albumItem->appendSong(songItem); - QString track_number_string = reader.attributes().value("track").toString(); - QString disc_number_string = reader.attributes().value("disc").toString(); QString genre = reader.attributes().value("genre").toString(); - if (!track_number_string.isEmpty()) { - quint32 track_number = track_number_string.toUInt(); - quint32 disc_number = disc_number_string.toUInt(); - songItem->setTrack(track_number); - songItem->setDisc(disc_number); - } - - albumItem->appendChild(songItem); albumItem->addGenre(genre); artistItem->addGenre(genre); songItem->addGenre(genre); diff --git a/mpd/mpdparseutils.cpp b/mpd/mpdparseutils.cpp index ed179ecda..100cdb1bc 100644 --- a/mpd/mpdparseutils.cpp +++ b/mpd/mpdparseutils.cpp @@ -286,8 +286,6 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data) QByteArray currentItem; QList lines = data.split('\n'); int amountOfLines = lines.size(); - MusicLibraryItemArtist *prevArtist=0; - MusicLibraryItemAlbum *prevAlbum=0; for (int i = 0; i < amountOfLines; i++) { currentItem += lines.at(i); @@ -301,53 +299,11 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data) } currentSong.fillEmptyFields(); + MusicLibraryItemArtist *artistItem = rootItem->artist(currentSong); + MusicLibraryItemAlbum *albumItem = artistItem->album(currentSong); + MusicLibraryItemSong *songItem = new MusicLibraryItemSong(currentSong, albumItem); - const QString &albumArtist=currentSong.albumArtist(); - MusicLibraryItemArtist *artistItem = 0; - - if (!prevArtist || prevArtist->data(0) != albumArtist) { - prevArtist=0; - prevAlbum=0; - int amountOfArtists = rootItem->childCount(); - // Check if artist already exists - for (int i = amountOfArtists - 1; i >= 0 && !artistItem; i--) { - if (rootItem->child(i)->data(0) == albumArtist) { - artistItem = static_cast(rootItem->child(i)); - } - } - } - - if (!artistItem) { - artistItem = new MusicLibraryItemArtist(albumArtist, rootItem); - rootItem->appendChild(artistItem); - } - - prevArtist=artistItem; - MusicLibraryItemAlbum *albumItem = 0; - - if (!prevAlbum || prevAlbum->data(0) != currentSong.album) { - int amountOfAlbums = artistItem->childCount(); - // Check if album already exists - for (int i = amountOfAlbums - 1; i >= 0 && !albumItem; i--) { - if (artistItem->child(i)->data(0) == currentSong.album) { - albumItem = static_cast(artistItem->child(i)); - } - } - } - - if (!albumItem) { - albumItem = new MusicLibraryItemAlbum(currentSong.album, getDir(currentSong.file), artistItem); - artistItem->appendChild(albumItem); - } - prevAlbum=albumItem; - - // Add song to album (possibly in track order) - MusicLibraryItemSong *songItem = new MusicLibraryItemSong(currentSong.displayTitle(), albumItem); - songItem->setFile(currentSong.file); - songItem->setTrack(currentSong.track); - songItem->setDisc(currentSong.disc); - albumItem->appendChild(songItem); - + albumItem->appendSong(songItem); albumItem->addGenre(currentSong.genre); artistItem->addGenre(currentSong.genre); songItem->addGenre(currentSong.genre);