Moved sortingMode to StationListProxyModel
[quandoparte] / application / stationlistproxymodel.cpp
1 #include "stationlistproxymodel.h"
2 #include "stationlistmodel.h"
3
4 #include <QDebug>
5 #include <QGeoCoordinate>
6
7 QTM_USE_NAMESPACE
8
9 Q_DECLARE_METATYPE(QGeoCoordinate)
10
11 StationListProxyModel::StationListProxyModel(QObject *parent) :
12     QSortFilterProxyModel(parent),
13     m_here(44.5, 9.0),
14     m_sortingMode(NoSorting),
15     m_filterRecentOnly(false)
16 {
17     QHash<int, QByteArray> roles;
18     roles[StationListModel::PositionRole] = "position";
19     setRoleNames(roles);
20
21     setFilterCaseSensitivity(Qt::CaseInsensitive);
22     setSortCaseSensitivity(Qt::CaseInsensitive);
23 }
24
25 bool StationListProxyModel::lessThan(const QModelIndex &left,
26                                      const QModelIndex &right) const
27 {
28     int role = sortRole();
29
30     if (role == StationListModel::PositionRole) {
31         QGeoCoordinate first = left.data(role).value<QGeoCoordinate>();
32         QGeoCoordinate second = right.data(role).value<QGeoCoordinate>();
33        return first.distanceTo(m_here) < second.distanceTo(m_here);
34     } else {
35         return QString::compare(left.data(role).toString(),
36                                 right.data(role).toString(),
37                                 sortCaseSensitivity()) < 0;
38     }
39 }
40
41 void StationListProxyModel::setUserPosition(const QtMobility::QGeoCoordinate &pos)
42 {
43     m_here = pos;
44 }
45
46 void StationListProxyModel::setRecentStations(const QStringList &stations)
47 {
48     m_stations = stations;
49 }
50
51 bool StationListProxyModel::filterAcceptsRow(int sourceRow,
52                                              const QModelIndex &sourceParent) const
53 {
54     bool acceptable;
55     QModelIndex i = sourceModel()->index(sourceRow, 0, sourceParent);
56     QString stationName = sourceModel()->data(i).toString();
57     if (m_filterRecentOnly) {
58         acceptable =  m_stations.contains(stationName);
59     } else {
60         acceptable = true;
61     }
62     return acceptable && stationName.contains(filterRegExp());
63 }
64
65 void StationListProxyModel::setRecentOnlyFilter(bool activation)
66 {
67     m_filterRecentOnly = activation;
68 }
69
70 QString StationListProxyModel::searchPattern() const
71 {
72     return m_searchPattern;
73 }
74
75 void StationListProxyModel::setSearchPattern(const QString &pattern)
76 {
77     m_searchPattern = pattern;
78     setFilterFixedString(m_searchPattern);
79 }
80
81 StationListProxyModel::SortingMode StationListProxyModel::sortingMode()
82 {
83     return m_sortingMode;
84 }
85
86 void StationListProxyModel::setSortingMode(SortingMode mode)
87 {
88     if (mode != m_sortingMode) {
89         qDebug() << "setSorting Mode" << mode << m_sortingMode << "called";
90         m_sortingMode = mode;
91         setRecentOnlyFilter(false);
92
93         switch (mode) {
94         case StationListProxyModel::AlphaSorting:
95             setSortRole(Qt::DisplayRole);
96             break;
97         case StationListProxyModel::DistanceSorting:
98             setSortRole(StationListModel::PositionRole);
99             break;
100         case StationListProxyModel::RecentUsageSorting:
101             setRecentOnlyFilter(true);
102             break;
103         case StationListProxyModel::NoSorting:
104         default:
105             break;
106         }
107         invalidate();
108         sort(0);
109         emit sortingModeChanged(mode);
110     }
111 }