summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archiveproxy.cpp40
-rw-r--r--archiveproxy.h3
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;