/* 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. */ #include #include #include #include "archiveproxy.h" #include "moviemodel.h" ArchiveProxy::ArchiveProxy(QObject *parent) : QSortFilterProxyModel(parent){}; void ArchiveProxy::setFilter(const QString &filter, FilterMode mode){ mFilterMode = mode; switch(mFilterMode){ case NoFilter: mGenreFilter = QString(); mActorFilter = QString(); mTitleFilter = QString(); break; case GenreFilter: mGenreFilter = filter; break; case ActorFilter: mActorFilter = filter; break; case TitleFilter: mTitleFilter = filter.toLower(); break; } invalidate(); } bool ArchiveProxy::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const{ if(mFilterMode == NoFilter){ return true; } MovieModel *model = static_cast(sourceModel()); Q_ASSERT(model != 0); if(mFilterMode == ActorFilter){ QModelIndex idx = model->index(sourceRow, 0, QModelIndex()); QStringList actors = model->data(idx, MovieModel::ActorsRole).toStringList(); return actors.contains(mActorFilter); } if(mFilterMode == GenreFilter){ QModelIndex idx = model->index(sourceRow, 4, QModelIndex()); QString genre = idx.data().toString(); return (genre == mGenreFilter); } if(mFilterMode == TitleFilter){ QModelIndex idx = model->index(sourceRow, 0, QModelIndex()); QString title = idx.data().toString(); QRegExp re(mTitleFilter); return( re.indexIn(title) != -1); } return true; } void ArchiveProxy::clearFilter(){ mFilterMode = NoFilter; mGenreFilter = QString(); mActorFilter = QString(); mTitleFilter = QString(); invalidate(); } bool ArchiveProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const{ if(left.column() > 0){ return QSortFilterProxyModel::lessThan(left, right); } QString lbase = left.data(MovieModel::TitleBaseRole).toString(); QString rbase = right.data(MovieModel::TitleBaseRole).toString(); if(lbase == rbase){ int lseriesno = left.data(MovieModel::SeriesNoRole).toInt(); int rseriesno = right.data(MovieModel::SeriesNoRole).toInt(); if(lseriesno == rseriesno){ int lpartno = left.data(MovieModel::PartNoRole).toInt(); int rpartno = right.data(MovieModel::PartNoRole).toInt(); return (lpartno < rpartno); }else{ return (lseriesno < rseriesno); } }else{ return (lbase < rbase); } return QSortFilterProxyModel::lessThan(left, right); }