2
#include "multisortfilterproxy.h"
8
MultiSortFilterProxy::MultiSortFilterProxy(QObject* parent)
9
: QSortFilterProxyModel(parent)
13
void MultiSortFilterProxy::AddSortSpec(int role, Qt::SortOrder order) {
14
sorting_ << SortSpec(role, order);
17
bool MultiSortFilterProxy::lessThan(const QModelIndex& left,
18
const QModelIndex& right) const {
19
foreach (const SortSpec& spec, sorting_) {
20
const int ret = Compare(left.data(spec.first), right.data(spec.first));
23
return spec.second == Qt::AscendingOrder;
25
return spec.second != Qt::AscendingOrder;
29
return left.row() < right.row();
33
static inline int DoCompare(T left, T right) {
41
int MultiSortFilterProxy::Compare(const QVariant& left, const QVariant& right) const {
42
// Copied from the QSortFilterProxyModel::lessThan implementation, but returns
43
// -1, 0 or 1 instead of true or false.
44
switch (left.userType()) {
45
case QVariant::Invalid:
46
return (right.type() != QVariant::Invalid) ? -1 : 0;
47
case QVariant::Int: return DoCompare(left.toInt(), right.toInt());
48
case QVariant::UInt: return DoCompare(left.toUInt(), right.toUInt());
49
case QVariant::LongLong: return DoCompare(left.toLongLong(), right.toLongLong());
50
case QVariant::ULongLong: return DoCompare(left.toULongLong(), right.toULongLong());
51
case QMetaType::Float: return DoCompare(left.toFloat(), right.toFloat());
52
case QVariant::Double: return DoCompare(left.toDouble(), right.toDouble());
53
case QVariant::Char: return DoCompare(left.toChar(), right.toChar());
54
case QVariant::Date: return DoCompare(left.toDate(), right.toDate());
55
case QVariant::Time: return DoCompare(left.toTime(), right.toTime());
56
case QVariant::DateTime: return DoCompare(left.toDateTime(), right.toDateTime());
57
case QVariant::String:
59
if (isSortLocaleAware())
60
return left.toString().localeAwareCompare(right.toString());
62
return left.toString().compare(right.toString(), sortCaseSensitivity());