Added support for Geographical sorting
[quandoparte] / application / stationlistmodel.cpp
1 #include "stationlistmodel.h"
2
3 #include <QFile>
4 #include <QDebug>
5 #include <QStandardItem>
6 #include <QGeoCoordinate>
7
8 QTM_USE_NAMESPACE
9 Q_DECLARE_METATYPE(QGeoCoordinate)
10
11 StationListModel::StationListModel(QObject *parent) :
12     QStandardItemModel(parent)
13
14 {
15     setRowCount(0);
16 }
17
18 bool StationListModel::load(const QString &filename)
19 {
20     QFile file(filename);
21
22     qDebug() << "loading filename:" << filename;
23
24     if (!file.open(QFile::ReadOnly | QFile::Text)) {
25         qDebug() << "cannot open file:" << filename;
26         return false;
27     }
28     m_reader.setDevice(&file);
29     m_reader.readNext();
30     while (!m_reader.atEnd()) {
31         if (m_reader.isStartElement()) {
32             if(m_reader.name() == "stations") {
33                 readStationsElement();
34             } else {
35                 m_reader.raiseError(tr("Not a qpl file"));
36             }
37         } else {
38             m_reader.readNext();
39         }
40     }
41     file.close();
42     if (m_reader.hasError()) {
43         qDebug() << "parser error for:" << filename;
44         return false;
45     } else if (file.error() != QFile::NoError) {
46         qDebug() << "file error for:" << filename;
47         return false;
48     }
49     return true;
50 }
51
52 void StationListModel::readStationsElement()
53 {
54     qDebug() << "reading stations element";
55
56     m_reader.readNext();
57     while (!m_reader.atEnd()) {
58         if (m_reader.isEndElement()) {
59             m_reader.readNext();
60             break;
61         } else if (m_reader.isStartElement()) {
62             if (m_reader.name() == "station") {
63                 readStationElement();
64             } else {
65                 skipUnknownElement();
66             }
67         } else {
68             m_reader.readNext();
69         }
70     }
71 }
72
73 void StationListModel::readStationElement()
74 {
75     qDebug() << "reading station element";
76
77     QStandardItem *item = new QStandardItem;
78     m_reader.readNext();
79     while (!m_reader.atEnd()) {
80         if (m_reader.isEndElement()) {
81             this->appendRow(item);
82             m_reader.readNext();
83             break;
84         } else if (m_reader.isStartElement()) {
85             if (m_reader.name() == "pos") {
86                 readPosElement(item);
87             } else  if (m_reader.name() == "name") {
88                 readNameElement(item);
89             } else {
90                 skipUnknownElement();
91             }
92         } else {
93             m_reader.readNext();
94         }
95     }
96 }
97
98 void StationListModel::readPosElement(QStandardItem *item)
99 {
100     qDebug() << "reading pos element";
101
102     QStringList coordinates = m_reader.readElementText().split(",");
103     QGeoCoordinate pos = QGeoCoordinate(coordinates[0].toDouble(), coordinates[1].toDouble());
104     item->setData(QVariant::fromValue(pos), PositionRole);
105     qDebug() << "pos:" << pos;
106     m_reader.readElementText();
107     if (m_reader.isEndElement()) {
108         m_reader.readNext();
109     }
110 }
111
112 void StationListModel::readNameElement(QStandardItem *item)
113 {
114     qDebug() << "reading name element";
115
116     item->setText(m_reader.readElementText());
117     qDebug() << "name:" << item->text();
118     if (m_reader.isEndElement()) {
119         m_reader.readNext();
120     }
121 }
122
123 void StationListModel::skipUnknownElement()
124 {
125     qDebug() << "skipping unknown element";
126
127     m_reader.readNext();
128     while (!m_reader.atEnd()) {
129         if (m_reader.isEndElement()) {
130             m_reader.readNext();
131             break;
132         } else if (!m_reader.isStartElement()) {
133             skipUnknownElement();
134         } else {
135             m_reader.readNext();
136         }
137     }
138 }