1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-07 07:13:21 +02:00
GPXSee/src/gui.cpp

1376 lines
38 KiB
C++
Raw Normal View History

#include <QApplication>
2015-10-05 01:43:48 +02:00
#include <QVBoxLayout>
#include <QMenuBar>
#include <QStatusBar>
#include <QMessageBox>
#include <QFileDialog>
#include <QPrintDialog>
2015-10-05 01:43:48 +02:00
#include <QPainter>
2016-05-22 15:47:23 +02:00
#include <QPaintEngine>
#include <QPaintDevice>
2015-10-05 01:43:48 +02:00
#include <QKeyEvent>
2015-11-23 02:37:08 +01:00
#include <QSignalMapper>
#include <QMenu>
#include <QToolBar>
#include <QTabWidget>
#include <QActionGroup>
#include <QAction>
#include <QLabel>
2016-04-26 09:39:16 +02:00
#include <QSettings>
2016-05-21 16:18:48 +02:00
#include <QLocale>
2016-10-04 10:16:46 +02:00
#include <QMimeData>
#include <QPixmapCache>
2015-10-05 01:43:48 +02:00
#include "config.h"
#include "icons.h"
#include "keys.h"
2016-04-28 08:49:06 +02:00
#include "settings.h"
2015-10-05 01:43:48 +02:00
#include "gpx.h"
2015-11-23 02:37:08 +01:00
#include "map.h"
#include "maplist.h"
2015-10-12 01:12:12 +02:00
#include "elevationgraph.h"
#include "speedgraph.h"
#include "heartrategraph.h"
2016-06-16 20:47:32 +02:00
#include "temperaturegraph.h"
2016-09-26 21:01:58 +02:00
#include "pathview.h"
2016-05-12 09:03:05 +02:00
#include "trackinfo.h"
2015-10-20 22:18:41 +02:00
#include "filebrowser.h"
#include "cpuarch.h"
2016-05-24 03:01:22 +02:00
#include "exportdialog.h"
2016-06-24 00:55:44 +02:00
#include "graphtab.h"
2016-07-25 19:32:36 +02:00
#include "misc.h"
#include "gui.h"
2015-10-05 01:43:48 +02:00
GUI::GUI(QWidget *parent) : QMainWindow(parent)
2015-10-05 01:43:48 +02:00
{
loadMaps();
loadPOIs();
2015-11-23 02:37:08 +01:00
createPathView();
createGraphTabs();
2015-10-05 01:43:48 +02:00
createStatusBar();
2016-08-09 01:16:19 +02:00
createActions();
createMenus();
createToolBars();
2015-10-05 01:43:48 +02:00
2015-10-20 22:18:41 +02:00
_browser = new FileBrowser(this);
_browser->setFilter(QStringList("*.gpx"));
2015-10-05 01:43:48 +02:00
QVBoxLayout *layout = new QVBoxLayout;
2016-09-26 21:01:58 +02:00
layout->addWidget(_pathView);
layout->addWidget(_graphTabWidget);
layout->setContentsMargins(0, 0, 0, 0);
#ifdef Q_OS_WIN32
layout->setSpacing(0);
#endif // Q_OS_WIN32
2015-10-05 01:43:48 +02:00
QWidget *widget = new QWidget;
widget->setLayout(layout);
setCentralWidget(widget);
2016-04-30 10:54:07 +02:00
setWindowIcon(QIcon(QPixmap(APP_ICON)));
2015-10-05 01:43:48 +02:00
setWindowTitle(APP_NAME);
setUnifiedTitleAndToolBarOnMac(true);
_trackCount = 0;
_routeCount = 0;
_waypointCount = 0;
_trackDistance = 0;
_routeDistance = 0;
_time = 0;
2015-10-05 01:43:48 +02:00
2016-03-30 20:50:51 +02:00
_sliderPos = 0;
2016-03-23 09:38:22 +01:00
updateGraphTabs();
2016-03-25 09:50:19 +01:00
updateTrackView();
2016-08-10 21:17:12 +02:00
updateStatusBarInfo();
2016-04-26 09:39:16 +02:00
readSettings();
2016-05-25 23:27:07 +02:00
2016-05-27 22:45:58 +02:00
_exportPaperSize = (QLocale::system().measurementSystem()
2016-05-25 23:27:07 +02:00
== QLocale::ImperialSystem) ? QPrinter::Letter : QPrinter::A4;
_exportOrientation = QPrinter::Portrait;
2016-05-27 22:45:58 +02:00
_exportFileName = QString("%1/export.pdf").arg(QDir::currentPath());
_exportMargins = MarginsF(5.0, 5.0, 5.0, 5.0);
2016-10-05 18:23:16 +02:00
setAcceptDrops(true);
QPixmapCache::setCacheLimit(65536);
2015-10-05 01:43:48 +02:00
}
2016-05-13 18:48:42 +02:00
GUI::~GUI()
{
for (int i = 0; i < _tabs.size(); i++) {
if (_graphTabWidget->indexOf(_tabs.at(i)) < 0)
2016-06-24 00:55:44 +02:00
delete _tabs.at(i);
2016-05-13 18:48:42 +02:00
}
}
void GUI::loadMaps()
2015-11-23 02:37:08 +01:00
{
if (QFile::exists(USER_MAP_FILE))
_maps = MapList::load(this, USER_MAP_FILE);
else
_maps = MapList::load(this, GLOBAL_MAP_FILE);
}
void GUI::loadPOIs()
{
QFileInfoList list;
QDir userDir(USER_POI_DIR);
QDir globalDir(GLOBAL_POI_DIR);
if (userDir.exists())
list = userDir.entryInfoList(QStringList(), QDir::Files);
else
list = globalDir.entryInfoList(QStringList(), QDir::Files);
for (int i = 0; i < list.size(); ++i)
_poi.loadFile(list.at(i).absoluteFilePath());
2015-11-23 02:37:08 +01:00
}
void GUI::createMapActions()
{
QActionGroup *ag = new QActionGroup(this);
ag->setExclusive(true);
QSignalMapper *sm = new QSignalMapper(this);
for (int i = 0; i < _maps.count(); i++) {
QAction *a = new QAction(_maps.at(i)->name(), this);
a->setCheckable(true);
a->setActionGroup(ag);
sm->setMapping(a, i);
connect(a, SIGNAL(triggered()), sm, SLOT(map()));
_mapActions.append(a);
}
connect(sm, SIGNAL(mapped(int)), this, SLOT(mapChanged(int)));
}
void GUI::createPOIFilesActions()
{
_poiFilesSM = new QSignalMapper(this);
2016-03-05 22:42:22 +01:00
for (int i = 0; i < _poi.files().count(); i++)
createPOIFileAction(i);
2016-03-05 22:42:22 +01:00
connect(_poiFilesSM, SIGNAL(mapped(int)), this, SLOT(poiFileChecked(int)));
}
2016-03-05 22:42:22 +01:00
QAction *GUI::createPOIFileAction(int index)
{
QAction *a = new QAction(QFileInfo(_poi.files().at(index)).fileName(),
this);
a->setCheckable(true);
2016-03-05 22:42:22 +01:00
_poiFilesSM->setMapping(a, index);
connect(a, SIGNAL(triggered()), _poiFilesSM, SLOT(map()));
_poiFilesActions.append(a);
return a;
}
2015-10-05 01:43:48 +02:00
void GUI::createActions()
{
2016-09-19 00:56:10 +02:00
QActionGroup *ag;
2015-10-05 01:43:48 +02:00
// Action Groups
_fileActionGroup = new QActionGroup(this);
_fileActionGroup->setExclusive(false);
_fileActionGroup->setEnabled(false);
2015-12-18 22:21:11 +01:00
_navigationActionGroup = new QActionGroup(this);
_navigationActionGroup->setEnabled(false);
2015-10-05 01:43:48 +02:00
// General actions
_exitAction = new QAction(QIcon(QPixmap(QUIT_ICON)), tr("Quit"), this);
_exitAction->setShortcut(QUIT_SHORTCUT);
2016-03-24 19:16:26 +01:00
connect(_exitAction, SIGNAL(triggered()), this, SLOT(close()));
2016-04-05 09:10:19 +02:00
addAction(_exitAction);
2015-10-05 01:43:48 +02:00
2015-10-21 01:09:17 +02:00
// Help & About
_dataSourcesAction = new QAction(tr("Data sources"), this);
connect(_dataSourcesAction, SIGNAL(triggered()), this, SLOT(dataSources()));
2015-10-21 01:09:17 +02:00
_keysAction = new QAction(tr("Keyboard controls"), this);
connect(_keysAction, SIGNAL(triggered()), this, SLOT(keys()));
2015-10-05 01:43:48 +02:00
_aboutAction = new QAction(QIcon(QPixmap(APP_ICON)),
tr("About GPXSee"), this);
connect(_aboutAction, SIGNAL(triggered()), this, SLOT(about()));
2016-08-09 01:16:19 +02:00
// File actions
2015-10-05 01:43:48 +02:00
_openFileAction = new QAction(QIcon(QPixmap(OPEN_FILE_ICON)),
tr("Open"), this);
_openFileAction->setShortcut(OPEN_SHORTCUT);
2015-10-05 01:43:48 +02:00
connect(_openFileAction, SIGNAL(triggered()), this, SLOT(openFile()));
2016-04-05 09:10:19 +02:00
addAction(_openFileAction);
_printFileAction = new QAction(QIcon(QPixmap(PRINT_FILE_ICON)),
2016-05-27 22:45:58 +02:00
tr("Print..."), this);
_printFileAction->setActionGroup(_fileActionGroup);
connect(_printFileAction, SIGNAL(triggered()), this, SLOT(printFile()));
addAction(_printFileAction);
_exportFileAction = new QAction(QIcon(QPixmap(EXPORT_FILE_ICON)),
2016-05-27 22:45:58 +02:00
tr("Export to PDF..."), this);
_exportFileAction->setShortcut(EXPORT_SHORTCUT);
_exportFileAction->setActionGroup(_fileActionGroup);
connect(_exportFileAction, SIGNAL(triggered()), this, SLOT(exportFile()));
addAction(_exportFileAction);
2015-10-05 01:43:48 +02:00
_closeFileAction = new QAction(QIcon(QPixmap(CLOSE_FILE_ICON)),
tr("Close"), this);
_closeFileAction->setShortcut(CLOSE_SHORTCUT);
2015-10-05 01:43:48 +02:00
_closeFileAction->setActionGroup(_fileActionGroup);
2016-03-23 20:56:39 +01:00
connect(_closeFileAction, SIGNAL(triggered()), this, SLOT(closeAll()));
2016-04-05 09:10:19 +02:00
addAction(_closeFileAction);
2015-10-20 22:18:41 +02:00
_reloadFileAction = new QAction(QIcon(QPixmap(RELOAD_FILE_ICON)),
tr("Reload"), this);
_reloadFileAction->setShortcut(RELOAD_SHORTCUT);
2015-10-20 22:18:41 +02:00
_reloadFileAction->setActionGroup(_fileActionGroup);
connect(_reloadFileAction, SIGNAL(triggered()), this, SLOT(reloadFile()));
2016-04-05 09:10:19 +02:00
addAction(_reloadFileAction);
2015-10-05 01:43:48 +02:00
// POI actions
_openPOIAction = new QAction(QIcon(QPixmap(OPEN_FILE_ICON)),
2015-11-23 02:37:08 +01:00
tr("Load POI file"), this);
2015-10-05 01:43:48 +02:00
connect(_openPOIAction, SIGNAL(triggered()), this, SLOT(openPOIFile()));
_closePOIAction = new QAction(QIcon(QPixmap(CLOSE_FILE_ICON)),
tr("Close POI files"), this);
connect(_closePOIAction, SIGNAL(triggered()), this, SLOT(closePOIFiles()));
_overlapPOIAction = new QAction(tr("Overlap POIs"), this);
_overlapPOIAction->setCheckable(true);
2016-09-26 21:01:58 +02:00
connect(_overlapPOIAction, SIGNAL(triggered(bool)), _pathView,
2016-08-09 01:16:19 +02:00
SLOT(setPOIOverlap(bool)));
_showPOILabelsAction = new QAction(tr("Show POI labels"), this);
_showPOILabelsAction->setCheckable(true);
2016-09-26 21:01:58 +02:00
connect(_showPOILabelsAction, SIGNAL(triggered(bool)), _pathView,
2016-08-09 01:16:19 +02:00
SLOT(showPOILabels(bool)));
2015-10-05 01:43:48 +02:00
_showPOIAction = new QAction(QIcon(QPixmap(SHOW_POI_ICON)),
2015-11-23 02:37:08 +01:00
tr("Show POIs"), this);
2015-10-05 01:43:48 +02:00
_showPOIAction->setCheckable(true);
_showPOIAction->setShortcut(SHOW_POI_SHORTCUT);
2016-10-08 14:53:10 +02:00
connect(_showPOIAction, SIGNAL(triggered(bool)), _pathView,
SLOT(showPOI(bool)));
2016-04-05 09:10:19 +02:00
addAction(_showPOIAction);
createPOIFilesActions();
2015-11-23 02:37:08 +01:00
// Map actions
_showMapAction = new QAction(QIcon(QPixmap(SHOW_MAP_ICON)), tr("Show map"),
this);
_showMapAction->setCheckable(true);
_showMapAction->setShortcut(SHOW_MAP_SHORTCUT);
connect(_showMapAction, SIGNAL(triggered(bool)), this, SLOT(showMap(bool)));
2016-04-05 09:10:19 +02:00
addAction(_showMapAction);
2016-04-01 19:25:34 +02:00
_clearMapCacheAction = new QAction(tr("Clear tile cache"), this);
connect(_clearMapCacheAction, SIGNAL(triggered()), this,
SLOT(clearMapCache()));
if (_maps.empty()) {
2015-11-23 02:37:08 +01:00
_showMapAction->setEnabled(false);
2016-04-01 19:25:34 +02:00
_clearMapCacheAction->setEnabled(false);
} else {
2015-11-23 02:37:08 +01:00
createMapActions();
2016-04-08 22:33:19 +02:00
_nextMapAction = new QAction(tr("Next map"), this);
_nextMapAction->setShortcut(NEXT_MAP_SHORTCUT);
2016-04-08 22:33:19 +02:00
connect(_nextMapAction, SIGNAL(triggered()), this, SLOT(nextMap()));
addAction(_nextMapAction);
_prevMapAction = new QAction(tr("Next map"), this);
_prevMapAction->setShortcut(PREV_MAP_SHORTCUT);
2016-04-08 22:33:19 +02:00
connect(_prevMapAction, SIGNAL(triggered()), this, SLOT(prevMap()));
addAction(_prevMapAction);
2016-02-07 18:12:03 +01:00
}
2016-08-09 01:16:19 +02:00
// Data actions
_showTracksAction = new QAction(tr("Show tracks"), this);
2016-08-09 01:16:19 +02:00
_showTracksAction->setCheckable(true);
connect(_showTracksAction, SIGNAL(triggered(bool)), this,
2016-08-09 01:16:19 +02:00
SLOT(showTracks(bool)));
_showRoutesAction = new QAction(tr("Show routes"), this);
2016-08-09 01:16:19 +02:00
_showRoutesAction->setCheckable(true);
connect(_showRoutesAction, SIGNAL(triggered(bool)), this,
2016-08-09 01:16:19 +02:00
SLOT(showRoutes(bool)));
_showWaypointsAction = new QAction(tr("Show waypoints"), this);
2016-08-09 01:16:19 +02:00
_showWaypointsAction->setCheckable(true);
2016-09-26 21:01:58 +02:00
connect(_showWaypointsAction, SIGNAL(triggered(bool)), _pathView,
2016-08-09 01:16:19 +02:00
SLOT(showWaypoints(bool)));
2016-08-09 10:47:49 +02:00
_showWaypointLabelsAction = new QAction(tr("Waypoint labels"), this);
2016-08-09 01:16:19 +02:00
_showWaypointLabelsAction->setCheckable(true);
2016-09-26 21:01:58 +02:00
connect(_showWaypointLabelsAction, SIGNAL(triggered(bool)), _pathView,
2016-08-09 01:16:19 +02:00
SLOT(showWaypointLabels(bool)));
_showRouteWaypointsAction = new QAction(tr("Route waypoints"), this);
2016-08-09 10:47:49 +02:00
_showRouteWaypointsAction->setCheckable(true);
2016-09-26 21:01:58 +02:00
connect(_showRouteWaypointsAction, SIGNAL(triggered(bool)), _pathView,
2016-08-09 10:47:49 +02:00
SLOT(showRouteWaypoints(bool)));
2016-08-09 01:16:19 +02:00
2016-09-19 00:56:10 +02:00
// Graph actions
_showGraphsAction = new QAction(QIcon(QPixmap(SHOW_GRAPHS_ICON)),
tr("Show graphs"), this);
_showGraphsAction->setCheckable(true);
_showGraphsAction->setShortcut(SHOW_GRAPHS_SHORTCUT);
connect(_showGraphsAction, SIGNAL(triggered(bool)), this,
SLOT(showGraphs(bool)));
2016-04-05 09:10:19 +02:00
addAction(_showGraphsAction);
2016-09-19 00:56:10 +02:00
ag = new QActionGroup(this);
ag->setExclusive(true);
_distanceGraphAction = new QAction(tr("Distance"), this);
_distanceGraphAction->setCheckable(true);
_distanceGraphAction->setActionGroup(ag);
_distanceGraphAction->setShortcut(DISTANCE_GRAPH_SHORTCUT);
connect(_distanceGraphAction, SIGNAL(triggered()), this,
SLOT(setDistanceGraph()));
_timeGraphAction = new QAction(tr("Time"), this);
_timeGraphAction->setCheckable(true);
_timeGraphAction->setActionGroup(ag);
_timeGraphAction->setShortcut(TIME_GRAPH_SHORTCUT);
connect(_timeGraphAction, SIGNAL(triggered()), this,
SLOT(setTimeGraph()));
// Settings actions
_showToolbarsAction = new QAction(tr("Show toolbars"), this);
_showToolbarsAction->setCheckable(true);
connect(_showToolbarsAction, SIGNAL(triggered(bool)), this,
SLOT(showToolbars(bool)));
2016-09-19 00:56:10 +02:00
ag = new QActionGroup(this);
2015-12-19 20:23:07 +01:00
ag->setExclusive(true);
_metricUnitsAction = new QAction(tr("Metric"), this);
_metricUnitsAction->setCheckable(true);
_metricUnitsAction->setActionGroup(ag);
connect(_metricUnitsAction, SIGNAL(triggered()), this,
SLOT(setMetricUnits()));
_imperialUnitsAction = new QAction(tr("Imperial"), this);
_imperialUnitsAction->setCheckable(true);
_imperialUnitsAction->setActionGroup(ag);
connect(_imperialUnitsAction, SIGNAL(triggered()), this,
SLOT(setImperialUnits()));
2016-04-05 09:10:19 +02:00
_fullscreenAction = new QAction(QIcon(QPixmap(FULLSCREEN_ICON)),
tr("Fullscreen mode"), this);
_fullscreenAction->setCheckable(true);
_fullscreenAction->setShortcut(FULLSCREEN_SHORTCUT);
2016-04-05 09:10:19 +02:00
connect(_fullscreenAction, SIGNAL(triggered(bool)), this,
SLOT(showFullscreen(bool)));
addAction(_fullscreenAction);
2015-12-18 22:21:11 +01:00
// Navigation actions
_nextAction = new QAction(QIcon(QPixmap(NEXT_FILE_ICON)), tr("Next"), this);
_nextAction->setActionGroup(_navigationActionGroup);
connect(_nextAction, SIGNAL(triggered()), this, SLOT(next()));
_prevAction = new QAction(QIcon(QPixmap(PREV_FILE_ICON)), tr("Previous"),
this);
_prevAction->setActionGroup(_navigationActionGroup);
connect(_prevAction, SIGNAL(triggered()), this, SLOT(prev()));
_lastAction = new QAction(QIcon(QPixmap(LAST_FILE_ICON)), tr("Last"), this);
_lastAction->setActionGroup(_navigationActionGroup);
connect(_lastAction, SIGNAL(triggered()), this, SLOT(last()));
_firstAction = new QAction(QIcon(QPixmap(FIRST_FILE_ICON)), tr("First"),
this);
_firstAction->setActionGroup(_navigationActionGroup);
connect(_firstAction, SIGNAL(triggered()), this, SLOT(first()));
2015-10-05 01:43:48 +02:00
}
void GUI::createMenus()
{
2016-08-09 01:16:19 +02:00
QMenu *fileMenu = menuBar()->addMenu(tr("File"));
fileMenu->addAction(_openFileAction);
fileMenu->addSeparator();
fileMenu->addAction(_printFileAction);
fileMenu->addAction(_exportFileAction);
fileMenu->addSeparator();
fileMenu->addAction(_reloadFileAction);
fileMenu->addSeparator();
fileMenu->addAction(_closeFileAction);
2015-12-01 23:13:20 +01:00
#ifndef Q_OS_MAC
2016-08-09 01:16:19 +02:00
fileMenu->addSeparator();
fileMenu->addAction(_exitAction);
2015-12-01 23:13:20 +01:00
#endif // Q_OS_MAC
2015-10-05 01:43:48 +02:00
2016-08-09 01:16:19 +02:00
QMenu *mapMenu = menuBar()->addMenu(tr("Map"));
mapMenu->addActions(_mapActions);
mapMenu->addSeparator();
mapMenu->addAction(_clearMapCacheAction);
mapMenu->addSeparator();
mapMenu->addAction(_showMapAction);
2015-11-23 02:37:08 +01:00
2016-09-19 00:56:10 +02:00
QMenu *graphMenu = menuBar()->addMenu(tr("Graph"));
graphMenu->addAction(_distanceGraphAction);
graphMenu->addAction(_timeGraphAction);
graphMenu->addSeparator();
graphMenu->addAction(_showGraphsAction);
2016-08-09 01:16:19 +02:00
QMenu *poiMenu = menuBar()->addMenu(tr("POI"));
_poiFilesMenu = poiMenu->addMenu(tr("POI files"));
_poiFilesMenu->addActions(_poiFilesActions);
2016-08-09 01:16:19 +02:00
poiMenu->addSeparator();
poiMenu->addAction(_openPOIAction);
poiMenu->addAction(_closePOIAction);
poiMenu->addSeparator();
poiMenu->addAction(_showPOILabelsAction);
poiMenu->addAction(_overlapPOIAction);
poiMenu->addSeparator();
poiMenu->addAction(_showPOIAction);
QMenu *dataMenu = menuBar()->addMenu(tr("Data"));
2016-08-09 10:47:49 +02:00
QMenu *displayMenu = dataMenu->addMenu(tr("Display"));
displayMenu->addAction(_showWaypointLabelsAction);
displayMenu->addAction(_showRouteWaypointsAction);
dataMenu->addSeparator();
2016-08-09 01:16:19 +02:00
dataMenu->addAction(_showTracksAction);
dataMenu->addAction(_showRoutesAction);
dataMenu->addAction(_showWaypointsAction);
QMenu *settingsMenu = menuBar()->addMenu(tr("Settings"));
QMenu *unitsMenu = settingsMenu->addMenu(tr("Units"));
unitsMenu->addAction(_metricUnitsAction);
unitsMenu->addAction(_imperialUnitsAction);
settingsMenu->addSeparator();
settingsMenu->addAction(_showToolbarsAction);
settingsMenu->addSeparator();
settingsMenu->addAction(_fullscreenAction);
QMenu *helpMenu = menuBar()->addMenu(tr("Help"));
helpMenu->addAction(_dataSourcesAction);
helpMenu->addAction(_keysAction);
helpMenu->addSeparator();
helpMenu->addAction(_aboutAction);
2015-10-05 01:43:48 +02:00
}
void GUI::createToolBars()
{
2016-05-14 09:28:56 +02:00
#ifdef Q_OS_MAC
setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
#endif // Q_OS_MAC
2015-10-05 01:43:48 +02:00
_fileToolBar = addToolBar(tr("File"));
_fileToolBar->addAction(_openFileAction);
2015-10-20 22:18:41 +02:00
_fileToolBar->addAction(_reloadFileAction);
2015-10-05 01:43:48 +02:00
_fileToolBar->addAction(_closeFileAction);
_fileToolBar->addAction(_printFileAction);
2015-10-05 01:43:48 +02:00
2015-11-23 02:37:08 +01:00
_showToolBar = addToolBar(tr("Show"));
_showToolBar->addAction(_showPOIAction);
_showToolBar->addAction(_showMapAction);
2016-09-19 00:56:10 +02:00
_showToolBar->addAction(_showGraphsAction);
2015-12-18 22:21:11 +01:00
_navigationToolBar = addToolBar(tr("Navigation"));
_navigationToolBar->addAction(_firstAction);
_navigationToolBar->addAction(_prevAction);
_navigationToolBar->addAction(_nextAction);
_navigationToolBar->addAction(_lastAction);
2015-10-05 01:43:48 +02:00
}
void GUI::createPathView()
2015-10-05 01:43:48 +02:00
{
2016-09-26 21:01:58 +02:00
_pathView = new PathView(this);
#ifdef Q_OS_WIN32
_pathView->setFrameShape(QFrame::NoFrame);
#endif // Q_OS_WIN32
2016-10-08 14:53:10 +02:00
_pathView->setPOI(&_poi);
2015-10-05 01:43:48 +02:00
}
void GUI::createGraphTabs()
2015-10-05 01:43:48 +02:00
{
_graphTabWidget = new QTabWidget;
connect(_graphTabWidget, SIGNAL(currentChanged(int)), this,
2015-10-05 01:43:48 +02:00
SLOT(graphChanged(int)));
_graphTabWidget->setFixedHeight(200);
_graphTabWidget->setSizePolicy(
2015-10-05 01:43:48 +02:00
QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
#ifdef Q_OS_WIN32
_graphTabWidget->setDocumentMode(true);
#endif // Q_OS_WIN32
2016-05-13 18:48:42 +02:00
2016-06-24 00:55:44 +02:00
_tabs.append(new ElevationGraph);
_tabs.append(new SpeedGraph);
_tabs.append(new HeartRateGraph);
_tabs.append(new TemperatureGraph);
for (int i = 0; i < _tabs.count(); i++)
connect(_tabs.at(i), SIGNAL(sliderPositionChanged(qreal)), this,
SLOT(sliderPositionChanged(qreal)));
2015-10-05 01:43:48 +02:00
}
void GUI::createStatusBar()
{
2015-10-14 02:54:36 +02:00
_fileNameLabel = new QLabel();
_distanceLabel = new QLabel();
_timeLabel = new QLabel();
_distanceLabel->setAlignment(Qt::AlignHCenter);
_timeLabel->setAlignment(Qt::AlignHCenter);
statusBar()->addPermanentWidget(_fileNameLabel, 8);
statusBar()->addPermanentWidget(_distanceLabel, 1);
statusBar()->addPermanentWidget(_timeLabel, 1);
2015-10-05 01:43:48 +02:00
statusBar()->setSizeGripEnabled(false);
}
void GUI::about()
{
QMessageBox msgBox(this);
msgBox.setWindowTitle(tr("About GPXSee"));
msgBox.setText(QString("<h2>") + QString(APP_NAME) + QString("</h2><p>")
+ QString("<p>") + tr("Version ") + APP_VERSION + QString(" (")
+ CPU_ARCH + QString(", Qt ") + QString(QT_VERSION_STR)
+ QString(")</p>"));
msgBox.setInformativeText(QString("<table width=\"300\"><tr><td>")
+ tr("GPXSee is distributed under the terms of the GNU General Public "
"License version 3. For more info about GPXSee visit the project "
2016-02-07 18:27:50 +01:00
"homepage at ") + QString("<a href=\"" APP_HOMEPAGE "\">" APP_HOMEPAGE
"</a>.</td></tr></table>"));
QIcon icon = msgBox.windowIcon();
QSize size = icon.actualSize(QSize(64, 64));
msgBox.setIconPixmap(icon.pixmap(size));
msgBox.exec();
2015-10-05 01:43:48 +02:00
}
2015-10-21 01:09:17 +02:00
void GUI::keys()
{
QMessageBox msgBox(this);
msgBox.setWindowTitle(tr("Keyboard controls"));
msgBox.setText(QString("<h3>") + tr("Keyboard controls") + QString("</h3>"));
msgBox.setInformativeText(
2016-04-09 09:14:10 +02:00
QString("<div><table width=\"300\"><tr><td>") + tr("Next file")
2015-10-21 01:09:17 +02:00
+ QString("</td><td><i>SPACE</i></td></tr><tr><td>") + tr("Previous file")
+ QString("</td><td><i>BACKSPACE</i></td></tr><tr><td>")
2015-12-18 22:21:11 +01:00
+ tr("First file") + QString("</td><td><i>HOME</i></td></tr><tr><td>")
2016-04-08 22:33:19 +02:00
+ tr("Last file") + QString("</td><td><i>END</i></td></tr><tr><td>")
+ tr("Append modifier") + QString("</td><td><i>SHIFT</i></td></tr>"
"<tr><td></td><td></td></tr><tr><td>")
+ tr("Next map") + QString("</td><td><i>")
+ _nextMapAction->shortcut().toString() + QString("</i></td></tr><tr><td>")
+ tr("Previous map") + QString("</td><td><i>")
+ _prevMapAction->shortcut().toString() + QString("</i></td></tr>"
"</table></div>"));
2015-10-21 01:09:17 +02:00
msgBox.exec();
}
void GUI::dataSources()
{
QMessageBox msgBox(this);
msgBox.setWindowTitle(tr("Data sources"));
msgBox.setText(QString("<h3>") + tr("Data sources") + QString("</h3>"));
msgBox.setInformativeText(
QString("<h4>") + tr("Map sources") + QString("</h4><p>")
+ tr("Map (tiles) source URLs are read on program startup from the "
"following file:")
+ QString("</p><p><code>") + USER_MAP_FILE + QString("</code></p><p>")
2015-12-01 23:38:02 +01:00
+ tr("The file format is one map entry per line, consisting of the map "
"name and tiles URL delimited by a TAB character. The tile X and Y "
"coordinates are replaced with $x and $y in the URL and the zoom "
"level is replaced with $z. An example map file could look like:")
+ QString("</p><p><code>Map1 http://tile.server.com/map/$z/$x/$y.png"
"<br/>Map2 http://mapserver.org/map/$z-$x-$y</code></p>")
+ QString("<h4>") + tr("POIs") + QString("</h4><p>")
+ tr("To make GPXSee load a POI file automatically on startup, add "
"the file to the following directory:")
+ QString("</p><p><code>") + USER_POI_DIR + QString("</code></p>")
);
msgBox.exec();
}
2015-10-05 01:43:48 +02:00
void GUI::openFile()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open file"),
QString(), tr("GPX files (*.gpx);;All files (*)"));
2015-10-05 01:43:48 +02:00
QStringList list = files;
2015-10-07 01:30:03 +02:00
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
2015-10-20 22:18:41 +02:00
openFile(*it);
2015-10-05 01:43:48 +02:00
}
bool GUI::openFile(const QString &fileName)
{
2016-03-23 20:56:39 +01:00
bool ret = true;
2015-10-20 22:18:41 +02:00
if (fileName.isEmpty() || _files.contains(fileName))
return false;
if (loadFile(fileName)) {
_files.append(fileName);
_browser->setCurrent(fileName);
_fileActionGroup->setEnabled(true);
2015-12-18 22:21:11 +01:00
_navigationActionGroup->setEnabled(true);
} else {
2016-03-29 20:58:33 +02:00
if (_files.isEmpty())
_fileActionGroup->setEnabled(false);
2016-03-23 20:56:39 +01:00
ret = false;
}
2016-03-23 20:56:39 +01:00
updateNavigationActions();
updateStatusBarInfo();
2016-04-19 08:51:11 +02:00
updateWindowTitle();
2016-03-23 20:56:39 +01:00
updateGraphTabs();
2016-03-25 09:50:19 +01:00
updateTrackView();
2016-03-23 20:56:39 +01:00
return ret;
2015-10-20 22:18:41 +02:00
}
2015-10-05 01:43:48 +02:00
2015-10-20 22:18:41 +02:00
bool GUI::loadFile(const QString &fileName)
{
GPX gpx;
2016-09-19 00:56:10 +02:00
QList<PathItem*> paths;
2015-10-17 12:08:30 +02:00
2015-10-20 22:18:41 +02:00
if (gpx.loadFile(fileName)) {
2016-09-26 21:01:58 +02:00
paths = _pathView->loadGPX(gpx);
2016-06-24 00:55:44 +02:00
for (int i = 0; i < _tabs.count(); i++)
2016-09-19 00:56:10 +02:00
_tabs.at(i)->loadGPX(gpx, paths);
updateGraphTabs();
2016-09-26 21:01:58 +02:00
_pathView->setHidden(false);
2015-10-17 12:08:30 +02:00
for (int i = 0; i < gpx.tracks().count(); i++) {
_trackDistance += gpx.tracks().at(i)->distance();
_time += gpx.tracks().at(i)->time();
const QDate &date = gpx.tracks().at(i)->date().date();
if (_dateRange.first.isNull() || _dateRange.first > date)
_dateRange.first = date;
if (_dateRange.second.isNull() || _dateRange.second < date)
_dateRange.second = date;
}
_trackCount += gpx.tracks().count();
for (int i = 0; i < gpx.routes().count(); i++)
_routeDistance += gpx.routes().at(i)->distance();
_routeCount += gpx.routes().count();
_waypointCount += gpx.waypoints().count();
2015-10-05 01:43:48 +02:00
2015-10-20 22:18:41 +02:00
return true;
} else {
QString error = fileName + QString("\n\n")
+ tr("Error loading GPX file:\n%1").arg(gpx.errorString())
+ QString("\n");
if (gpx.errorLine())
error.append(tr("Line: %1").arg(gpx.errorLine()));
QMessageBox::critical(this, tr("Error"), error);
2015-10-20 22:18:41 +02:00
return false;
2015-10-05 01:43:48 +02:00
}
}
void GUI::openPOIFile()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open POI file"),
QString(), tr("GPX files (*.gpx);;CSV files (*.csv);;All files (*)"));
QStringList list = files;
2015-10-05 01:43:48 +02:00
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
openPOIFile(*it);
}
bool GUI::openPOIFile(const QString &fileName)
{
if (fileName.isEmpty())
return false;
if (!_poi.loadFile(fileName)) {
QString error = tr("Error loading POI file:\n%1")
.arg(_poi.errorString()) + QString("\n");
if (_poi.errorLine())
error.append(tr("Line: %1").arg(_poi.errorLine()));
QMessageBox::critical(this, tr("Error"), error);
return false;
} else {
2016-10-08 14:53:10 +02:00
_pathView->setPOI(&_poi);
_pathView->showPOI(true);
_showPOIAction->setChecked(true);
QAction *action = createPOIFileAction(_poi.files().indexOf(fileName));
action->setChecked(true);
_poiFilesMenu->addAction(action);
return true;
2015-10-05 01:43:48 +02:00
}
}
void GUI::closePOIFiles()
{
_poiFilesMenu->clear();
for (int i = 0; i < _poiFilesActions.count(); i++)
delete _poiFilesActions[i];
_poiFilesActions.clear();
2016-10-08 14:53:10 +02:00
_pathView->setPOI(0);
_poi.clear();
}
void GUI::printFile()
{
QPrinter printer(QPrinter::HighResolution);
2016-05-24 03:01:22 +02:00
QPrintDialog dialog(&printer, this);
2016-05-24 03:01:22 +02:00
if (dialog.exec() == QDialog::Accepted)
plot(&printer);
}
void GUI::exportFile()
2015-10-05 01:43:48 +02:00
{
QPrinter printer(QPrinter::HighResolution);
2016-05-27 22:45:58 +02:00
printer.setCreator(QString(APP_NAME) + QString(" ") + QString(APP_VERSION));
2016-05-25 23:27:07 +02:00
printer.setOrientation(_exportOrientation);
printer.setOutputFileName(_exportFileName);
printer.setPaperSize(_exportPaperSize);
2016-05-27 22:45:58 +02:00
printer.setPageMargins(_exportMargins.left(), _exportMargins.top(),
_exportMargins.right(), _exportMargins.bottom(), QPrinter::Millimeter);
2016-05-24 03:01:22 +02:00
ExportDialog dialog(&printer, this);
2015-10-05 01:43:48 +02:00
2016-05-25 23:27:07 +02:00
if (dialog.exec() == QDialog::Accepted) {
_exportFileName = printer.outputFileName();
_exportPaperSize = printer.paperSize();
_exportOrientation = printer.orientation();
2016-05-27 22:45:58 +02:00
printer.getPageMargins(&(_exportMargins.rleft()),
&(_exportMargins.rtop()), &(_exportMargins.rright()),
&(_exportMargins.rbottom()), QPrinter::Millimeter);
2016-05-24 03:01:22 +02:00
plot(&printer);
2016-05-25 23:27:07 +02:00
}
}
void GUI::plot(QPrinter *printer)
{
QPainter p(printer);
2016-05-12 09:03:05 +02:00
TrackInfo info;
2016-05-25 23:27:07 +02:00
qreal ih, gh, mh, ratio;
Units units = _imperialUnitsAction->isChecked() ? Imperial : Metric;
qreal d = distance();
qreal t = time();
if (_dateRange.first.isValid()) {
if (_dateRange.first == _dateRange.second) {
QString format = QLocale::system().dateFormat(QLocale::LongFormat);
info.insert(tr("Date"), _dateRange.first.toString(format));
} else {
QString format = QLocale::system().dateFormat(QLocale::ShortFormat);
info.insert(tr("Date"), QString("%1 - %2")
.arg(_dateRange.first.toString(format),
_dateRange.second.toString(format)));
}
}
2016-08-10 08:20:24 +02:00
if (_trackCount > 1)
info.insert(tr("Tracks"), QString::number(_trackCount));
2016-08-10 08:20:24 +02:00
if (_routeCount > 1)
info.insert(tr("Routes"), QString::number(_routeCount));
2016-08-10 08:20:24 +02:00
if (_waypointCount > 2)
info.insert(tr("Waypoints"), QString::number(_waypointCount));
if (d > 0)
info.insert(tr("Distance"), ::distance(d, units));
if (t > 0)
info.insert(tr("Time"), ::timeSpan(t));
2016-05-12 09:03:05 +02:00
2016-05-25 23:27:07 +02:00
ratio = p.paintEngine()->paintDevice()->logicalDpiX() / SCREEN_DPI;
if (info.isEmpty()) {
2016-05-24 03:01:22 +02:00
ih = 0;
mh = 0;
2016-05-21 00:28:06 +02:00
} else {
2016-05-25 23:27:07 +02:00
ih = info.contentSize().height() * ratio;
2016-05-24 03:01:22 +02:00
mh = ih / 2;
2016-05-22 15:47:23 +02:00
info.plot(&p, QRectF(0, 0, printer->width(), ih));
}
if (_graphTabWidget->isVisible()) {
2016-05-24 03:01:22 +02:00
qreal r = (((qreal)(printer)->width()) / (qreal)(printer->height()));
gh = (printer->width() > printer->height())
? 0.15 * r * (printer->height() - ih - 2*mh)
: 0.15 * (printer->height() - ih - 2*mh);
2016-05-25 23:27:07 +02:00
gh = qMax(gh, ratio * 150);
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->currentWidget());
2016-08-09 01:16:19 +02:00
gt->plot(&p, QRectF(0, printer->height() - gh, printer->width(), gh));
2016-05-24 03:01:22 +02:00
} else
gh = 0;
2016-09-26 21:01:58 +02:00
_pathView->plot(&p, QRectF(0, ih + mh, printer->width(), printer->height()
2016-05-24 03:01:22 +02:00
- (ih + 2*mh + gh)));
2015-10-05 01:43:48 +02:00
}
2015-10-20 22:18:41 +02:00
void GUI::reloadFile()
{
_trackCount = 0;
_routeCount = 0;
_waypointCount = 0;
_trackDistance = 0;
_routeDistance = 0;
_time = 0;
_dateRange = DateRange(QDate(), QDate());
2015-10-20 22:18:41 +02:00
2016-06-24 00:55:44 +02:00
for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->clear();
2016-09-26 21:01:58 +02:00
_pathView->clear();
2015-10-20 22:18:41 +02:00
_sliderPos = 0;
2015-10-20 22:18:41 +02:00
for (int i = 0; i < _files.size(); i++) {
if (!loadFile(_files.at(i))) {
_files.removeAt(i);
i--;
}
}
updateStatusBarInfo();
2016-04-19 08:51:11 +02:00
updateWindowTitle();
2016-03-25 09:50:19 +01:00
updateGraphTabs();
updateTrackView();
2015-10-20 22:18:41 +02:00
if (_files.isEmpty())
_fileActionGroup->setEnabled(false);
else
_browser->setCurrent(_files.last());
}
2016-03-23 20:56:39 +01:00
void GUI::closeFiles()
2015-10-05 01:43:48 +02:00
{
_trackCount = 0;
_routeCount = 0;
_waypointCount = 0;
_trackDistance = 0;
_routeDistance = 0;
_time = 0;
_dateRange = DateRange(QDate(), QDate());
2015-10-12 01:12:12 +02:00
2016-03-30 20:50:51 +02:00
_sliderPos = 0;
2016-06-24 00:55:44 +02:00
for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->clear();
2016-09-26 21:01:58 +02:00
_pathView->clear();
2015-10-20 22:18:41 +02:00
_files.clear();
2016-03-23 20:56:39 +01:00
}
void GUI::closeAll()
{
closeFiles();
2015-10-05 01:43:48 +02:00
_fileActionGroup->setEnabled(false);
2015-10-20 22:18:41 +02:00
updateStatusBarInfo();
2016-04-19 08:51:11 +02:00
updateWindowTitle();
2016-03-23 09:38:22 +01:00
updateGraphTabs();
2016-03-25 09:50:19 +01:00
updateTrackView();
2015-10-05 01:43:48 +02:00
}
void GUI::showMap(bool checked)
2015-11-23 02:37:08 +01:00
{
if (checked)
2016-09-26 21:01:58 +02:00
_pathView->setMap(_currentMap);
2015-11-23 02:37:08 +01:00
else
2016-09-26 21:01:58 +02:00
_pathView->setMap(0);
2015-11-23 02:37:08 +01:00
}
2015-10-20 22:18:41 +02:00
void GUI::showGraphs(bool checked)
{
_graphTabWidget->setHidden(!checked);
}
void GUI::showToolbars(bool checked)
{
if (checked) {
addToolBar(_fileToolBar);
addToolBar(_showToolBar);
addToolBar(_navigationToolBar);
_fileToolBar->show();
_showToolBar->show();
2015-12-18 22:21:11 +01:00
_navigationToolBar->show();
} else {
removeToolBar(_fileToolBar);
removeToolBar(_showToolBar);
2015-12-18 22:21:11 +01:00
removeToolBar(_navigationToolBar);
}
}
2016-04-05 09:10:19 +02:00
void GUI::showFullscreen(bool checked)
{
if (checked) {
2016-09-26 21:01:58 +02:00
_frameStyle = _pathView->frameStyle();
2016-04-05 09:10:19 +02:00
_showGraphs = _showGraphsAction->isChecked();
statusBar()->hide();
menuBar()->hide();
showToolbars(false);
showGraphs(false);
_showGraphsAction->setChecked(false);
2016-09-26 21:01:58 +02:00
_pathView->setFrameStyle(QFrame::NoFrame);
2016-04-05 09:10:19 +02:00
showFullScreen();
} else {
statusBar()->show();
menuBar()->show();
if (_showToolbarsAction->isChecked())
showToolbars(true);
_showGraphsAction->setChecked(_showGraphs);
if (_showGraphsAction->isEnabled())
showGraphs(_showGraphs);
2016-09-26 21:01:58 +02:00
_pathView->setFrameStyle(_frameStyle);
2016-04-05 09:10:19 +02:00
showNormal();
}
}
void GUI::showTracks(bool show)
2016-08-09 01:16:19 +02:00
{
2016-09-26 21:01:58 +02:00
_pathView->showTracks(show);
for (int i = 0; i < _tabs.size(); i++)
_tabs.at(i)->showTracks(show);
updateStatusBarInfo();
}
void GUI::showRoutes(bool show)
{
2016-09-26 21:01:58 +02:00
_pathView->showRoutes(show);
for (int i = 0; i < _tabs.size(); i++)
_tabs.at(i)->showRoutes(show);
updateStatusBarInfo();
2016-08-09 01:16:19 +02:00
}
2016-04-01 19:25:34 +02:00
void GUI::clearMapCache()
{
_currentMap->clearCache();
2016-09-26 21:01:58 +02:00
_pathView->redraw();
2016-04-01 19:25:34 +02:00
}
2015-10-20 22:18:41 +02:00
void GUI::updateStatusBarInfo()
2015-10-17 12:08:30 +02:00
{
2016-08-10 21:17:12 +02:00
if (_files.count() == 0)
2016-03-25 09:50:19 +01:00
_fileNameLabel->setText(tr("No GPX files loaded"));
2016-08-10 21:17:12 +02:00
else if (_files.count() == 1)
2015-10-20 22:18:41 +02:00
_fileNameLabel->setText(_files.at(0));
2015-10-17 12:08:30 +02:00
else
_fileNameLabel->setText(tr("%1 files").arg(_files.count()));
2015-10-17 12:08:30 +02:00
2016-08-10 21:17:12 +02:00
qreal d = distance();
2016-07-25 19:32:36 +02:00
Units units = _imperialUnitsAction->isChecked() ? Imperial : Metric;
2016-08-10 21:17:12 +02:00
if (d > 0)
_distanceLabel->setText(::distance(distance(), units));
else
_distanceLabel->clear();
qreal t = time();
if (t > 0)
_timeLabel->setText(::timeSpan(time()));
else
_timeLabel->clear();
2015-10-17 12:08:30 +02:00
}
2016-04-19 08:51:11 +02:00
void GUI::updateWindowTitle()
{
if (_files.count() == 1)
setWindowTitle(QFileInfo(_files.at(0)).fileName()
+ QString(" - " APP_NAME));
else
setWindowTitle(APP_NAME);
}
2015-11-23 02:37:08 +01:00
void GUI::mapChanged(int index)
{
_currentMap = _maps.at(index);
if (_showMapAction->isChecked())
2016-09-26 21:01:58 +02:00
_pathView->setMap(_currentMap);
2015-11-23 02:37:08 +01:00
}
2016-04-08 22:33:19 +02:00
void GUI::nextMap()
{
if (_maps.count() < 2)
return;
int next = (_maps.indexOf(_currentMap) + 1) % _maps.count();
_mapActions.at(next)->setChecked(true);
mapChanged(next);
}
void GUI::prevMap()
{
if (_maps.count() < 2)
return;
int prev = (_maps.indexOf(_currentMap) + _maps.count() - 1) % _maps.count();
_mapActions.at(prev)->setChecked(true);
mapChanged(prev);
}
void GUI::poiFileChecked(int index)
{
_poi.enableFile(_poi.files().at(index),
_poiFilesActions.at(index)->isChecked());
2016-03-19 09:05:40 +01:00
2016-10-08 14:53:10 +02:00
_pathView->setPOI(&_poi);
}
2016-03-30 20:50:51 +02:00
void GUI::sliderPositionChanged(qreal pos)
{
_sliderPos = pos;
}
2015-10-05 01:43:48 +02:00
void GUI::graphChanged(int index)
{
if (index < 0)
return;
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->widget(index));
2016-08-09 01:16:19 +02:00
gt->setSliderPosition(_sliderPos);
2015-10-05 01:43:48 +02:00
}
2015-12-18 22:21:11 +01:00
void GUI::updateNavigationActions()
{
if (_browser->isLast()) {
_nextAction->setEnabled(false);
_lastAction->setEnabled(false);
} else {
_nextAction->setEnabled(true);
_lastAction->setEnabled(true);
}
if (_browser->isFirst()) {
_prevAction->setEnabled(false);
_firstAction->setEnabled(false);
} else {
_prevAction->setEnabled(true);
_firstAction->setEnabled(true);
}
}
2016-03-23 09:38:22 +01:00
void GUI::updateGraphTabs()
{
int index;
2016-06-24 00:55:44 +02:00
GraphTab *tab;
2016-05-13 18:48:42 +02:00
for (int i = 0; i < _tabs.size(); i++) {
2016-06-24 00:55:44 +02:00
tab = _tabs.at(i);
if (!tab->count() && (index = _graphTabWidget->indexOf(tab)) >= 0)
_graphTabWidget->removeTab(index);
2016-03-23 09:38:22 +01:00
}
2016-05-13 18:48:42 +02:00
for (int i = 0; i < _tabs.size(); i++) {
2016-06-24 00:55:44 +02:00
tab = _tabs.at(i);
if (tab->count() && _graphTabWidget->indexOf(tab) < 0)
_graphTabWidget->insertTab(i, tab, _tabs.at(i)->label());
}
if (_graphTabWidget->count()) {
2016-04-05 09:10:19 +02:00
if (_showGraphsAction->isChecked())
_graphTabWidget->setHidden(false);
2016-04-05 09:10:19 +02:00
_showGraphsAction->setEnabled(true);
} else {
_graphTabWidget->setHidden(true);
2016-04-05 09:10:19 +02:00
_showGraphsAction->setEnabled(false);
}
2016-03-23 09:38:22 +01:00
}
2016-03-25 09:50:19 +01:00
void GUI::updateTrackView()
{
2016-09-26 21:01:58 +02:00
_pathView->setHidden(!(_pathView->trackCount() + _pathView->routeCount()
+ _pathView->waypointCount()));
2016-03-25 09:50:19 +01:00
}
2016-09-21 23:48:11 +02:00
void GUI::setUnits(Units units)
2015-12-19 20:23:07 +01:00
{
2016-09-26 21:01:58 +02:00
_pathView->setUnits(units);
2016-06-24 00:55:44 +02:00
for (int i = 0; i <_tabs.count(); i++)
2016-09-21 23:48:11 +02:00
_tabs.at(i)->setUnits(units);
2015-12-19 20:23:07 +01:00
updateStatusBarInfo();
}
2016-09-21 23:48:11 +02:00
void GUI::setGraphType(GraphType type)
2015-12-19 20:23:07 +01:00
{
2016-09-21 23:48:11 +02:00
_sliderPos = 0;
2016-09-19 00:56:10 +02:00
2016-09-21 23:48:11 +02:00
for (int i = 0; i <_tabs.count(); i++) {
_tabs.at(i)->setGraphType(type);
_tabs.at(i)->setSliderPosition(0);
}
2016-09-19 00:56:10 +02:00
}
2015-12-18 22:21:11 +01:00
void GUI::next()
{
QString file = _browser->next();
if (file.isNull())
return;
2016-03-23 20:56:39 +01:00
closeFiles();
2015-12-18 22:21:11 +01:00
openFile(file);
}
void GUI::prev()
{
QString file = _browser->prev();
if (file.isNull())
return;
2016-03-23 20:56:39 +01:00
closeFiles();
2015-12-18 22:21:11 +01:00
openFile(file);
}
void GUI::last()
{
QString file = _browser->last();
if (file.isNull())
return;
2016-03-23 20:56:39 +01:00
closeFiles();
2015-12-18 22:21:11 +01:00
openFile(file);
}
void GUI::first()
{
QString file = _browser->first();
if (file.isNull())
return;
2016-03-23 20:56:39 +01:00
closeFiles();
2015-12-18 22:21:11 +01:00
openFile(file);
}
2015-10-05 01:43:48 +02:00
void GUI::keyPressEvent(QKeyEvent *event)
{
2015-10-20 22:18:41 +02:00
QString file;
2015-10-05 01:43:48 +02:00
2015-12-18 22:21:11 +01:00
switch (event->key()) {
case PREV_KEY:
file = _browser->prev();
break;
case NEXT_KEY:
file = _browser->next();
break;
case FIRST_KEY:
file = _browser->first();
break;
case LAST_KEY:
file = _browser->last();
break;
case Qt::Key_Escape:
if (_fullscreenAction->isChecked()) {
_fullscreenAction->setChecked(false);
showFullscreen(false);
}
break;
2015-12-18 22:21:11 +01:00
}
2015-10-05 01:43:48 +02:00
2015-10-20 22:18:41 +02:00
if (!file.isNull()) {
if (!(event->modifiers() & MODIFIER))
2016-03-23 20:56:39 +01:00
closeFiles();
2015-10-20 22:18:41 +02:00
openFile(file);
}
2015-10-05 01:43:48 +02:00
}
2016-04-26 09:39:16 +02:00
void GUI::closeEvent(QCloseEvent *event)
{
writeSettings();
event->accept();
}
2016-10-04 10:16:46 +02:00
void GUI::dragEnterEvent(QDragEnterEvent *event)
{
if (!event->mimeData()->hasUrls())
return;
if (event->proposedAction() != Qt::CopyAction)
return;
QList<QUrl> urls = event->mimeData()->urls();
for (int i = 0; i < urls.size(); i++)
if (!urls.at(i).isLocalFile())
return;
event->acceptProposedAction();
}
void GUI::dropEvent(QDropEvent *event)
{
QList<QUrl> urls = event->mimeData()->urls();
for (int i = 0; i < urls.size(); i++)
openFile(urls.at(i).toLocalFile());
}
2016-04-26 09:39:16 +02:00
void GUI::writeSettings()
{
2016-04-26 20:55:29 +02:00
QSettings settings(APP_NAME, APP_NAME);
2016-04-26 09:39:16 +02:00
2016-04-28 08:49:06 +02:00
settings.beginGroup(WINDOW_SETTINGS_GROUP);
settings.setValue(WINDOW_SIZE_SETTING, size());
settings.setValue(WINDOW_POS_SETTING, pos());
2016-04-26 09:39:16 +02:00
settings.endGroup();
2016-04-28 08:49:06 +02:00
settings.beginGroup(SETTINGS_SETTINGS_GROUP);
settings.setValue(UNITS_SETTING, _imperialUnitsAction->isChecked()
2016-04-26 09:39:16 +02:00
? Imperial : Metric);
2016-04-28 08:49:06 +02:00
settings.setValue(SHOW_TOOLBARS_SETTING, _showToolbarsAction->isChecked());
2016-04-26 09:39:16 +02:00
settings.endGroup();
2016-04-26 20:55:29 +02:00
2016-04-28 08:49:06 +02:00
settings.beginGroup(MAP_SETTINGS_GROUP);
if (_currentMap)
settings.setValue(CURRENT_MAP_SETTING, _currentMap->name());
settings.setValue(SHOW_MAP_SETTING, _showMapAction->isChecked());
2016-04-26 20:55:29 +02:00
settings.endGroup();
2016-09-19 00:56:10 +02:00
settings.beginGroup(GRAPH_SETTINGS_GROUP);
settings.setValue(SHOW_GRAPHS_SETTING, _showGraphsAction->isChecked());
settings.setValue(GRAPH_TYPE_SETTING, _timeGraphAction->isChecked()
2016-09-19 23:35:04 +02:00
? Time : Distance);
2016-09-19 00:56:10 +02:00
settings.endGroup();
2016-04-28 08:49:06 +02:00
settings.beginGroup(POI_SETTINGS_GROUP);
settings.setValue(SHOW_POI_SETTING, _showPOIAction->isChecked());
settings.setValue(OVERLAP_POI_SETTING, _overlapPOIAction->isChecked());
2016-04-28 08:49:06 +02:00
settings.remove(DISABLED_POI_FILE_SETTINGS_PREFIX);
settings.beginWriteArray(DISABLED_POI_FILE_SETTINGS_PREFIX);
for (int i = 0, j = 0; i < _poiFilesActions.count(); i++) {
if (!_poiFilesActions.at(i)->isChecked()) {
settings.setArrayIndex(j++);
settings.setValue(DISABLED_POI_FILE_SETTING, _poi.files().at(i));
}
}
settings.endArray();
2016-04-26 20:55:29 +02:00
settings.endGroup();
2016-08-09 01:16:19 +02:00
settings.beginGroup(DATA_SETTINGS_GROUP);
settings.setValue(SHOW_TRACKS_SETTING, _showTracksAction->isChecked());
settings.setValue(SHOW_ROUTES_SETTING, _showRoutesAction->isChecked());
settings.setValue(SHOW_WAYPOINTS_SETTING,
_showWaypointsAction->isChecked());
settings.setValue(SHOW_WAYPOINT_LABELS_SETTING,
_showWaypointLabelsAction->isChecked());
2016-08-09 10:47:49 +02:00
settings.setValue(SHOW_ROUTE_WAYPOINTS_SETTING,
_showRouteWaypointsAction->isChecked());
2016-08-09 01:16:19 +02:00
settings.endGroup();
2016-04-26 09:39:16 +02:00
}
void GUI::readSettings()
{
2016-04-26 20:55:29 +02:00
QSettings settings(APP_NAME, APP_NAME);
2016-04-26 09:39:16 +02:00
2016-04-28 08:49:06 +02:00
settings.beginGroup(WINDOW_SETTINGS_GROUP);
resize(settings.value(WINDOW_SIZE_SETTING, QSize(600, 800)).toSize());
move(settings.value(WINDOW_POS_SETTING, QPoint(10, 10)).toPoint());
2016-04-26 09:39:16 +02:00
settings.endGroup();
2016-04-28 08:49:06 +02:00
settings.beginGroup(SETTINGS_SETTINGS_GROUP);
Units u = QLocale::system().measurementSystem() == QLocale::ImperialSystem
? Imperial : Metric;
if (settings.value(UNITS_SETTING, u).toInt() == Imperial) {
2016-04-26 09:39:16 +02:00
setImperialUnits();
_imperialUnitsAction->setChecked(true);
} else
_metricUnitsAction->setChecked(true);
2016-08-09 01:16:19 +02:00
if (settings.value(SHOW_TOOLBARS_SETTING, true).toBool() == false)
2016-04-26 09:39:16 +02:00
showToolbars(false);
2016-08-09 01:16:19 +02:00
else
2016-04-26 09:39:16 +02:00
_showToolbarsAction->setChecked(true);
settings.endGroup();
2016-04-26 20:55:29 +02:00
2016-04-28 08:49:06 +02:00
settings.beginGroup(MAP_SETTINGS_GROUP);
if (settings.value(SHOW_MAP_SETTING, true).toBool() == true)
2016-04-26 20:55:29 +02:00
_showMapAction->setChecked(true);
if (_maps.count()) {
2016-04-28 08:49:06 +02:00
int index = mapIndex(settings.value(CURRENT_MAP_SETTING).toString());
2016-04-26 20:55:29 +02:00
_mapActions.at(index)->setChecked(true);
_currentMap = _maps.at(index);
if (_showMapAction->isChecked())
2016-09-26 21:01:58 +02:00
_pathView->setMap(_currentMap);
2016-04-26 20:55:29 +02:00
} else
_currentMap = 0;
settings.endGroup();
2016-09-19 00:56:10 +02:00
settings.beginGroup(GRAPH_SETTINGS_GROUP);
if (settings.value(SHOW_GRAPHS_SETTING, true).toBool() == false)
showGraphs(false);
else
_showGraphsAction->setChecked(true);
2016-09-19 23:35:04 +02:00
if (settings.value(GRAPH_TYPE_SETTING, Distance).toInt() == Time) {
2016-09-19 00:56:10 +02:00
setTimeGraph();
_timeGraphAction->setChecked(true);
} else
_distanceGraphAction->setChecked(true);
settings.endGroup();
2016-04-28 08:49:06 +02:00
settings.beginGroup(POI_SETTINGS_GROUP);
2016-08-09 01:16:19 +02:00
if (settings.value(OVERLAP_POI_SETTING, true).toBool() == false)
2016-09-26 21:01:58 +02:00
_pathView->setPOIOverlap(false);
2016-08-09 01:16:19 +02:00
else
_overlapPOIAction->setChecked(true);
2016-08-09 01:16:19 +02:00
if (settings.value(LABELS_POI_SETTING, true).toBool() == false)
2016-09-26 21:01:58 +02:00
_pathView->showPOILabels(false);
2016-08-09 01:16:19 +02:00
else
_showPOILabelsAction->setChecked(true);
2016-04-28 08:49:06 +02:00
if (settings.value(SHOW_POI_SETTING, false).toBool() == true)
2016-04-26 20:55:29 +02:00
_showPOIAction->setChecked(true);
2016-10-08 14:53:10 +02:00
else
_pathView->showPOI(false);
2016-04-28 08:49:06 +02:00
for (int i = 0; i < _poiFilesActions.count(); i++)
_poiFilesActions.at(i)->setChecked(true);
int size = settings.beginReadArray(DISABLED_POI_FILE_SETTINGS_PREFIX);
for (int i = 0; i < size; i++) {
settings.setArrayIndex(i);
int index = _poi.files().indexOf(settings.value(
DISABLED_POI_FILE_SETTING).toString());
if (index >= 0) {
_poi.enableFile(_poi.files().at(index), false);
_poiFilesActions.at(index)->setChecked(false);
}
}
settings.endArray();
2016-04-26 20:55:29 +02:00
settings.endGroup();
2016-08-09 01:16:19 +02:00
settings.beginGroup(DATA_SETTINGS_GROUP);
if (settings.value(SHOW_TRACKS_SETTING, true).toBool() == false) {
2016-09-26 21:01:58 +02:00
_pathView->showTracks(false);
for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->showTracks(false);
} else
2016-08-09 01:16:19 +02:00
_showTracksAction->setChecked(true);
if (settings.value(SHOW_ROUTES_SETTING, true).toBool() == false) {
2016-09-26 21:01:58 +02:00
_pathView->showRoutes(false);
for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->showRoutes(false);
} else
2016-08-09 01:16:19 +02:00
_showRoutesAction->setChecked(true);
if (settings.value(SHOW_WAYPOINTS_SETTING, true).toBool() == false)
2016-09-26 21:01:58 +02:00
_pathView->showWaypoints(false);
2016-08-09 01:16:19 +02:00
else
_showWaypointsAction->setChecked(true);
if (settings.value(SHOW_WAYPOINT_LABELS_SETTING, true).toBool() == false)
2016-09-26 21:01:58 +02:00
_pathView->showWaypointLabels(false);
2016-08-09 01:16:19 +02:00
else
_showWaypointLabelsAction->setChecked(true);
2016-08-09 10:47:49 +02:00
if (settings.value(SHOW_ROUTE_WAYPOINTS_SETTING, true).toBool() == false)
2016-09-26 21:01:58 +02:00
_pathView->showRouteWaypoints(false);
2016-08-09 10:47:49 +02:00
else
_showRouteWaypointsAction->setChecked(true);
2016-08-09 01:16:19 +02:00
settings.endGroup();
2016-04-26 20:55:29 +02:00
}
int GUI::mapIndex(const QString &name)
{
for (int i = 0; i < _maps.count(); i++)
if (_maps.at(i)->name() == name)
return i;
return 0;
2016-04-26 09:39:16 +02:00
}
qreal GUI::distance()
{
qreal dist = 0;
if (_showTracksAction->isChecked())
dist += _trackDistance;
if (_showRoutesAction->isChecked())
dist += _routeDistance;
return dist;
}
qreal GUI::time()
{
return (_showTracksAction->isChecked()) ? _time : 0;
}