diff --git a/downloadwidget.cpp b/downloadwidget.cpp index f134ba2..e2f91c7 100644 --- a/downloadwidget.cpp +++ b/downloadwidget.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010 Niels Kummerfeldt + * Copyright 2010-2011 Niels Kummerfeldt * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,14 +24,19 @@ #include #include #include +#include #include -#include #include #include DownloadWidget::DownloadWidget(QWidget *parent) : QWidget(parent), m_manager(new QNetworkAccessManager(this)), + m_downloadMode(Tiles), + m_tabWidget(new QTabWidget(this)), + m_dlProgress(new QProgressBar(this)), + m_startButton(new QPushButton("&Start", this)), + m_backButton(new QPushButton("&Back", this)), m_startLevel(0), m_dlRect(), m_dlList(), @@ -41,12 +46,30 @@ DownloadWidget::DownloadWidget(QWidget *parent) m_right(new QLabel("E 0", this)), m_bottom(new QLabel("N 0", this)), m_levelSpinBox(new QSpinBox(this)), - m_dlProgress(new QProgressBar(this)), m_prefixInput(new QLineEdit(this)), - m_skipExisting(new QCheckBox("S&kip already downloaded tiles", this)) + m_skipExisting(new QCheckBox("S&kip already downloaded tiles", this)), + m_poiType(new QComboBox(this)), + m_makePOILayer(new QCheckBox("&Load file after download", this)), + m_destFilename(new QLineEdit(QDir::homePath()+"/pois.osm", this)) { QGridLayout *layout = new QGridLayout(this); layout->setContentsMargins(0, 0, 0, 0); + layout->setRowStretch(0, 1); + + layout->addWidget(m_tabWidget, 0, 0, 1, 2); + + m_dlProgress->hide(); + layout->addWidget(m_dlProgress, 1, 0, 1, 2); + + connect(m_startButton, SIGNAL(clicked()), this, SLOT(startDownload())); + layout->addWidget(m_startButton, 2, 0); + + connect(m_backButton, SIGNAL(clicked()), this, SIGNAL(back())); + layout->addWidget(m_backButton, 2, 1); + + QWidget *widget = new QWidget(this); + layout = new QGridLayout(widget); + layout->setContentsMargins(0, 0, 0, 0); layout->setRowStretch(1, 1); m_up->setAlignment(Qt::AlignHCenter); @@ -77,17 +100,48 @@ DownloadWidget::DownloadWidget(QWidget *parent) m_skipExisting->setChecked(false); layout->addWidget(m_skipExisting, 5, 0, 1, 0); - m_dlProgress->hide(); - m_dlProgress->setFormat("%v / %m"); - layout->addWidget(m_dlProgress, 6, 0, 1, 4); + m_tabWidget->addTab(widget, "&Tiles"); - QPushButton *start = new QPushButton("&Start", this); - connect(start, SIGNAL(clicked()), this, SLOT(startDownload())); - layout->addWidget(start, 7, 0, 1, 2); + widget = new QWidget(this); + layout = new QGridLayout(widget); + layout->setContentsMargins(0, 0, 0, 0); + layout->setRowStretch(1, 1); - QPushButton *back = new QPushButton("&Back", this); - connect(back, SIGNAL(clicked()), this, SIGNAL(back())); - layout->addWidget(back, 7, 2, 1, 2); + label = new QLabel("Type:", this); + layout->addWidget(label, 0, 0); + + QSettings set(QDir::homePath()+"/Maps/nanomap.conf", QSettings::NativeFormat); + set.beginGroup("poi"); + QString iconPath = set.value("iconpath", "/usr/share/NanoMap/icons").toString(); + set.endGroup(); + QDir iconDir(iconPath); + QStringList icons = iconDir.entryList(QStringList() << "*.png"); + foreach (const QString &icon, icons) { + QString name = icon; + name.remove(".png"); + m_poiType->addItem(QIcon(iconPath+"/"+icon), name); + } + layout->addWidget(m_poiType, 0, 1, 1, 3); + + m_makePOILayer->setChecked(true); + layout->addWidget(m_makePOILayer , 2, 0, 1, 4); + + label = new QLabel("Save to:", this); + layout->addWidget(label , 3, 0); + + layout->addWidget(m_destFilename, 3, 1, 1, 3); + + m_tabWidget->addTab(widget, "&Points of Interest"); + + widget = new QWidget(this); + layout = new QGridLayout(widget); + layout->setContentsMargins(0, 0, 0, 0); + + label = new QLabel("TODO", this); + label->setAlignment(Qt::AlignCenter); + layout->addWidget(label, 0, 0); + + m_tabWidget->addTab(widget, "&Routing data"); connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); @@ -119,6 +173,46 @@ void DownloadWidget::setDownloadRect(const QRectF &rect) } void DownloadWidget::startDownload() +{ + switch (m_tabWidget->currentIndex()) { + case 0: + m_downloadMode = Tiles; + startDownloadTiles(); + break; + case 1: + m_downloadMode = POIs; + startDownloadPOIs(); + break; + case 2: + m_downloadMode = Packages; + startDownloadPackages(); + break; + } +} + +void DownloadWidget::replyFinished(QNetworkReply *reply) +{ + switch (m_downloadMode) { + case Tiles: + replyFinishedTiles(reply); + break; + case Packages: + replyFinishedPackages(reply); + break; + case POIs: + replyFinishedPOIs(reply); + break; + } + reply->deleteLater(); +} + +void DownloadWidget::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) +{ + m_dlProgress->setRange(0, bytesTotal); + m_dlProgress->setValue(bytesReceived); +} + +void DownloadWidget::startDownloadTiles() { m_prefix = m_prefixInput->text(); m_dlProgress->setValue(0); @@ -137,15 +231,22 @@ void DownloadWidget::startDownload() if (!m_dlList.isEmpty()) { m_dlProgress->show(); m_dlProgress->setRange(0, m_dlList.count()); + m_dlProgress->setFormat("%v / %m"); + m_tabWidget->setEnabled(false); + m_startButton->setEnabled(false); + m_backButton->setEnabled(false); QUrl url(m_dlList.takeFirst()); m_manager->get(QNetworkRequest(url)); } } -void DownloadWidget::replyFinished(QNetworkReply *reply) +void DownloadWidget::replyFinishedTiles(QNetworkReply *reply) { if (m_dlList.isEmpty()) { m_dlProgress->hide(); + m_tabWidget->setEnabled(true); + m_startButton->setEnabled(true); + m_backButton->setEnabled(true); } if (reply->error() == QNetworkReply::NoError) { QString path = reply->url().path(); @@ -176,7 +277,78 @@ void DownloadWidget::replyFinished(QNetworkReply *reply) int n = m_dlProgress->value(); m_dlProgress->setValue(n+1); } - reply->deleteLater(); +} + +void DownloadWidget::startDownloadPOIs() +{ + QString baseUrl("http://azure.openstreetmap.org/xapi/api/0.6/node"); + QString key = m_poiType->currentText().section("-", 0, 0); + QString value = m_poiType->currentText().section("-", 1); + QString keyValue = QString("[%1=%2]").arg(key, value); + QString bbox = QString("[bbox=%1,%2,%3,%4]").arg(m_dlRect.left()).arg(m_dlRect.top()) + .arg(m_dlRect.right()).arg(m_dlRect.bottom()); + QUrl url(baseUrl+keyValue+bbox); + QNetworkReply *reply = m_manager->get(QNetworkRequest(url)); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), + this, SLOT(downloadProgress(qint64, qint64))); + + m_dlProgress->show(); + m_dlProgress->setValue(0); + m_dlProgress->setFormat("%p%"); + m_tabWidget->setEnabled(false); + m_startButton->setEnabled(false); + m_backButton->setEnabled(false); +} + +void DownloadWidget::replyFinishedPOIs(QNetworkReply *reply) +{ + m_dlProgress->hide(); + m_tabWidget->setEnabled(true); + m_startButton->setEnabled(true); + m_backButton->setEnabled(true); + + if (reply->error() != QNetworkReply::NoError) { + return; + } + QByteArray data = reply->readAll(); + if (data.isEmpty()) { + return; + } + QFile file(m_destFilename->text()); + if (!file.open(QFile::WriteOnly)) { + return; + } + file.write(data); + file.close(); + + if (m_makePOILayer->isChecked()) { + emit loadFile(m_destFilename->text(), m_poiType->currentText().section("-", 1)); + } +} + +void DownloadWidget::startDownloadPackages() +{ + QUrl url("http://download../..."); + QNetworkReply *reply = m_manager->get(QNetworkRequest(url)); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), + this, SLOT(downloadProgress(qint64, qint64))); + + m_dlProgress->show(); + m_dlProgress->setValue(0); + m_dlProgress->setFormat("%p%"); + m_tabWidget->setEnabled(false); + m_startButton->setEnabled(false); + m_backButton->setEnabled(false); +} + +void DownloadWidget::replyFinishedPackages(QNetworkReply *reply) +{ + Q_UNUSED(reply) + + m_dlProgress->hide(); + m_tabWidget->setEnabled(true); + m_startButton->setEnabled(true); + m_backButton->setEnabled(true); } QString DownloadWidget::lon2string(qreal lon) diff --git a/downloadwidget.h b/downloadwidget.h index e549111..fa31d26 100644 --- a/downloadwidget.h +++ b/downloadwidget.h @@ -1,5 +1,5 @@ /* - * Copyright 2010 Niels Kummerfeldt + * Copyright 2010-2011 Niels Kummerfeldt * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,10 +21,13 @@ #define DOWNLOADWIDGET_H #include +#include #include #include #include +#include #include +#include #include #include @@ -40,27 +43,47 @@ public: signals: void back(); + void loadFile(const QString &filename, const QString &title); private slots: void startDownload(); void replyFinished(QNetworkReply *reply); + void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); private: + enum DownloadMode { + Tiles, + POIs, + Packages + }; + + void startDownloadTiles(); + void replyFinishedTiles(QNetworkReply *reply); + void startDownloadPOIs(); + void replyFinishedPOIs(QNetworkReply *reply); + void startDownloadPackages(); + void replyFinishedPackages(QNetworkReply *reply); QString lon2string(qreal lon); QString lat2string(qreal lat); int lon2tilex(qreal lon, int z); int lat2tiley(qreal lat, int z); QNetworkAccessManager *m_manager; + DownloadMode m_downloadMode; + QTabWidget *m_tabWidget; + QProgressBar *m_dlProgress; + QPushButton *m_startButton, *m_backButton; int m_startLevel; QRectF m_dlRect; QStringList m_dlList; QString m_prefix; QLabel *m_up, *m_left, *m_right, *m_bottom; QSpinBox *m_levelSpinBox; - QProgressBar *m_dlProgress; QLineEdit *m_prefixInput; QCheckBox *m_skipExisting; + QComboBox *m_poiType; + QCheckBox *m_makePOILayer; + QLineEdit *m_destFilename; }; diff --git a/main.cpp b/main.cpp index da3d904..ba596f7 100644 --- a/main.cpp +++ b/main.cpp @@ -28,7 +28,7 @@ int main(int argc, char *argv[]) MainWidget w; if (QApplication::arguments().count() > 1) { - w.loadFile(QApplication::arguments().at(1)); + w.loadFile(QApplication::arguments().at(1), ""); } QObject::connect(&w, SIGNAL(close()), &a, SLOT(quit())); diff --git a/mainwidget.cpp b/mainwidget.cpp index ae342bb..58f00fa 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010 Niels Kummerfeldt + * Copyright 2010-2011 Niels Kummerfeldt * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -81,6 +81,7 @@ MainWidget::MainWidget(QWidget *parent) m_stack->insertWidget(1, m_markerList); connect(m_dlWidget, SIGNAL(back()), this, SLOT(showMap())); + connect(m_dlWidget, SIGNAL(loadFile(QString, QString)), this, SLOT(loadFile(QString, QString))); m_stack->insertWidget(2, m_dlWidget); connect(m_search, SIGNAL(back()), this, SLOT(showMap())); @@ -94,16 +95,18 @@ MainWidget::~MainWidget() { } -void MainWidget::loadFile(const QString &fileName) +void MainWidget::loadFile(const QString &fileName, const QString &title) { if (fileName.endsWith(".gpx")) { AbstractLayer *l = new GpxLayer(m_map); l->load(fileName); - m_map->addLayer(l, 2, "GPS-Track"); + QString t = title.isEmpty() ? "GPS-Track" : title; + m_map->addLayer(l, 2, t); } else if (fileName.endsWith(".osm")) { AbstractLayer *l = new PoiLayer(m_map); l->load(fileName); - m_map->addLayer(l, 3, "Points Of Interest"); + QString t = title.isEmpty() ? "Points Of Interest" : title; + m_map->addLayer(l, 3, t); } } diff --git a/mainwidget.h b/mainwidget.h index a08e1ae..0f3d297 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -1,5 +1,5 @@ /* - * Copyright 2010 Niels Kummerfeldt + * Copyright 2010-2011 Niels Kummerfeldt * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,7 +36,8 @@ public: MainWidget(QWidget *parent = 0); ~MainWidget(); - void loadFile(const QString &fileName); +public slots: + void loadFile(const QString &fileName, const QString &title); signals: void close(); diff --git a/mapwidget.cpp b/mapwidget.cpp index bf37d65..a70966c 100644 --- a/mapwidget.cpp +++ b/mapwidget.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010 Niels Kummerfeldt + * Copyright 2010-2011 Niels Kummerfeldt * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -143,6 +143,7 @@ void MapWidget::addLayer(AbstractLayer *layer, int z, const QString &name) connect(layer, SIGNAL(visibilityChanged(bool)), action, SLOT(setChecked(bool))); m_layerMenu->addAction(action); m_layer.insertMulti(z, layer); + layer->zoom(m_level); } void MapWidget::resizeEvent(QResizeEvent *event)