Skip to content

Commit

Permalink
Keep sub-sorting order (qbittorrent#15074)
Browse files Browse the repository at this point in the history
  • Loading branch information
d-s-x committed Jun 14, 2021
1 parent ccb59fb commit 2bd5aca
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
30 changes: 22 additions & 8 deletions src/gui/transferlistsortmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,24 @@ namespace
TransferListSortModel::TransferListSortModel(QObject *parent)
: QSortFilterProxyModel {parent}
, m_subSortColumn {"TransferList/SubSortColumn", TransferListModel::TR_NAME, adjustSubSortColumn}
, m_subSortOrder {"TransferList/SubSortOrder", 0}
{
setSortRole(TransferListModel::UnderlyingDataRole);
}

void TransferListSortModel::sort(const int column, const Qt::SortOrder order)
{
if ((m_lastSortColumn != column) && (m_lastSortColumn != -1))
{
m_subSortColumn = m_lastSortColumn;
m_subSortOrder = m_lastSortOrder;
}
m_lastSortColumn = column;
m_lastSortOrder = ((order == Qt::AscendingOrder) ? 0 : 1);

QSortFilterProxyModel::sort(column, order);
}

void TransferListSortModel::setStatusFilter(TorrentFilter::Type filter)
{
if (m_filter.setType(filter))
Expand Down Expand Up @@ -219,16 +233,16 @@ bool TransferListSortModel::lessThan(const QModelIndex &left, const QModelIndex
{
Q_ASSERT(left.column() == right.column());

if (m_lastSortColumn != left.column())
{
if (m_lastSortColumn != -1)
m_subSortColumn = m_lastSortColumn;
m_lastSortColumn = left.column();
}

const int result = compare(left, right);
if (result == 0)
return compare(left.sibling(left.row(), m_subSortColumn), right.sibling(right.row(), m_subSortColumn)) < 0;
{
const int subResult = compare(left.sibling(left.row(), m_subSortColumn), right.sibling(right.row(), m_subSortColumn));
// Qt inverses lessThan() result when ordered descending.
// For sub-sorting we have to do it manually.
// When both are ordered descending subResult must be double-inversed, which is the same as no inversion.
const bool inverseSubResult = (m_lastSortOrder != m_subSortOrder); // exactly one is descending
return (inverseSubResult ? (subResult > 0) : (subResult < 0));
}

return result < 0;
}
Expand Down
8 changes: 6 additions & 2 deletions src/gui/transferlistsortmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class TransferListSortModel final : public QSortFilterProxyModel
public:
explicit TransferListSortModel(QObject *parent = nullptr);

void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;

void setStatusFilter(TorrentFilter::Type filter);
void setCategoryFilter(const QString &category);
void disableCategoryFilter();
Expand All @@ -63,8 +65,10 @@ class TransferListSortModel final : public QSortFilterProxyModel
bool matchFilter(int sourceRow, const QModelIndex &sourceParent) const;

TorrentFilter m_filter;
mutable CachedSettingValue<int> m_subSortColumn;
mutable int m_lastSortColumn = -1;
CachedSettingValue<int> m_subSortColumn;
CachedSettingValue<int> m_subSortOrder;
int m_lastSortColumn = -1;
int m_lastSortOrder = 0;

Utils::Compare::NaturalCompare<Qt::CaseInsensitive> m_naturalCompare;
};

0 comments on commit 2bd5aca

Please sign in to comment.