mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-23 16:58:06 -06:00
Move number-aware comparison logic into misc class.
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
|
||||
#include <QSortFilterProxyModel>
|
||||
#include "torrentmodel.h"
|
||||
#include "misc.h"
|
||||
|
||||
class TransferListSortModel : public QSortFilterProxyModel {
|
||||
Q_OBJECT
|
||||
@@ -50,61 +51,9 @@ protected:
|
||||
Q_ASSERT(vL.isValid());
|
||||
Q_ASSERT(vR.isValid());
|
||||
|
||||
QString nameLeft = vL.toString();
|
||||
QString nameRight = vR.toString();
|
||||
|
||||
do {
|
||||
int posL = nameLeft.indexOf(QRegExp("[0-9]"));
|
||||
int posR = nameRight.indexOf(QRegExp("[0-9]"));
|
||||
if (posL == -1 || posR == -1)
|
||||
break; // No data
|
||||
else if (posL != posR)
|
||||
break; // Digit positions mismatch
|
||||
else if (nameLeft.left(posL) != nameRight.left(posR))
|
||||
break; // Strings' subsets before digit do not match
|
||||
|
||||
|
||||
bool second_digit = false;
|
||||
if (nameLeft.size() > posL + 1)
|
||||
second_digit = nameLeft.at(posL + 1).isDigit();
|
||||
if (nameRight.size() > posR + 1)
|
||||
second_digit = second_digit ?
|
||||
second_digit :
|
||||
nameRight.at(posR + 1).isDigit();
|
||||
|
||||
if (!second_digit)
|
||||
break; // Single digit in both, normal sort could handle this
|
||||
|
||||
QString temp;
|
||||
while (posL < nameLeft.size()) {
|
||||
if (nameLeft.at(posL).isDigit())
|
||||
temp += nameLeft.at(posL);
|
||||
else
|
||||
break;
|
||||
posL++;
|
||||
}
|
||||
int numL = temp.toInt();
|
||||
temp.clear();
|
||||
|
||||
while (posR < nameRight.size()) {
|
||||
if (nameRight.at(posR).isDigit())
|
||||
temp += nameRight.at(posR);
|
||||
else
|
||||
break;
|
||||
posR++;
|
||||
}
|
||||
int numR = temp.toInt();
|
||||
|
||||
if (numL != numR)
|
||||
return numL < numR;
|
||||
|
||||
// Strings + digits do match and we haven't hit string end
|
||||
// Do another round
|
||||
nameLeft.remove(0, posL);
|
||||
nameRight.remove(0, posR);
|
||||
continue;
|
||||
|
||||
} while (true);
|
||||
bool res = false;
|
||||
if (misc::naturalSort(vL.toString(), vR.toString(), res))
|
||||
return res;
|
||||
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user