aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-08-20 19:38:35 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-08-20 19:38:35 +0000
commit80567cfa325311f02a4806f02bf35be1569fe059 (patch)
tree7383215e7f8df1e647b1d1ea4e320f447812cf45
parent3cce6c1d844060bdce56fc5dde48b9822658b741 (diff)
downloadqmmp-80567cfa325311f02a4806f02bf35be1569fe059.tar.gz
qmmp-80567cfa325311f02a4806f02bf35be1569fe059.tar.bz2
qmmp-80567cfa325311f02a4806f02bf35be1569fe059.zip
enable sorting functions
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3634 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/qmmpui/groupedcontainer.cpp6
-rw-r--r--src/qmmpui/playlistcontainer.cpp191
-rw-r--r--src/qmmpui/playlistcontainer_p.h7
-rw-r--r--src/qmmpui/playlistmodel.cpp194
-rw-r--r--src/qmmpui/playlistmodel.h4
5 files changed, 205 insertions, 197 deletions
diff --git a/src/qmmpui/groupedcontainer.cpp b/src/qmmpui/groupedcontainer.cpp
index 3b5f93e6a..59eba7398 100644
--- a/src/qmmpui/groupedcontainer.cpp
+++ b/src/qmmpui/groupedcontainer.cpp
@@ -282,8 +282,7 @@ void GroupedContainer::reverseList()
for (int i = 0; i < tracks.size()/2 ;i++)
tracks.swap(i, tracks.size() - i - 1);
- foreach (PlayListTrack *t, tracks)
- addTrack(t);
+ addTracks(tracks);
}
void GroupedContainer::randomizeList()
@@ -293,8 +292,7 @@ void GroupedContainer::randomizeList()
for (int i = 0; i < tracks.size(); i++)
tracks.swap(qrand()%tracks.size(),qrand()%tracks.size());
- foreach (PlayListTrack *t, tracks)
- addTrack(t);
+ addTracks(tracks);
}
void GroupedContainer::updateIndex()
diff --git a/src/qmmpui/playlistcontainer.cpp b/src/qmmpui/playlistcontainer.cpp
index a845a7204..db7990a36 100644
--- a/src/qmmpui/playlistcontainer.cpp
+++ b/src/qmmpui/playlistcontainer.cpp
@@ -18,6 +18,9 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
+#include <QFileInfo>
+#include <QDateTime>
+#include "playlistmodel.h"
#include "playlistcontainer_p.h"
void PlayListContainer::addTracks(QList<PlayListTrack *> tracks)
@@ -26,4 +29,192 @@ void PlayListContainer::addTracks(QList<PlayListTrack *> tracks)
addTrack(t);
}
+void PlayListContainer::sort(int mode)
+{
+ QList<PlayListTrack *> tracks = takeAllTracks();
+ doSort(mode, tracks);
+ addTracks(tracks);
+}
+
+////===============THE BEGINNING OF SORT IMPLEMENTATION =======================////
+
+// First we'll implement bundle of static compare procedures
+// to sort items in different ways
+
+//by title
+static bool _titleLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::TITLE), s2->value(Qmmp::TITLE)) < 0;
+}
+
+static bool _titleGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::TITLE), s2->value(Qmmp::TITLE)) > 0;
+}
+//by album+disc
+static bool _discnumberLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::DISCNUMBER), s2->value(Qmmp::DISCNUMBER)) < 0;
+}
+
+static bool _discnumberGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::DISCNUMBER), s2->value(Qmmp::DISCNUMBER)) > 0;
+}
+//by album
+static bool _albumLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::ALBUM), s2->value(Qmmp::ALBUM)) < 0;
+}
+
+static bool _albumGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::ALBUM), s2->value(Qmmp::ALBUM)) > 0;
+}
+//by artist
+static bool _artistLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::ARTIST), s2->value(Qmmp::ARTIST)) < 0;
+}
+
+static bool _artistGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->value(Qmmp::ARTIST), s2->value(Qmmp::ARTIST)) > 0;
+}
+//by path
+static bool _pathAndFilenameLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->url(), s2->url()) < 0;
+}
+
+static bool _pathAndFilenameGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QString::localeAwareCompare (s1->url(), s2->url()) > 0;
+}
+//by file name
+static bool _filenameLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ QFileInfo i_s1(s1->url());
+ QFileInfo i_s2(s2->url());
+ return QString::localeAwareCompare (i_s1.baseName(), i_s2.baseName()) < 0;
+}
+
+static bool _filenameGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ QFileInfo i_s1(s1->url());
+ QFileInfo i_s2(s2->url());
+ return QString::localeAwareCompare (i_s1.baseName(), i_s2.baseName()) > 0;
+}
+//by date
+static bool _dateLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return s1->value(Qmmp::YEAR).toInt() < s2->value(Qmmp::YEAR).toInt();
+}
+
+static bool _dateGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return s1->value(Qmmp::YEAR).toInt() > s2->value(Qmmp::YEAR).toInt();
+}
+//by track
+static bool _trackLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return s1->value(Qmmp::TRACK).toInt() < s2->value(Qmmp::TRACK).toInt();
+}
+
+static bool _trackGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return s1->value(Qmmp::TRACK).toInt() > s2->value(Qmmp::TRACK).toInt();
+}
+//by file creation date
+static bool _fileCreationDateLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QFileInfo(s1->value(Qmmp::URL)).created() < QFileInfo(s2->value(Qmmp::URL)).created();
+}
+
+static bool _fileCreationDateGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QFileInfo(s1->value(Qmmp::URL)).created() > QFileInfo(s2->value(Qmmp::URL)).created();
+}
+//by file modification date
+static bool _fileModificationDateLessComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QFileInfo(s1->value(Qmmp::URL)).lastModified() < QFileInfo(s2->value(Qmmp::URL)).lastModified();
+}
+
+static bool _fileModificationDateGreaterComparator(PlayListTrack* s1,PlayListTrack* s2)
+{
+ return QFileInfo(s1->value(Qmmp::URL)).lastModified() > QFileInfo(s2->value(Qmmp::URL)).lastModified();
+}
+
+void PlayListContainer::doSort(int sort_mode, QList<PlayListTrack*>& list_to_sort)
+{
+ QList<PlayListTrack*>::iterator begin;
+ QList<PlayListTrack*>::iterator end;
+
+ begin = list_to_sort.begin();
+ end = list_to_sort.end();
+
+ bool(*compareLessFunc)(PlayListTrack*,PlayListTrack*) = 0;
+ bool(*compareGreaterFunc)(PlayListTrack*,PlayListTrack*) = 0;
+
+ switch (sort_mode)
+ {
+ case PlayListModel::TITLE:
+ compareLessFunc = _titleLessComparator;
+ compareGreaterFunc = _titleGreaterComparator;
+ break;
+ case PlayListModel::DISCNUMBER:
+ compareLessFunc = _discnumberLessComparator;
+ compareGreaterFunc = _discnumberGreaterComparator;
+ break;
+ case PlayListModel::ALBUM:
+ compareLessFunc = _albumLessComparator;
+ compareGreaterFunc = _albumGreaterComparator;
+ break;
+ case PlayListModel::ARTIST:
+ compareLessFunc = _artistLessComparator;
+ compareGreaterFunc = _artistGreaterComparator;
+ break;
+ case PlayListModel::FILENAME:
+ compareLessFunc = _filenameLessComparator;
+ compareGreaterFunc = _filenameGreaterComparator;
+ break;
+ case PlayListModel::PATH_AND_FILENAME:
+ compareLessFunc = _pathAndFilenameLessComparator;
+ compareGreaterFunc = _pathAndFilenameGreaterComparator;
+ break;
+ case PlayListModel::DATE:
+ compareLessFunc = _dateLessComparator;
+ compareGreaterFunc = _dateGreaterComparator;
+ break;
+ case PlayListModel::TRACK:
+ compareLessFunc = _trackLessComparator;
+ compareGreaterFunc = _trackGreaterComparator;
+ break;
+ case PlayListModel::FILE_CREATION_DATE:
+ compareLessFunc = _fileCreationDateLessComparator;
+ compareGreaterFunc = _fileCreationDateGreaterComparator;
+ break;
+ case PlayListModel::FILE_MODIFICATION_DATE:
+ compareLessFunc = _fileModificationDateLessComparator;
+ compareGreaterFunc = _fileModificationDateGreaterComparator;
+ break;
+ default:
+ compareLessFunc = _titleLessComparator;
+ compareGreaterFunc = _titleGreaterComparator;
+ }
+
+ static bool sorted_asc = false;
+ if (!sorted_asc)
+ {
+ qStableSort(begin,end,compareLessFunc);
+ sorted_asc = true;
+ }
+ else
+ {
+ qStableSort(begin,end,compareGreaterFunc);
+ sorted_asc = false;
+ }
+}
+////=============== THE END OF SORT IMPLEMENTATION =======================////
diff --git a/src/qmmpui/playlistcontainer_p.h b/src/qmmpui/playlistcontainer_p.h
index 7a631329d..a3219c3fd 100644
--- a/src/qmmpui/playlistcontainer_p.h
+++ b/src/qmmpui/playlistcontainer_p.h
@@ -57,6 +57,13 @@ public:
virtual void reverseList() = 0;
virtual void randomizeList() = 0;
+ virtual void sort(int mode);
+
+protected:
+ /*!
+ * This internal method performs sorting of \b list_to_sort list of items.
+ */
+ void doSort(int sort_mode, QList<PlayListTrack*>& list_to_sort);
};
#endif // PLAYLISTCONTAINER_P_H
diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp
index 304fbd8a5..0eec6c062 100644
--- a/src/qmmpui/playlistmodel.cpp
+++ b/src/qmmpui/playlistmodel.cpp
@@ -623,191 +623,6 @@ void PlayListModel::reverseList()
m_current = m_container->indexOf(m_current_track);
emit listChanged();
}
-/*
-////===============THE BEGINNING OF SORT IMPLEMENTATION =======================////
-
-// First we'll implement bundle of static compare procedures
-// to sort items in different ways
-
-//by title
-static bool _titleLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::TITLE), s2->value(Qmmp::TITLE)) < 0;
-}
-
-static bool _titleGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::TITLE), s2->value(Qmmp::TITLE)) > 0;
-}
-
-//by album+disc
-static bool _discnumberLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::DISCNUMBER), s2->value(Qmmp::DISCNUMBER)) < 0;
-}
-
-static bool _discnumberGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::DISCNUMBER), s2->value(Qmmp::DISCNUMBER)) > 0;
-}
-//by album
-static bool _albumLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::ALBUM), s2->value(Qmmp::ALBUM)) < 0;
-}
-
-static bool _albumGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::ALBUM), s2->value(Qmmp::ALBUM)) > 0;
-}
-//by artist
-static bool _artistLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::ARTIST), s2->value(Qmmp::ARTIST)) < 0;
-}
-
-static bool _artistGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->value(Qmmp::ARTIST), s2->value(Qmmp::ARTIST)) > 0;
-}
-//by path
-static bool _pathAndFilenameLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->url(), s2->url()) < 0;
-}
-
-static bool _pathAndFilenameGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QString::localeAwareCompare (s1->url(), s2->url()) > 0;
-}
-//by file name
-static bool _filenameLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- QFileInfo i_s1(s1->url());
- QFileInfo i_s2(s2->url());
- return QString::localeAwareCompare (i_s1.baseName(), i_s2.baseName()) < 0;
-}
-
-static bool _filenameGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- QFileInfo i_s1(s1->url());
- QFileInfo i_s2(s2->url());
- return QString::localeAwareCompare (i_s1.baseName(), i_s2.baseName()) > 0;
-}
-//by date
-static bool _dateLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return s1->value(Qmmp::YEAR).toInt() < s2->value(Qmmp::YEAR).toInt();
-}
-
-static bool _dateGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return s1->value(Qmmp::YEAR).toInt() > s2->value(Qmmp::YEAR).toInt();
-}
-//by track
-static bool _trackLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return s1->value(Qmmp::TRACK).toInt() < s2->value(Qmmp::TRACK).toInt();
-}
-
-static bool _trackGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return s1->value(Qmmp::TRACK).toInt() > s2->value(Qmmp::TRACK).toInt();
-}
-//by file creation date
-static bool _fileCreationDateLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QFileInfo(s1->value(Qmmp::URL)).created() < QFileInfo(s2->value(Qmmp::URL)).created();
-}
-
-static bool _fileCreationDateGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QFileInfo(s1->value(Qmmp::URL)).created() > QFileInfo(s2->value(Qmmp::URL)).created();
-}
-//by file modification date
-static bool _fileModificationDateLessComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QFileInfo(s1->value(Qmmp::URL)).lastModified() < QFileInfo(s2->value(Qmmp::URL)).lastModified();
-}
-
-static bool _fileModificationDateGreaterComparator(PlayListItem* s1,PlayListItem* s2)
-{
- return QFileInfo(s1->value(Qmmp::URL)).lastModified() > QFileInfo(s2->value(Qmmp::URL)).lastModified();
-}*/
-// This is main sort method
-void PlayListModel::doSort(int sort_mode,QList<PlayListItem*>& list_to_sort)
-{
- /* QList<PlayListItem*>::iterator begin;
- QList<PlayListItem*>::iterator end;
-
- begin = list_to_sort.begin();
- end = list_to_sort.end();
-
- bool(*compareLessFunc)(PlayListItem*,PlayListItem*) = 0;
- bool(*compareGreaterFunc)(PlayListItem*,PlayListItem*) = 0;
-
- switch (sort_mode)
- {
- case TITLE:
- compareLessFunc = _titleLessComparator;
- compareGreaterFunc = _titleGreaterComparator;
- break;
- case DISCNUMBER:
- compareLessFunc = _discnumberLessComparator;
- compareGreaterFunc = _discnumberGreaterComparator;
- break;
- case ALBUM:
- compareLessFunc = _albumLessComparator;
- compareGreaterFunc = _albumGreaterComparator;
- break;
- case ARTIST:
- compareLessFunc = _artistLessComparator;
- compareGreaterFunc = _artistGreaterComparator;
- break;
- case FILENAME:
- compareLessFunc = _filenameLessComparator;
- compareGreaterFunc = _filenameGreaterComparator;
- break;
- case PATH_AND_FILENAME:
- compareLessFunc = _pathAndFilenameLessComparator;
- compareGreaterFunc = _pathAndFilenameGreaterComparator;
- break;
- case DATE:
- compareLessFunc = _dateLessComparator;
- compareGreaterFunc = _dateGreaterComparator;
- break;
- //qWarning("TODO Sort by Date: %s\t%d",__FILE__,__LINE__);
- case TRACK:
- compareLessFunc = _trackLessComparator;
- compareGreaterFunc = _trackGreaterComparator;
- break;
- case FILE_CREATION_DATE:
- compareLessFunc = _fileCreationDateLessComparator;
- compareGreaterFunc = _fileCreationDateGreaterComparator;
- break;
- case FILE_MODIFICATION_DATE:
- compareLessFunc = _fileModificationDateLessComparator;
- compareGreaterFunc = _fileModificationDateGreaterComparator;
- break;
- default:
- compareLessFunc = _titleLessComparator;
- compareGreaterFunc = _titleGreaterComparator;
- }
-
- static bool sorted_asc = false;
- if (!sorted_asc)
- {
- qStableSort(begin,end,compareLessFunc);
- sorted_asc = true;
- }
- else
- {
- qStableSort(begin,end,compareGreaterFunc);
- sorted_asc = false;
- }
-
- m_current = m_items.indexOf(m_currentItem);*/
-}
void PlayListModel::sortSelection(int mode)
{
@@ -825,12 +640,13 @@ void PlayListModel::sortSelection(int mode)
void PlayListModel::sort(int mode)
{
- /*doSort(mode,m_items);
- emit listChanged();*/
+ if(m_container->isEmpty())
+ return;
+ m_container->sort(mode);
+ m_current = m_container->indexOf(m_current_track);
+ emit listChanged();
}
-////=============== THE END OF SORT IMPLEMENTATION =======================////
-
void PlayListModel::prepareForShufflePlaying(bool val)
{
if (m_play_state)
diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h
index eff44313f..1b1f235a9 100644
--- a/src/qmmpui/playlistmodel.h
+++ b/src/qmmpui/playlistmodel.h
@@ -418,10 +418,6 @@ public slots:
private:
/*!
- * This internal method performs sorting of \b list_to_sort list of items.
- */
- void doSort(int mode,QList<PlayListItem*>& list_to_sort);
- /*!
* Returns topmost row in current selection
*/
int topmostInSelection(int);