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 | |
| 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
| -rw-r--r-- | src/qmmpui/groupedcontainer.cpp | 6 | ||||
| -rw-r--r-- | src/qmmpui/playlistcontainer.cpp | 191 | ||||
| -rw-r--r-- | src/qmmpui/playlistcontainer_p.h | 7 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 194 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.h | 4 |
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); |
