aboutsummaryrefslogblamecommitdiff
path: root/src/qmmpui/playlistcontainer.cpp
blob: a717f9677f0fdd2bc1b57bd8c85c9465851a7bd1 (plain) (tree)



















                                                                             

                    
                       
                          







                                                                












































                                                                                                      









                                                                                                        
































































                                                                                                           










                                                                              
                                                                                                 



























                                                                 



                                                           























                                                                    



                                                     




                                                     
                
                                                  

                                               
 
 
                                                                              
/***************************************************************************
 *   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 <QFileInfo>
#include <QDateTime>
#include <QtAlgorithms>
#include "playlistmodel.h"
#include "playlistcontainer_p.h"

void PlayListContainer::addTracks(QList<PlayListTrack *> tracks)
{
    foreach(PlayListTrack *t, tracks)
        addTrack(t);
}

////===============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<PlayListTrack*>& list_to_sort, bool reverted)
{
    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::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 =======================////