*/
#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>
#include <QNetworkRequest>
#include <QObject>
#include <QSettings>
+#include <QTimer>
#include <QUrl>
#include <QGeoPositionInfoSource>
App::App(QObject *parent) :
QObject(parent),
- accessManager(new QNetworkAccessManager(this)),
+ dataProvider(new DataProvider(this)),
+ checkingTimer(new QTimer(this)),
stationView(new StationView()),
stationListModel(new StationListModel(this)),
stationListView(new StationListView(stationListModel, stationView))
{
stationListModel->load("stations:stations.qpl");
- connect(stationListView, SIGNAL(stationSelected(const QString &)),
- SLOT(queryStation(const QString &)));
+ connect(dataProvider, SIGNAL(stationScheduleReady(QByteArray, QUrl)),
+ SLOT(downloadFinished(QByteArray)));
+
+ connect(stationListView, SIGNAL(stationSelected(QString)),
+ SLOT(queryStation(QString)));
connect(stationListView, SIGNAL(aboutTriggered()),
SLOT(showAboutDialog()));
readSettings();
qDebug() << "found" << stationListModel->rowCount() << "stations";
+
+ connect(checkingTimer, SIGNAL(timeout()), SLOT(updateStation()));
stationView->show();
- if (recentStations.isEmpty() || !stationViewPreferred) {
+ Settings *settings = Settings::instance();
+ if (settings->recentStations().isEmpty() || !settings->stationViewPreferred()) {
stationListView->show();
} else {
- queryStation(recentStations.front());
+ updateStation();
}
}
App::~App()
{
- delete stationView;
saveSettings();
+ disconnect();
+ delete stationView;
}
-void App::downloadFinished(void)
+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()));
- recentStations.push_front(station);
- recentStations.removeDuplicates();
- if (recentStations.count() > RECENT_STATIONS_MAX_COUNT) {
- recentStations.pop_back();
- }
+ 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";
QString name = QApplication::instance()->applicationName();
QString version = QApplication::instance()->applicationVersion();
QString aboutText = QString(
- tr("<p>%1 version %2</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).arg(version);
+ "<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);
}
void App::readSettings(void)
{
- QSettings settings;
- queryBaseUrl = settings.value("QueryURL",
- "http://mobile.viaggiatreno.it/viaggiatreno/mobile/stazione").toString();
- stationView->setBaseUrl(queryBaseUrl);
-
- recentStations = settings.value("RecentStations").toString().split(",");
- checkingInterval = settings.value("CheckInterval", 2000).toInt();
- stationViewPreferred = settings.value("StationViewPreferred", false).toBool();
+ 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;
-
- qDebug() << "Saving Settings to" << settings.fileName();
-
- settings.setValue("QueryURL", queryBaseUrl);
- settings.setValue("RecentStations", recentStations.join(","));
- settings.setValue("CheckInterval", checkingInterval);
- settings.setValue("StationViewPreferred", stationViewPreferred);
+ Settings::instance()->save();
}
QString App::dataDir(void)