/*
* Copyright 2008-2010 Niels Kummerfeldt <niels.kummerfeldt@tu-harburg.de>
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
#include "mainwindow.h"
#include "contextmenu.h"
#include "gpsclient.h"
#include "mapcontrol.h"
#include "mapwidget.h"
#include "markerlist.h"
#include "navigator.h"
#include "overview.h"
#include "poiwidget.h"
#include "routingwidget.h"
#include "searchwidget.h"
#include "dialogs/downloaddialog.h"
#include "dialogs/exportdialog.h"
#include "dialogs/gpsbabeldialog.h"
#include "dialogs/importdialog.h"
#include "dialogs/settingsdialog.h"
#include "dialogs/trackdialog.h"
#include <QDebug>
#include <QDockWidget>
#include <QPrinter>
#include <QPushButton>
#include <QToolBox>
#include <KAction>
#include <KActionCollection>
#include <KActionMenu>
#include <KApplication>
#include <KCmdLineArgs>
#include <KFileDialog>
#include <KLocale>
#include <KPrintPreview>
#include <KRecentDocument>
#include <KStandardAction>
#include <KStatusBar>
#include <KUrl>
#include <kio/job.h>
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)
{
Config::loadSettings();
connect(MapControl::self(), SIGNAL(fileFinished()),
this, SLOT(fileFinished()));
connect(MapControl::self(), SIGNAL(filePercent(qreal)),
this, SLOT(filePercent(qreal)));
m_map = new MapWidget(-6, 24, this);
m_map->setContextMenu(new ContextMenu(this));
connect(m_map, SIGNAL(mouseGeoPosition(QString)),
this, SLOT(statusMsg(QString)));
MapControl::self()->addMapWidget(m_map);
m_importDialog = new ImportDialog(this);
connect(m_importDialog, SIGNAL(okClicked()),
this, SLOT(importOkClicked()));
m_trackDialog = new TrackDialog(this);
m_babelDialog = new GpsBabelDialog(this);
m_settingsDialog = new SettingsDialog(this);
m_downloadDialog = new DownloadDialog(m_map, this);
m_exportDialog = new ExportDialog(m_map, this);
m_progressBar = new QProgressBar();
m_progressBar->setRange(0, 100);
m_progressBar->setFixedWidth(150);
m_progressBar->hide();
statusBar()->addPermanentWidget(m_progressBar);
m_gpsLed = new KLed(this);
m_gpsLed->setLook(KLed::Sunken);
m_gpsLed->off();
statusBar()->addPermanentWidget(m_gpsLed);
m_gpsClient = new GpsClient(this);
connect(m_gpsClient, SIGNAL(connected()), this, SLOT(gpsConnected()));
connect(m_gpsClient, SIGNAL(disconnected()), this, SLOT(gpsDisconnected()));
connect(m_gpsClient, SIGNAL(position(QPointF, bool)),
m_map, SLOT(gpsPosition(QPointF, bool)));
setCentralWidget(m_map);
setupDocks();
setupActions();
setupGUI();
actionCollection()->removeAction(actionCollection()->action("help_contents"));
actionCollection()->removeAction(actionCollection()->action("help_whats_this"));
actionCollection()->removeAction(actionCollection()->action("help_report_bug"));
actionCollection()->removeAction(actionCollection()->action("switch_application_language"));
m_map->moveHome();
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if(args->count() > 0) {
QString filename = args->url(0).toLocalFile();
statusBar()->showMessage(i18n("opening ")+filename);
m_progressBar->show();
MapControl::self()->load(filename);
KRecentDocument::add(filename);
m_recentFiles->addUrl(KUrl(filename));
}
}
QSize MainWindow::sizeHint() const
{
return QSize(1000, 700);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
Q_UNUSED(event)
m_recentFiles->saveEntries(KConfigGroup(KGlobal::config(), "recent"));
Config::setNavigatorControls(m_navigator->controls());
Config::saveSettings();
}
void MainWindow::reset()
{
MapControl::self()->reset();
Config::setIcons();
}
void MainWindow::openFile()
{
QString filter = "*.ptmap|Ptolemaeus Map (*.ptmap)";
filter.append("\n*.gpx|GPX File (*.gpx)");
filter.append("\n*.kml|KML File (*.kml)");
filter.append("\n*.hgt|SRTM Data File (*.hgt)");
filter.append("\n*.ptmap *.gpx *.kml *.hgt|All Supported Files");
QString filename = KFileDialog::getOpenFileName(KUrl(), filter);
if (!filename.isEmpty()) {
statusBar()->showMessage("opening "+filename);
m_progressBar->show();
MapControl::self()->load(filename);
KRecentDocument::add(filename);
m_recentFiles->addUrl(KUrl(filename));
}
}
void MainWindow::openRecent(const KUrl &url)
{
QString filename = url.toLocalFile();
statusBar()->showMessage(i18n("opening ")+filename);
m_progressBar->show();
MapControl::self()->load(filename);
}
void MainWindow::saveFile()
{
QString filter = "*.ptmap|Ptolemaeus Map (*.ptmap)";
filter.append("\n*.gpx|GPX File (*.gpx)");
filter.append("\n*.ptmap *.gpx|All Supported Files");
QString filename = KFileDialog::getSaveFileName(KUrl(), filter);
if (!filename.isEmpty()) {
m_progressBar->show();
MapControl::self()->save(filename);
KRecentDocument::add(filename);
m_recentFiles->addUrl(KUrl(filename));
}
}
void MainWindow::print()
{
// //QPrintDialog pd = KDEPrint::createPrintDialog
// QPrinter printer(QPrinter::HighResolution);
// printer.setPageSize(QPrinter::A4);
// KPrintPreview preview(&printer);
// QPainter painter(&printer);
// m_view->render(&painter);
// preview.exec();
}
void MainWindow::exportMap()
{
m_exportDialog->updateData();
m_exportDialog->show();
}
void MainWindow::gpsConnected()
{
m_gpsLed->on();
MapControl::self()->setSpecialIconVisible("gps", true);
actionCollection()->action("gpsconnect")->setEnabled(false);
actionCollection()->action("gpsdisconnect")->setEnabled(true);
}
void MainWindow::gpsDisconnected()
{
m_gpsLed->off();
MapControl::self()->setSpecialIconVisible("gps", false);
actionCollection()->action("gpsconnect")->setEnabled(true);
actionCollection()->action("gpsdisconnect")->setEnabled(false);
}
void MainWindow::statusMsg(const QString &s)
{
statusBar()->showMessage(s);
}
void MainWindow::importOkClicked()
{
m_progressBar->show();
statusBar()->showMessage("importing "+m_importDialog->filename());
MapControl::self()->load(m_importDialog->filename(), m_importDialog->options());
}
void MainWindow::fileFinished()
{
m_progressBar->hide();
m_progressBar->setValue(0);
statusBar()->showMessage("ready", 1500);
}
void MainWindow::filePercent(qreal percent)
{
m_progressBar->setValue(percent*100);
}
void MainWindow::setupDocks()
{
QDockWidget *dock = new QDockWidget(i18n("Tools"), this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock->setObjectName("tools");
addDockWidget(Qt::RightDockWidgetArea, dock);
actionCollection()->addAction("tools", dock->toggleViewAction());
QToolBox *toolbox = new QToolBox(dock);
toolbox->addItem(new SearchWidget(m_map, toolbox), KIcon("edit-find"),
i18n("Search"));
toolbox->addItem(new RoutingWidget(toolbox),// KIcon(""),
i18n("Routing"));
toolbox->addItem(new MarkerList(m_map, toolbox), KIcon("flag"),
i18n("Marker"));
dock->setWidget(toolbox);
dock = new QDockWidget(i18n("Navigator"), this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock->setObjectName("navigator");
addDockWidget(Qt::LeftDockWidgetArea, dock);
actionCollection()->addAction("navigator", dock->toggleViewAction());
m_navigator = new Navigator(dock);
m_navigator->setControls(Config::navigatorControls());
m_map->connectNavigator(m_navigator);
dock->setWidget(m_navigator);
dock = new QDockWidget(i18n("Overview"), this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock->setObjectName("overview");
addDockWidget(Qt::LeftDockWidgetArea, dock);
actionCollection()->addAction("overview", dock->toggleViewAction());
MapWidget *overview = new MapWidget(-10, 24, dock);
overview->setPrescaleFactor(0.0625);
MapControl::self()->addMapWidget(overview, true);
dock->setWidget(overview);
dock = new QDockWidget(i18n("Points Of Interest"), this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock->setObjectName("poi");
addDockWidget(Qt::LeftDockWidgetArea, dock);
actionCollection()->addAction("poi", dock->toggleViewAction());
PoiWidget *poi = new PoiWidget(this);
dock->setWidget(poi);
}
void MainWindow::setupActions()
{
KAction *action;
action = actionCollection()->addAction("toggleworldmap");
action->setText(i18n("World Map"));
action->setToolTip("");
action->setCheckable(true);
action->setChecked(true);
connect(action, SIGNAL(triggered(bool)), MapControl::self(), SLOT(toggleWorldMap()));
action = actionCollection()->addAction("gpsconnect");
action->setText(i18n("Connect to Gpsd"));
// action->setIcon(KIcon(""));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_gpsClient, SLOT(connectGps()));
action = actionCollection()->addAction("gpsdisconnect");
action->setText(i18n("Disconnect from Gpsd"));
// action->setIcon(KIcon(""));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_gpsClient, SLOT(disconnectGps()));
action->setEnabled(false);
action = actionCollection()->addAction("centerongps");
action->setText(i18n("Center on Current Position"));
action->setToolTip("");
action->setCheckable(true);
action->setChecked(true);
connect(action, SIGNAL(triggered(bool)), m_gpsClient, SLOT(setFollowPosition(bool)));
QHash<QString, QAction*> mapActions = m_map->actions();
QHash<QString, QAction*>::const_iterator i;
for (i = mapActions.constBegin(); i != mapActions.constEnd(); ++i) {
actionCollection()->addAction(i.key(), i.value());
}
action = actionCollection()->addAction("export");
action->setText(i18n("Export Map..."));
action->setIcon(KIcon("document-export"));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), this, SLOT(exportMap()));
action = actionCollection()->addAction("import");
action->setText(i18n("Import OSM File..."));
action->setIcon(KIcon("document-import"));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_importDialog, SLOT(show()));
action = actionCollection()->addAction("download");
action->setText(i18n("Download Map Data..."));
action->setIcon(KIcon("network-server"));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_downloadDialog, SLOT(show()));
action = actionCollection()->addAction("tracklist");
action->setText(i18n("Tracks..."));
// action->setIcon(KIcon(""));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_trackDialog, SLOT(show()));
action = actionCollection()->addAction("gpsbabel");
action->setText(i18n("Download track from Device..."));
// action->setIcon(KIcon(""));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_babelDialog, SLOT(show()));
action = actionCollection()->addAction("options_configure");
action->setText(i18n("Ptolemaeus Settings..."));
action->setIcon(KIcon("configure"));
action->setToolTip("");
connect(action, SIGNAL(triggered(bool)), m_settingsDialog, SLOT(show()));
KStandardAction::openNew(this, SLOT(reset()), actionCollection());
KStandardAction::quit(this, SLOT(close()), actionCollection());
KStandardAction::open(this, SLOT(openFile()), actionCollection());
m_recentFiles = KStandardAction::openRecent(this, SLOT(openRecent(KUrl)),
actionCollection());
m_recentFiles->setMaxItems(10);
m_recentFiles->loadEntries(KConfigGroup(KGlobal::config(), "recent"));
KStandardAction::saveAs(this, SLOT(saveFile()), actionCollection());
//KStandardAction::print(this, SLOT(print()), actionCollection());
}