aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui/playlistcontainer.cpp
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 /src/qmmpui/playlistcontainer.cpp
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
Diffstat (limited to 'src/qmmpui/playlistcontainer.cpp')
-rw-r--r--src/qmmpui/playlistcontainer.cpp191
1 files changed, 191 insertions, 0 deletions
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 =======================////