diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-08-20 19:38:35 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-08-20 19:38:35 +0000 |
| commit | 80567cfa325311f02a4806f02bf35be1569fe059 (patch) | |
| tree | 7383215e7f8df1e647b1d1ea4e320f447812cf45 /src/qmmpui/playlistcontainer.cpp | |
| parent | 3cce6c1d844060bdce56fc5dde48b9822658b741 (diff) | |
| download | qmmp-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.cpp | 191 |
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 =======================//// |
