Newer
Older
#include "QGCMapToolBar.h"
#include "QGCMapWidget.h"
#include "ui_QGCMapToolBar.h"
QGCMapToolBar::QGCMapToolBar(QWidget *parent) :
QWidget(parent),
lm
committed
ui(new Ui::QGCMapToolBar),
lm
committed
optionsMenu(this),
trailPlotMenu(this),
updateTimesMenu(this),
lm
committed
trailSettingsGroup(new QActionGroup(this)),
mapTypesGroup(new QActionGroup(this)),
statusMaxLen(15)
{
ui->setupUi(this);
}
void QGCMapToolBar::setMap(QGCMapWidget* map)
{
this->map = map;
if (map)
{
connect(ui->goToButton, SIGNAL(clicked()), map, SLOT(showGoToDialog()));
connect(ui->goHomeButton, SIGNAL(clicked()), map, SLOT(goHome()));
connect(ui->lastPosButton, SIGNAL(clicked()), map, SLOT(loadSettings()));
connect(ui->clearTrailsButton, SIGNAL(clicked()), map, SLOT(deleteTrails()));
connect(ui->lockCheckBox, SIGNAL(clicked(bool)), map, SLOT(setZoomBlocked(bool)));
connect(map, SIGNAL(OnTileLoadStart()), this, SLOT(tileLoadStart()));
connect(map, SIGNAL(OnTileLoadComplete()), this, SLOT(tileLoadEnd()));
connect(map, SIGNAL(OnTilesStillToLoad(int)), this, SLOT(tileLoadProgress(int)));
connect(ui->ripMapButton, SIGNAL(clicked()), map, SLOT(cacheVisibleRegion()));
ui->followCheckBox->setChecked(map->getFollowUAVEnabled());
connect(ui->followCheckBox, SIGNAL(clicked(bool)), map, SLOT(setFollowUAVEnabled(bool)));
// Edit mode handling
ui->editButton->hide();
lm
committed
const int uavTrailTimeList[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // seconds
const int uavTrailTimeCount = 10;
const int uavTrailDistanceList[] = {1, 2, 5, 10, 20, 50, 100, 200, 500}; // meters
const int uavTrailDistanceCount = 9;
// Set exclusive items
trailSettingsGroup->setExclusive(true);
updateTimesGroup->setExclusive(true);
lm
committed
// Build up menu
trailPlotMenu.setTitle(tr("&Add trail dot every.."));
updateTimesMenu.setTitle(tr("&Limit map view update rate to.."));
lm
committed
//setup the mapTypesMenu
QAction* action;
action = mapTypesMenu.addAction(tr("Bing Hybrid"),this,SLOT(setMapType()));
action->setData(MapType::BingHybrid);
action->setCheckable(true);
#ifdef MAP_DEFAULT_TYPE_BING
action->setChecked(true);
#endif
mapTypesGroup->addAction(action);
action = mapTypesMenu.addAction(tr("Google Hybrid"),this,SLOT(setMapType()));
action->setData(MapType::GoogleHybrid);
action->setCheckable(true);
#ifdef MAP_DEFAULT_TYPE_GOOGLE
action->setChecked(true);
#endif
mapTypesGroup->addAction(action);
action = mapTypesMenu.addAction(tr("OpenStreetMap"),this,SLOT(setMapType()));
action->setData(MapType::OpenStreetMap);
action->setCheckable(true);
#ifdef MAP_DEFAULT_TYPE_OSM
action->setChecked(true);
#endif
optionsMenu.addMenu(&mapTypesMenu);
// FIXME MARK CURRENT VALUES IN MENU
QAction *defaultTrailAction = trailPlotMenu.addAction(tr("No trail"), this, SLOT(setUAVTrailTime()));
defaultTrailAction->setData(-1);
defaultTrailAction->setCheckable(true);
trailSettingsGroup->addAction(defaultTrailAction);
lm
committed
for (int i = 0; i < uavTrailTimeCount; ++i)
{
action = trailPlotMenu.addAction(tr("%1 second%2").arg(uavTrailTimeList[i]).arg((uavTrailTimeList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailTime()));
lm
committed
action->setData(uavTrailTimeList[i]);
action->setCheckable(true);
trailSettingsGroup->addAction(action);
if (static_cast<mapcontrol::UAVTrailType::Types>(map->getTrailType()) == mapcontrol::UAVTrailType::ByTimeElapsed && map->getTrailInterval() == uavTrailTimeList[i])
{
// This is the current active time, set the action checked
action->setChecked(true);
}
lm
committed
}
for (int i = 0; i < uavTrailDistanceCount; ++i)
{
action = trailPlotMenu.addAction(tr("%1 meter%2").arg(uavTrailDistanceList[i]).arg((uavTrailDistanceList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailDistance()));
lm
committed
action->setData(uavTrailDistanceList[i]);
action->setCheckable(true);
trailSettingsGroup->addAction(action);
if (static_cast<mapcontrol::UAVTrailType::Types>(map->getTrailType()) == mapcontrol::UAVTrailType::ByDistance && map->getTrailInterval() == uavTrailDistanceList[i])
{
// This is the current active time, set the action checked
action->setChecked(true);
}
lm
committed
}
// Set no trail checked if no action is checked yet
if (!trailSettingsGroup->checkedAction())
{
lm
committed
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
optionsMenu.addMenu(&trailPlotMenu);
// Add update times menu
for (int i = 100; i < 5000; i+=400)
{
float time = i/1000.0f; // Convert from ms to seconds
QAction* action = updateTimesMenu.addAction(tr("%1 seconds").arg(time), this, SLOT(setUpdateInterval()));
action->setData(time);
action->setCheckable(true);
if (time == map->getUpdateRateLimit())
{
action->blockSignals(true);
action->setChecked(true);
action->blockSignals(false);
}
updateTimesGroup->addAction(action);
}
// If the current time is not part of the menu defaults
// still add it as new option
if (!updateTimesGroup->checkedAction())
{
float time = map->getUpdateRateLimit();
QAction* action = updateTimesMenu.addAction(tr("uptate every %1 seconds").arg(time), this, SLOT(setUpdateInterval()));
action->setData(time);
action->setCheckable(true);
action->setChecked(true);
updateTimesGroup->addAction(action);
}
optionsMenu.addMenu(&updateTimesMenu);
ui->optionsButton->setMenu(&optionsMenu);
}
}
lm
committed
QObject* sender = QObject::sender();
QAction* action = qobject_cast<QAction*>(sender);
lm
committed
if (action)
{
bool ok;
int trailTime = action->data().toInt(&ok);
if (ok)
{
(map->setTrailModeTimed(trailTime));
setStatusLabelText(tr("Trail mode: Every %1 second%2").arg(trailTime).arg((trailTime > 1) ? "s" : ""));
lm
committed
}
}
void QGCMapToolBar::setStatusLabelText(const QString &text)
{
ui->posLabel->setText(text.leftJustified(statusMaxLen, QChar('.'), true));
}
lm
committed
QObject* sender = QObject::sender();
QAction* action = qobject_cast<QAction*>(sender);
lm
committed
if (action)
{
bool ok;
int trailDistance = action->data().toInt(&ok);
if (ok)
{
map->setTrailModeDistance(trailDistance);
setStatusLabelText(tr("Trail mode: Every %1 meter%2").arg(trailDistance).arg((trailDistance == 1) ? "s" : ""));
lm
committed
}
}
}
void QGCMapToolBar::setUpdateInterval()
{
QObject* sender = QObject::sender();
QAction* action = qobject_cast<QAction*>(sender);
if (action)
{
bool ok;
float time = action->data().toFloat(&ok);
if (ok)
{
map->setUpdateRateLimit(time);
setStatusLabelText(tr("Limit: %1 second%2").arg(time).arg((time != 1.0f) ? "s" : ""));
}
lm
committed
}
void QGCMapToolBar::setMapType()
{
QObject* sender = QObject::sender();
QAction* action = qobject_cast<QAction*>(sender);
if (action)
{
bool ok;
int mapType = action->data().toInt(&ok);
if (ok)
{
map->SetMapType((MapType::Types)mapType);
setStatusLabelText(tr("Map: %1").arg(mapType));
void QGCMapToolBar::tileLoadStart()
{
setStatusLabelText(tr("Loading"));
}
void QGCMapToolBar::tileLoadEnd()
{
setStatusLabelText(tr("Finished"));
}
void QGCMapToolBar::tileLoadProgress(int progress)
{
if (progress == 1)
{
setStatusLabelText(tr("1 tile"));
}
else if (progress > 0)
{
setStatusLabelText(tr("%1 tile").arg(progress));
}
else
{
tileLoadEnd();
QGCMapToolBar::~QGCMapToolBar()
{
delete ui;
lm
committed
delete trailSettingsGroup;
delete updateTimesGroup;
lm
committed
// FIXME Delete all actions