/*************************************************************************** * Copyright (C) 2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include #include #include "playlistmodel.h" #include "playlistcontainer_p.h" void PlayListContainer::addTrack(PlayListTrack *track) { addTracks(QList () << track); } ////===============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 album artist static bool _albumArtistLessComparator(PlayListTrack* s1,PlayListTrack* s2) { return QString::localeAwareCompare (s1->value(Qmmp::ALBUMARTIST), s2->value(Qmmp::ALBUMARTIST)) < 0; } static bool _albumArtistGreaterComparator(PlayListTrack* s1,PlayListTrack* s2) { return QString::localeAwareCompare (s1->value(Qmmp::ALBUMARTIST), s2->value(Qmmp::ALBUMARTIST)) > 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(); } //by group static bool _groupLessComparator(PlayListTrack* s1,PlayListTrack* s2) { return QString::localeAwareCompare (s1->groupName(), s2->groupName()) < 0; } static bool _groupGreaterComparator(PlayListTrack* s1,PlayListTrack* s2) { return QString::localeAwareCompare (s1->groupName(), s2->groupName()) > 0; } void PlayListContainer::doSort(int sort_mode, QList& list_to_sort, bool reverted) { QList::iterator begin; QList::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::ALBUMARTIST: compareLessFunc = _albumArtistLessComparator; compareGreaterFunc = _albumArtistGreaterComparator; 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; case PlayListModel::GROUP: compareLessFunc = _groupLessComparator; compareGreaterFunc = _groupGreaterComparator; break; default: compareLessFunc = _titleLessComparator; compareGreaterFunc = _titleGreaterComparator; } if(reverted) qStableSort(begin,end,compareGreaterFunc); else qStableSort(begin,end,compareLessFunc); } ////=============== THE END OF SORT IMPLEMENTATION =======================////