Bump version to 0.9.0
[quandoparte] / application / app.cpp
index 97ab0d9..26f0076 100644 (file)
@@ -20,9 +20,12 @@ Boston, MA 02110-1301, USA.
 */
 
 #include "app.h"
+#include "dataprovider.h"
 #include "stationview.h"
+#include "stationlistmodel.h"
 #include "stationlistview.h"
 #include "settingsdialog.h"
+#include "settings.h"
 
 #include <QDebug>
 #include <QMessageBox>
@@ -31,72 +34,119 @@ Boston, MA 02110-1301, USA.
 #include <QNetworkRequest>
 #include <QObject>
 #include <QSettings>
+#include <QTimer>
 #include <QUrl>
 
+#include <QGeoPositionInfoSource>
+
+// Constants
+static const int RECENT_STATIONS_MAX_COUNT = 10;
+
+QTM_USE_NAMESPACE
+
 App::App(QObject *parent) :
     QObject(parent),
-    accessManager(new QNetworkAccessManager(this)),
-    stationView(new StationView(NULL)),
-    stationListView(new StationListView(stationView))
+    dataProvider(new DataProvider(this)),
+    checkingTimer(new QTimer(this)),
+    stationView(new StationView()),
+    stationListModel(new StationListModel(this)),
+    stationListView(new StationListView(stationListModel, stationView))
 {
-    connect(stationListView, SIGNAL(stationSelected(const QString &)),
-            SLOT(queryStation(const QString &)));
+    stationListModel->load("stations:stations.qpl");
+
+    connect(dataProvider, SIGNAL(stationScheduleReady(QByteArray, QUrl)),
+            SLOT(downloadFinished(QByteArray)));
+
+    connect(stationListView, SIGNAL(stationSelected(QString)),
+            SLOT(queryStation(QString)));
+
+    connect(stationListView, SIGNAL(aboutTriggered()),
+            SLOT(showAboutDialog()));
     connect(stationView, SIGNAL(aboutTriggered()),
             SLOT(showAboutDialog()));
+
+    connect(stationListView, SIGNAL(settingsChangeRequested()),
+            SLOT(showSettingsDialog()));
+    connect(stationView, SIGNAL(settingsChangeRequested()),
+            SLOT(showSettingsDialog()));
+
     connect(stationView, SIGNAL(stationListSelectTriggered()),
             SLOT(showStationSelectView()));
 
     readSettings();
 
-#if defined(Q_WS_S60)
-    stationView->showMaximized();
-#else
-    stationView->show();
-#endif
+    qDebug() << "found" << stationListModel->rowCount() << "stations";
 
-    if (stationName.isEmpty()) {
-#if defined(Q_WS_S60)
-        stationListView->showMaximized();
-#else
+    connect(checkingTimer, SIGNAL(timeout()), SLOT(updateStation()));
+    stationView->show();
+    Settings *settings = Settings::instance();
+    if (settings->recentStations().isEmpty() || !settings->stationViewPreferred()) {
         stationListView->show();
-#endif
+    } else {
+        updateStation();
     }
 }
 
-void App::downloadFinished(void)
+App::~App()
+{
+    saveSettings();
+    disconnect();
+    delete stationView;
+}
+
+void App::downloadFinished(const QByteArray &data)
 {
-    disconnect(stationQueryReply, SIGNAL(finished()),
-               this, SLOT(downloadFinished()));
-    stationView->updateView(stationQueryReply->readAll());
+    stationView->updateView(data);
     stationListView->hide();
-    stationQueryReply->deleteLater();
-    stationQueryReply = 0;
+#ifdef Q_WS_MAEMO_5
+    stationListView->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
+#endif
 }
 
 void App::queryStation(const QString &station)
 {
-    QNetworkRequest request;
-    request.setUrl(queryBaseUrl);
-    const QString queryString = "stazione=" + station;
-    const QByteArray query(queryString.toLocal8Bit());
-    stationQueryReply = accessManager->post(request, query);
-    connect(stationQueryReply, SIGNAL(finished()),
-            this, SLOT(downloadFinished()));
+    dataProvider->stationSchedule(station);
+#ifdef Q_WS_MAEMO_5
+    stationListView->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
+#endif
+}
+
+void App::updateStation()
+{
+    if (!stationListView->isVisible()) {
+        dataProvider->updateStation();
+    }
 }
 
 void App::showSettingsDialog()
 {
+    qDebug() << "Settings Dialog called";
+
+    SettingsDialog *dialog = new SettingsDialog(stationView);
+    if (dialog->exec() == QDialog::Accepted) {
+        readSettings();
+    }
+    delete dialog;
 }
 
 void App::showAboutDialog()
 {
     qDebug() << "About Dialog called";
     QString name = QApplication::instance()->applicationName();
+    QString version = QApplication::instance()->applicationVersion();
     QString aboutText = QString(
-                tr("<p>%1</p>"
-                   "<p>Copyright (c) 2010</p>"
+                tr("<h2>"
+                   "<a href='http://quandoparte.garage.maemo.org'>%1</a> version %2"
+                   "</h2>"
+                   "<p>Copyright (c) 2010, 2011</p>"
                    "<p>Luciano Montanaro (mikelima@cirulla.net)</p>"
-                   "<p>Licensed under the GNU Public License v2 or above</p>")).arg(name);
+                   "<p>Licensed under the GNU Public License v2 or above</p>"
+                   "<p>Station geolocation data from "
+                   "<a href='http://www.openstreetmap.org'>OpenStreetMap</a>"
+                   "</p>"
+                   "<p>Realtime train data from "
+                   "<a href='http://mobile.viaggiatreno.it'>Viaggiatreno</a>"
+                   "</p>")).arg(name).arg(version);
     QMessageBox::about(stationView, name, aboutText);
 }
 
@@ -107,21 +157,30 @@ void App::showStationSelectView(void)
 
 void App::readSettings(void)
 {
-    QSettings settings;
-    queryBaseUrl = settings.value("QueryURL",
-                                  "http://mobile.viaggiatreno.it/viaggiatreno/mobile/stazione").toString();
-    stationView->setBaseUrl(queryBaseUrl);
-
-    stationName = settings.value("CurrentStation").toString();
-    showingArrivals = settings.value("ShowingArrivals", false).toBool();
-    checkingInterval = settings.value("CheckInterval", 2000).toInt();
+    Settings *settings = Settings::instance();
+    stationView->setBaseUrl(settings->queryBaseUrl() + "stazione");
+
+    /*
+       I would use > 0 here, but people may have an old settings file with a 2
+       seconds timeout which is way too short.
+       As a workaround I consider anything less than 30 seconds as too short
+       and disable the timer.
+    */
+    if (settings->checkingInterval() > 30000) {
+        checkingTimer->setInterval(settings->checkingInterval());
+        checkingTimer->start();
+    } else {
+        checkingTimer->setInterval(-1);
+        checkingTimer->stop();
+    }
 }
 
 void App::saveSettings(void)
 {
-    QSettings settings;
-    settings.setValue("QueryURL", queryBaseUrl);
-    settings.value("CurrentStation", stationName);
-    settings.value("ShowingArrivals", showingArrivals);
-    settings.value("CheckInterval", checkingInterval);
+    Settings::instance()->save();
+}
+
+QString App::dataDir(void)
+{
+    return QString(DATADIR);
 }