*/
#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>
+
+// Constants
+static const int RECENT_STATIONS_MAX_COUNT = 10;
+
+QTM_USE_NAMESPACE
+
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("/opt/usr/share/apps/quandoparte/stations/stations.qpl");
+ 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(stationSelected(const QString &)),
- SLOT(queryStation(const 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()));
- connect(stationView, SIGNAL(showingArrivalsChanged(bool)),
- SLOT(setShowingArrivals(bool)));
readSettings();
qDebug() << "found" << stationListModel->rowCount() << "stations";
-#if defined(Q_WS_S60)
- stationView->showMaximized();
-#else
- stationView->show();
-#endif
- 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();
}
}
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()));
+ 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()
QString name = QApplication::instance()->applicationName();
QString version = QApplication::instance()->applicationVersion();
QString aboutText = QString(
- tr("<p>%1 version %2</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).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);
-
- 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();
}
-void App::setShowingArrivals(bool showArrivals)
+QString App::dataDir(void)
{
- showingArrivals = showArrivals;
+ return QString(DATADIR);
}