~ubuntu-branches/ubuntu/saucy/clementine/saucy

« back to all changes in this revision

Viewing changes to src/core/multisortfilterproxy.cpp

  • Committer: Package Import Robot
  • Author(s): Thomas PIERSON
  • Date: 2012-01-01 20:43:39 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120101204339-lsb6nndwhfy05sde
Tags: 1.0.1+dfsg-1
New upstream release. (Closes: #653926, #651611, #657391)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "logging.h"
 
2
#include "multisortfilterproxy.h"
 
3
 
 
4
#include <QDate>
 
5
#include <QDateTime>
 
6
#include <QTime>
 
7
 
 
8
MultiSortFilterProxy::MultiSortFilterProxy(QObject* parent)
 
9
  : QSortFilterProxyModel(parent)
 
10
{
 
11
}
 
12
 
 
13
void MultiSortFilterProxy::AddSortSpec(int role, Qt::SortOrder order) {
 
14
  sorting_ << SortSpec(role, order);
 
15
}
 
16
 
 
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));
 
21
 
 
22
    if (ret < 0) {
 
23
      return spec.second == Qt::AscendingOrder;
 
24
    } else if (ret > 0) {
 
25
      return spec.second != Qt::AscendingOrder;
 
26
    }
 
27
  }
 
28
 
 
29
  return left.row() < right.row();
 
30
}
 
31
 
 
32
template <typename T>
 
33
static inline int DoCompare(T left, T right) {
 
34
  if (left < right)
 
35
    return -1;
 
36
  if (left > right)
 
37
    return 1;
 
38
  return 0;
 
39
}
 
40
 
 
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:
 
58
    default:
 
59
      if (isSortLocaleAware())
 
60
        return left.toString().localeAwareCompare(right.toString());
 
61
      else
 
62
        return left.toString().compare(right.toString(), sortCaseSensitivity());
 
63
  }
 
64
 
 
65
  return 0;
 
66
}