Added refresh button to station schedule page
authorLuciano Montanaro <mikelima@cirulla.net>
Sun, 29 Jan 2012 22:39:14 +0000 (23:39 +0100)
committerLuciano Montanaro <mikelima@cirulla.net>
Sun, 29 Jan 2012 22:39:14 +0000 (23:39 +0100)
This commit also has some error reporting code mixed in. I must stop
multiple feature commits...

application/dataprovider.cpp
application/dataprovider.h
application/resources/harmattan/qml/StationPage.qml
application/stationschedulemodel.cpp
application/stationschedulemodel.h

index 9e5db6d..81617fb 100644 (file)
@@ -66,6 +66,8 @@ void DataProvider::fetchStationSchedule(const QString &station,
     stationQueryReply = accessManager->post(request, query);
     connect(stationQueryReply, SIGNAL(finished()),
             SLOT(onStationScheduleFetched()));
+    connect(stationQueryReply, SIGNAL(error(QNetworkReply::NetworkError)),
+            SLOT(onNetworkError(QNetworkReply::NetworkError)));
     QStringList recentStations = settings->recentStations();
     recentStations.push_front(station);
     recentStations.removeDuplicates();
@@ -87,8 +89,7 @@ void DataProvider::updateStation()
 
 void DataProvider::onStationScheduleFetched()
 {
-    disconnect(stationQueryReply, SIGNAL(finished()),
-               this, SLOT(onStationScheduleFetched()));
+    disconnect(stationQueryReply);
 
     QString name = Settings::instance()->recentStations().front();
 
@@ -96,3 +97,16 @@ void DataProvider::onStationScheduleFetched()
     stationQueryReply->deleteLater();
     stationQueryReply = 0;
 }
+
+void DataProvider::onNetworkError(QNetworkReply::NetworkError errorCode)
+{
+    switch (errorCode) {
+    case QNetworkReply::NoError:
+        qDebug() << "No Network error" << errorCode;
+        break;
+    default:
+        qDebug() << "SNetwork error" << errorCode;
+        emit error();
+        break;
+    }
+}
index ec893e7..a9c9cb5 100644 (file)
@@ -22,11 +22,11 @@ Boston, MA 02110-1301, USA.
 #ifndef DATAPROVIDER_H
 #define DATAPROVIDER_H
 
+#include <QNetworkReply>
 #include <QObject>
 #include <QSharedPointer>
 
 class QNetworkAccessManager;
-class QNetworkReply;
 class QUrl;
 
 class StationScheduleModel;
@@ -39,6 +39,7 @@ public:
     static DataProvider *instance();
 signals:
     void stationScheduleReady(const QByteArray &data, const QUrl &url);
+    void error();
 
 public slots:
     void fetchStationSchedule(const QString &station, const QString &stationCode = QString());
@@ -46,6 +47,7 @@ public slots:
 
 private slots:
     void onStationScheduleFetched(void);
+    void onNetworkError(QNetworkReply::NetworkError errorCode);
 
 private:
     QNetworkAccessManager *accessManager;
index 638c010..746a9a5 100644 (file)
@@ -10,6 +10,7 @@ Page {
     tools: ToolBarLayout {
         id: toolBar
         ToolIcon { iconId: "icon-m-toolbar-back"; onClicked: pageStack.pop() }
+        ToolIcon { iconId: "icon-m-toolbar-refresh"; onClicked: updateStation() }
         ToolIcon { iconId: "icon-m-toolbar-view-menu"; onClicked: menu.open() }
     }
     PageHeader {
@@ -162,6 +163,7 @@ Page {
         view.state = "loading"
     }
     function updateStation() {
+        view.state = "loading"
         console.log("Updating station with " + schedule.name + ", " + schedule.code)
         schedule.fetch(schedule.name, schedule.code)
     }
index ade4a31..6f13b79 100644 (file)
@@ -31,7 +31,8 @@ Boston, MA 02110-1301, USA.
 
 StationScheduleModel::StationScheduleModel(const QString &name, QObject *parent) :
     QAbstractListModel(parent),
-    m_name(name)
+    m_name(name),
+    m_error(QString())
 
 {
     DataProvider *provider = DataProvider::instance();
@@ -50,12 +51,13 @@ StationScheduleModel::StationScheduleModel(const QString &name, QObject *parent)
 
     connect(provider, SIGNAL(stationScheduleReady(QByteArray,QUrl)),
             this, SLOT(parse(QByteArray,QUrl)));
-
+    connect(provider, SIGNAL(error()),
+            this, SLOT(onNetworkError()));
     Settings *settings = Settings::instance();
     m_scheduleType = settings->showArrivalsPreferred() ? ArrivalSchedule : DepartureSchedule;
 }
 
-QString & StationScheduleModel::name()
+const QString &StationScheduleModel::name()
 {
     return m_name;
 }
@@ -68,7 +70,7 @@ void StationScheduleModel::setName(const QString &name)
     }
 }
 
-QString & StationScheduleModel::code()
+const QString &StationScheduleModel::code()
 {
     return m_code;
 }
@@ -81,6 +83,19 @@ void StationScheduleModel::setCode(const QString &code)
     }
 }
 
