diff options
-rw-r--r-- | archiveproxy.cpp | 40 | ||||
-rw-r--r-- | archiveproxy.h | 3 |
2 files changed, 43 insertions, 0 deletions
diff --git a/archiveproxy.cpp b/archiveproxy.cpp index 6b1a9e7..0249459 100644 --- a/archiveproxy.cpp +++ b/archiveproxy.cpp @@ -7,6 +7,9 @@ #include <QStringList> #include <QRegExp> +#include <QList> + +#include <QDebug> #include "archiveproxy.h" #include "moviemodel.h" @@ -67,3 +70,40 @@ void ArchiveProxy::clearFilter(){ invalidate(); } +bool ArchiveProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const{ + if(left.column() > 0){ + return QSortFilterProxyModel::lessThan(left, right); + } + QString l = left.data().toString(); + QString r = right.data().toString(); + QRegExp nos("(\\d+)"); + QList<int> lnos, rnos; + int pos = 0; + bool dummy; + while((pos = nos.indexIn(l, pos)) != -1){ + lnos << nos.cap(1).toInt(&dummy); + pos += nos.matchedLength(); + } + pos = 0; + while((pos = nos.indexIn(r, pos)) != -1){ + rnos << nos.cap(1).toInt(&dummy); + pos += nos.matchedLength(); + } + QRegExp baseRe("(.*)\\s+\\d+"); + baseRe.indexIn(l); + QString lbase = baseRe.cap(1); + baseRe.indexIn(r); + QString rbase = baseRe.cap(1); + if((lnos.size() == 1) && (rnos.size() == 1)){ + if(lbase == rbase){ + return (lnos.at(0) < rnos.at(0)); + } + } + if((lnos.size() == 2) && (rnos.size() == 2)){ + if(lbase == rbase){ + return (lnos.at(1) < rnos.at(1)); + } + } + return QSortFilterProxyModel::lessThan(left, right); +} + diff --git a/archiveproxy.h b/archiveproxy.h index 94e8d19..346b770 100644 --- a/archiveproxy.h +++ b/archiveproxy.h @@ -26,6 +26,9 @@ class ArchiveProxy : public QSortFilterProxyModel { public slots: void clearFilter(); + protected: + virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + private: FilterMode mFilterMode; QString mGenreFilter; |