Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keep sub-sorting order #15074

Merged
merged 1 commit into from
Jun 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
Chocobo1 marked this conversation as resolved.
Show resolved Hide resolved
// 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;
};