1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-01-11 07:18:08 +00:00

Migrate away from deprecated QVariant comparison operators

Another idea would be manually define a custom comparison function for
QVariant. However, having the function would be excessive due to its
limited usage count, also note that we are already casting
various QVariant to its underlying type in existing code.
This commit is contained in:
Chocobo1 2020-12-10 14:57:16 +08:00
parent aaeffe3846
commit cba8d83b21
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C

View File

@ -41,7 +41,6 @@ TransferListSortModel::TransferListSortModel(QObject *parent)
: QSortFilterProxyModel {parent} : QSortFilterProxyModel {parent}
{ {
setSortRole(TransferListModel::UnderlyingDataRole); setSortRole(TransferListModel::UnderlyingDataRole);
QMetaType::registerComparators<BitTorrent::TorrentState>();
} }
void TransferListSortModel::setStatusFilter(TorrentFilter::Type filter) void TransferListSortModel::setStatusFilter(TorrentFilter::Type filter)
@ -122,21 +121,21 @@ bool TransferListSortModel::lessThan_impl(const QModelIndex &left, const QModelI
return (Utils::String::naturalCompare(leftValue.toString(), rightValue.toString(), Qt::CaseInsensitive) < 0); return (Utils::String::naturalCompare(leftValue.toString(), rightValue.toString(), Qt::CaseInsensitive) < 0);
case TransferListModel::TR_STATUS: case TransferListModel::TR_STATUS:
// QSortFilterProxyModel::lessThan() uses the < operator only for specific QVariant types {
// so our custom type is outside that list. const auto stateL = leftValue.value<BitTorrent::TorrentState>();
// In this case QSortFilterProxyModel::lessThan() converts other types to QString and const auto stateR = rightValue.value<BitTorrent::TorrentState>();
// sorts them.
// Thus we can't use the code in the default label. if (stateL != stateR)
if (leftValue != rightValue) return stateL < stateR;
return leftValue < rightValue;
return invokeLessThanForColumn(TransferListModel::TR_QUEUE_POSITION); return invokeLessThanForColumn(TransferListModel::TR_QUEUE_POSITION);
}
case TransferListModel::TR_ADD_DATE: case TransferListModel::TR_ADD_DATE:
case TransferListModel::TR_SEED_DATE: case TransferListModel::TR_SEED_DATE:
case TransferListModel::TR_SEEN_COMPLETE_DATE: case TransferListModel::TR_SEEN_COMPLETE_DATE:
{ {
const QDateTime dateL = leftValue.toDateTime(); const auto dateL = leftValue.toDateTime();
const QDateTime dateR = rightValue.toDateTime(); const auto dateR = rightValue.toDateTime();
if (dateL.isValid() && dateR.isValid()) if (dateL.isValid() && dateR.isValid())
{ {
@ -157,19 +156,20 @@ bool TransferListSortModel::lessThan_impl(const QModelIndex &left, const QModelI
case TransferListModel::TR_QUEUE_POSITION: case TransferListModel::TR_QUEUE_POSITION:
{ {
// QVariant has comparators for all basic types const auto positionL = leftValue.toInt();
if ((leftValue > 0) || (rightValue > 0)) const auto positionR = rightValue.toInt();
{
if ((leftValue > 0) && (rightValue > 0))
return leftValue < rightValue;
return leftValue != 0; if ((positionL > 0) || (positionR > 0))
{
if ((positionL > 0) && (positionR > 0))
return positionL < positionR;
return positionL != 0;
} }
// Sort according to TR_SEED_DATE // Sort according to TR_SEED_DATE
const QDateTime dateL = left.sibling(left.row(), TransferListModel::TR_SEED_DATE) const auto dateL = left.sibling(left.row(), TransferListModel::TR_SEED_DATE)
.data(TransferListModel::UnderlyingDataRole).toDateTime(); .data(TransferListModel::UnderlyingDataRole).toDateTime();
const QDateTime dateR = right.sibling(right.row(), TransferListModel::TR_SEED_DATE) const auto dateR = right.sibling(right.row(), TransferListModel::TR_SEED_DATE)
.data(TransferListModel::UnderlyingDataRole).toDateTime(); .data(TransferListModel::UnderlyingDataRole).toDateTime();
if (dateL.isValid() && dateR.isValid()) if (dateL.isValid() && dateR.isValid())
@ -192,15 +192,16 @@ bool TransferListSortModel::lessThan_impl(const QModelIndex &left, const QModelI
case TransferListModel::TR_SEEDS: case TransferListModel::TR_SEEDS:
case TransferListModel::TR_PEERS: case TransferListModel::TR_PEERS:
{ {
// QVariant has comparators for all basic types // Active peers/seeds take precedence over total peers/seeds
// Active peers/seeds take precedence over total peers/seeds. const auto activeL = leftValue.toInt();
if (leftValue != rightValue) const auto activeR = rightValue.toInt();
return (leftValue < rightValue); if (activeL != activeR)
return activeL < activeR;
const QVariant leftValueTotal = left.data(TransferListModel::AdditionalUnderlyingDataRole); const auto totalL = left.data(TransferListModel::AdditionalUnderlyingDataRole).toInt();
const QVariant rightValueTotal = right.data(TransferListModel::AdditionalUnderlyingDataRole); const auto totalR = right.data(TransferListModel::AdditionalUnderlyingDataRole).toInt();
if (leftValueTotal != rightValueTotal) if (totalL != totalR)
return (leftValueTotal < rightValueTotal); return totalL < totalR;
return invokeLessThanForColumn(TransferListModel::TR_QUEUE_POSITION); return invokeLessThanForColumn(TransferListModel::TR_QUEUE_POSITION);
} }
@ -221,9 +222,9 @@ bool TransferListSortModel::lessThan_impl(const QModelIndex &left, const QModelI
if (isActiveL != isActiveR) if (isActiveL != isActiveR)
return isActiveL; return isActiveL;
const int queuePosL = left.sibling(left.row(), TransferListModel::TR_QUEUE_POSITION) const auto queuePosL = left.sibling(left.row(), TransferListModel::TR_QUEUE_POSITION)
.data(TransferListModel::UnderlyingDataRole).toInt(); .data(TransferListModel::UnderlyingDataRole).toInt();
const int queuePosR = right.sibling(right.row(), TransferListModel::TR_QUEUE_POSITION) const auto queuePosR = right.sibling(right.row(), TransferListModel::TR_QUEUE_POSITION)
.data(TransferListModel::UnderlyingDataRole).toInt(); .data(TransferListModel::UnderlyingDataRole).toInt();
const bool isSeedingL = (queuePosL < 0); const bool isSeedingL = (queuePosL < 0);
const bool isSeedingR = (queuePosR < 0); const bool isSeedingR = (queuePosR < 0);
@ -236,8 +237,8 @@ bool TransferListSortModel::lessThan_impl(const QModelIndex &left, const QModelI
return isAscendingOrder; return isAscendingOrder;
} }
const qlonglong etaL = leftValue.toLongLong(); const auto etaL = leftValue.toLongLong();
const qlonglong etaR = rightValue.toLongLong(); const auto etaR = rightValue.toLongLong();
const bool isInvalidL = ((etaL < 0) || (etaL >= MAX_ETA)); const bool isInvalidL = ((etaL < 0) || (etaL >= MAX_ETA));
const bool isInvalidR = ((etaR < 0) || (etaR >= MAX_ETA)); const bool isInvalidR = ((etaR < 0) || (etaR >= MAX_ETA));
if (isInvalidL && isInvalidR) if (isInvalidL && isInvalidR)
@ -255,12 +256,24 @@ bool TransferListSortModel::lessThan_impl(const QModelIndex &left, const QModelI
} }
case TransferListModel::TR_LAST_ACTIVITY: case TransferListModel::TR_LAST_ACTIVITY:
case TransferListModel::TR_RATIO_LIMIT: {
// QVariant has comparators for all basic types const auto lastActivityL = leftValue.toLongLong();
if (leftValue < 0) return false; const auto lastActivityR = rightValue.toLongLong();
if (rightValue < 0) return true;
return (leftValue < rightValue); if (lastActivityL < 0) return false;
if (lastActivityR < 0) return true;
return lastActivityL < lastActivityR;
}
case TransferListModel::TR_RATIO_LIMIT:
{
const auto ratioL = leftValue.toReal();
const auto ratioR = rightValue.toReal();
if (ratioL < 0) return false;
if (ratioR < 0) return true;
return ratioL < ratioR;
}
} }
return (leftValue != rightValue) return (leftValue != rightValue)