mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-23 04:54:18 +00:00
Merge pull request #749 from Gelmir/transferlistsort
Use number-aware sort in transfer list
This commit is contained in:
commit
b00950aa7a
63
src/misc.cpp
63
src/misc.cpp
@ -521,3 +521,66 @@ QString misc::toQString(time_t t)
|
||||
return QDateTime::fromTime_t(t).toString(Qt::DefaultLocaleLongDate);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
bool misc::naturalSort(QString left, QString right, bool &result) { // uses lessThan comparison
|
||||
// Return value indicates if functions was successful
|
||||
// result argument will contain actual comparison result if function was successful
|
||||
do {
|
||||
int posL = left.indexOf(QRegExp("[0-9]"));
|
||||
int posR = right.indexOf(QRegExp("[0-9]"));
|
||||
if (posL == -1 || posR == -1)
|
||||
break; // No data
|
||||
else if (posL != posR)
|
||||
break; // Digit positions mismatch
|
||||
else if (left.left(posL) != right.left(posR))
|
||||
break; // Strings' subsets before digit do not match
|
||||
|
||||
|
||||
bool second_digit = false;
|
||||
if (left.size() > posL + 1)
|
||||
second_digit = left.at(posL + 1).isDigit();
|
||||
if (right.size() > posR + 1)
|
||||
second_digit = second_digit ?
|
||||
second_digit :
|
||||
right.at(posR + 1).isDigit();
|
||||
|
||||
if (!second_digit)
|
||||
break; // Single digit in both, normal sort could handle this
|
||||
|
||||
QString temp;
|
||||
while (posL < left.size()) {
|
||||
if (left.at(posL).isDigit())
|
||||
temp += left.at(posL);
|
||||
else
|
||||
break;
|
||||
posL++;
|
||||
}
|
||||
int numL = temp.toInt();
|
||||
temp.clear();
|
||||
|
||||
while (posR < right.size()) {
|
||||
if (right.at(posR).isDigit())
|
||||
temp += right.at(posR);
|
||||
else
|
||||
break;
|
||||
posR++;
|
||||
}
|
||||
int numR = temp.toInt();
|
||||
|
||||
if (numL != numR) {
|
||||
result = (numL < numR);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Strings + digits do match and we haven't hit string end
|
||||
// Do another round
|
||||
left.remove(0, posL);
|
||||
right.remove(0, posR);
|
||||
continue;
|
||||
|
||||
} while (true);
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
@ -119,6 +119,10 @@ public:
|
||||
#else
|
||||
static QString toQString(time_t t);
|
||||
#endif
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
static bool naturalSort(QString left, QString right, bool& result);
|
||||
#endif
|
||||
};
|
||||
|
||||
// Trick to get a portable sleep() function
|
||||
|
@ -125,6 +125,7 @@ nox {
|
||||
transferlistwidget.h \
|
||||
transferlistdelegate.h \
|
||||
transferlistfilterswidget.h \
|
||||
transferlistsortmodel.h \
|
||||
torrentcontentmodel.h \
|
||||
torrentcontentmodelitem.h \
|
||||
torrentcontentmodelfolder.h \
|
||||
|
64
src/transferlistsortmodel.h
Normal file
64
src/transferlistsortmodel.h
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||
* and distribute the linked executables. You must obey the GNU General Public
|
||||
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : daymansmail@gmail.com
|
||||
*/
|
||||
|
||||
#ifndef TRANSFERLISTSORTMODEL_H
|
||||
#define TRANSFERLISTSORTMODEL_H
|
||||
|
||||
#include <QSortFilterProxyModel>
|
||||
#include "torrentmodel.h"
|
||||
#include "misc.h"
|
||||
|
||||
class TransferListSortModel : public QSortFilterProxyModel {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TransferListSortModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {}
|
||||
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &left, const QModelIndex &right) const {
|
||||
if (sortColumn() == TorrentModelItem::TR_NAME) {
|
||||
QVariant vL = sourceModel()->data(left);
|
||||
QVariant vR = sourceModel()->data(right);
|
||||
if (!(vL.isValid() && vR.isValid()))
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
Q_ASSERT(vL.isValid());
|
||||
Q_ASSERT(vR.isValid());
|
||||
|
||||
bool res = false;
|
||||
if (misc::naturalSort(vL.toString(), vR.toString(), res))
|
||||
return res;
|
||||
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
}
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // TRANSFERLISTSORTMODEL_H
|
@ -91,7 +91,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window,
|
||||
statusFilterModel->setFilterKeyColumn(TorrentModelItem::TR_STATUS);
|
||||
statusFilterModel->setFilterRole(Qt::DisplayRole);
|
||||
|
||||
nameFilterModel = new QSortFilterProxyModel();
|
||||
nameFilterModel = new TransferListSortModel();
|
||||
nameFilterModel->setDynamicSortFilter(true);
|
||||
nameFilterModel->setSourceModel(statusFilterModel);
|
||||
nameFilterModel->setFilterKeyColumn(TorrentModelItem::TR_NAME);
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <QTreeView>
|
||||
#include <libtorrent/version.hpp>
|
||||
#include "qtorrenthandle.h"
|
||||
#include "transferlistsortmodel.h"
|
||||
|
||||
class QBtSession;
|
||||
class TransferListDelegate;
|
||||
@ -110,7 +111,7 @@ signals:
|
||||
private:
|
||||
TransferListDelegate *listDelegate;
|
||||
TorrentModel *listModel;
|
||||
QSortFilterProxyModel *nameFilterModel;
|
||||
TransferListSortModel *nameFilterModel;
|
||||
QSortFilterProxyModel *statusFilterModel;
|
||||
QSortFilterProxyModel *labelFilterModel;
|
||||
QBtSession* BTSession;
|
||||
|
Loading…
x
Reference in New Issue
Block a user