+const QString &StationScheduleModel::error()
+{
+    return m_error;
+}
+
+void StationScheduleModel::setError(const QString &error)
+{
+    if (error != m_error) {
+        m_error = error;
+        emit errorChanged();
+    }
+}
+
 StationScheduleModel::ScheduleType StationScheduleModel::type()
 {
     return m_scheduleType;
@@ -245,10 +260,21 @@ void StationScheduleModel::parse(const QByteArray &htmlReply, const QUrl &baseUr
     emit layoutChanged();
 }
 
+void StationScheduleModel::onNetworkError()
+{
+    qDebug()<< "Station Schedule Model got a Network Error";
+    m_error = tr("Network error");
+    emit errorChanged();
+}
+
 void StationScheduleModel::fetch(const QString &name, const QString &code)
 {
     DataProvider *provider = DataProvider::instance();
 
+    if (!error().isEmpty())
+        setError(QString());
+    m_departureSchedules.clear();
+    m_arrivalSchedules.clear();
     provider->fetchStationSchedule(name, code);
     setName(name);
     setCode(code);
@@ -258,17 +284,14 @@ int StationScheduleModel::rowCount(const QModelIndex &parent) const
 {
     Q_UNUSED(parent);
     if (m_scheduleType == DepartureSchedule) {
-        qDebug() << "schedule.count" << m_departureSchedules.count();
         return m_departureSchedules.count();
     } else {
-        qDebug() << "schedule.count" << m_arrivalSchedules.count();
         return m_arrivalSchedules.count();
     }
 }
 
 QVariant StationScheduleModel::data(const QModelIndex &index, int role) const
 {
-    qDebug() << "getting data for role" << role;
     if (!index.isValid()) {
         return QVariant();
     }
index 5b5a985..ca668cd 100644 (file)
@@ -34,6 +34,7 @@ class StationScheduleModel : public QAbstractListModel
     Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
     Q_PROPERTY(QString code READ code WRITE setCode NOTIFY codeChanged)
     Q_PROPERTY(ScheduleType type READ type WRITE setType NOTIFY typeChanged)
+    Q_PROPERTY(QString error READ error WRITE setError NOTIFY errorChanged)
     Q_ENUMS(ScheduleType)
 
     enum StationRoles {
@@ -57,10 +58,10 @@ public:
 
     explicit StationScheduleModel(const QString &name = "", QObject *parent = 0);
 
-    QString &name();
+    const QString &name();
     void setName(const QString &name);
 
-    QString &code();
+    const QString &code();
     void setCode(const QString &code);
 
     ScheduleType type();
@@ -69,20 +70,26 @@ public:
     int rowCount(const QModelIndex &parent) const;
     QVariant data(const QModelIndex &index, int role) const;
 
+    const QString &error();
+    void setError(const QString &code);
+
 signals:
     void nameChanged();
     void codeChanged();
     void typeChanged();
+    void errorChanged();
 
 public slots:
     void fetch(const QString &name, const QString &code = QString());
 
 private slots:
     void parse(const QByteArray &htmlReply, const QUrl &baseUrl);
+    void onNetworkError(void);
 
 private:
     QString m_name;
     QString m_code;
+    QString m_error;
     QList<StationScheduleItem> m_departureSchedules;
     QList<StationScheduleItem> m_arrivalSchedules;
     ScheduleType m_scheduleType;