# HG changeset patch # User Andre Heinecke # Date 1434648141 -7200 # Node ID 90c297a2a3dd6a8696744f6fd999b99566ee09fa # Parent 11aaa9214cfba9876585ecd16188f5040c4a0698 Sort IP Addresses by their actual number in folder selection diff -r 11aaa9214cfb -r 90c297a2a3dd src/folderselectdialog.cpp --- a/src/folderselectdialog.cpp Thu Jun 18 18:55:00 2015 +0200 +++ b/src/folderselectdialog.cpp Thu Jun 18 19:22:21 2015 +0200 @@ -26,6 +26,38 @@ #include #include +static ulong ipStringToLong(const QString str) { + QStringList octets = str.split("."); + if (!octets.size() > 3) { + qWarning() << "invalid call to str to long"; + return 0; + } + ulong s1 = octets.at(0).toLong(); + ulong s2 = octets.at(1).toLong(); + ulong s3 = octets.at(2).toLong(); + ulong s4 = octets.at(3).toLong(); + + return (s1 << 24) | (s2 << 16) | (s3 << 8) | s4; +} + +class IPAwareSortModel : public QSortFilterProxyModel +{ +public: + bool lessThan(const QModelIndex &left, + const QModelIndex &right) const + { + QString leftString = sourceModel()->data(left).toString(); + QString rightString = sourceModel()->data(right).toString(); + + static QRegExp ipPattern("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b"); + if (ipPattern.indexIn(leftString) != -1 && ipPattern.indexIn(rightString) != -1) { + return ipStringToLong(leftString) > ipStringToLong(rightString); + } else { + return QSortFilterProxyModel::lessThan(left, right); + } + } +}; + FolderSelectDialog::FolderSelectDialog(const QString& startFolder, const QString& folderPattern, const QString& pathLabel, @@ -38,7 +70,7 @@ mPathLabel(NULL), mPathLineEdit(NULL) { - mSortModel = new QSortFilterProxyModel(); + mSortModel = new IPAwareSortModel(); mModel = new QStandardItemModel(); mShowPathSelection = !pathLabel.isEmpty(); setupGUI(); diff -r 11aaa9214cfb -r 90c297a2a3dd src/folderselectdialog.h --- a/src/folderselectdialog.h Thu Jun 18 18:55:00 2015 +0200 +++ b/src/folderselectdialog.h Thu Jun 18 19:22:21 2015 +0200 @@ -14,7 +14,7 @@ #include "filterwidget.h" class QTableView; -class QSortFilterProxyModel; +class IPAwareSortModel; class FilterWidget; class QStandardItemModel; class QLabel; @@ -70,7 +70,7 @@ private: QTableView *mView; FilterWidget *mFilterWidget; - QSortFilterProxyModel *mSortModel; + IPAwareSortModel *mSortModel; QString mCurFolder, mFolderPattern; QString mPathLabelString; diff -r 11aaa9214cfb -r 90c297a2a3dd src/l10n/main_de_DE.ts --- a/src/l10n/main_de_DE.ts Thu Jun 18 18:55:00 2015 +0200 +++ b/src/l10n/main_de_DE.ts Thu Jun 18 19:22:21 2015 +0200 @@ -17,42 +17,42 @@ FolderSelectDialog - + Select folder Ordner auswählen - + Go - + Ok Ok - + Error! Fehler! - + Failed to access directory: '%1' Auf das Verzeichnis '%1' konnte nicht zugegriffen werden. - + The following folders did not match the pattern: %1 Die folgenden Order entsprechen nicht dem Schema: %1 - + Failed to parse some folders. Einige Ordnernamen konnten nicht verarbeitet werden. - + Select %1 Bitte das %1 auswählen @@ -70,42 +70,47 @@ Filter/Details - + + Back to exam selection. + + + + Error! Fehler! - + Failed to access directory: '%1' Auf das Verzeichnis '%1' konnte nicht zugegriffen werden. - + Failed to access meta data file: '%1' Auf die Metadaten-Datei: '%1' konnte nicht zugegriffen werden. - + Parsed: '%1' '%1' eingelesen - + Showing: '%1' Zeige: '%1' - + Persons Personen - + Exams Prüfungen - + Root-Path Wurzelverzeichnis @@ -113,7 +118,7 @@ MetaDataView - + Failed to parse file: '%1' Die Datei '%1' konnte nicht eingelesen werden.