QGCMapToolBar.cc 8.37 KB
Newer Older
1 2 3 4 5 6
#include "QGCMapToolBar.h"
#include "QGCMapWidget.h"
#include "ui_QGCMapToolBar.h"

QGCMapToolBar::QGCMapToolBar(QWidget *parent) :
    QWidget(parent),
7
    ui(new Ui::QGCMapToolBar),
8
    map(NULL),
9 10 11
    optionsMenu(this),
    trailPlotMenu(this),
    updateTimesMenu(this),
Don Gagne's avatar
Don Gagne committed
12
    mapTypesMenu(this),
13
    trailSettingsGroup(new QActionGroup(this)),
Don Gagne's avatar
Don Gagne committed
14 15
    updateTimesGroup(new QActionGroup(this)),
    mapTypesGroup(new QActionGroup(this))
16 17 18 19 20 21 22 23 24 25 26 27
{
    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()));
28
        connect(ui->lastPosButton, SIGNAL(clicked()), map, SLOT(loadSettings()));
lm's avatar
lm committed
29
        connect(ui->clearTrailsButton, SIGNAL(clicked()), map, SLOT(deleteTrails()));
30 31 32 33 34 35 36 37 38 39
        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's avatar
LM committed
40

41 42 43 44 45 46 47 48 49
        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);
50
        mapTypesGroup->setExclusive(true);
51 52 53 54

        // Build up menu
        trailPlotMenu.setTitle(tr("&Add trail dot every.."));
        updateTimesMenu.setTitle(tr("&Limit map view update rate to.."));
55
        mapTypesMenu.setTitle(tr("&Map type"));
56

57 58 59 60 61 62

        //setup the mapTypesMenu
        QAction* action;
        action =  mapTypesMenu.addAction(tr("Bing Hybrid"),this,SLOT(setMapType()));
        action->setData(MapType::BingHybrid);
        action->setCheckable(true);
63 64 65
#ifdef MAP_DEFAULT_TYPE_BING
        action->setChecked(true);
#endif
66 67 68 69 70
        mapTypesGroup->addAction(action);

        action =  mapTypesMenu.addAction(tr("Google Hybrid"),this,SLOT(setMapType()));
        action->setData(MapType::GoogleHybrid);
        action->setCheckable(true);
71 72 73
#ifdef MAP_DEFAULT_TYPE_GOOGLE
        action->setChecked(true);
#endif
74 75 76 77
        mapTypesGroup->addAction(action);

        action =  mapTypesMenu.addAction(tr("OpenStreetMap"),this,SLOT(setMapType()));
        action->setData(MapType::OpenStreetMap);
78
        action->setCheckable(true);
79 80 81
#ifdef MAP_DEFAULT_TYPE_OSM
        action->setChecked(true);
#endif
82
        mapTypesGroup->addAction(action);
83

84 85 86 87 88 89 90 91
        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);
92 93 94

        for (int i = 0; i < uavTrailTimeCount; ++i)
        {
95
            action = trailPlotMenu.addAction(tr("%1 second%2").arg(uavTrailTimeList[i]).arg((uavTrailTimeList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailTime()));
96 97 98
            action->setData(uavTrailTimeList[i]);
            action->setCheckable(true);
            trailSettingsGroup->addAction(action);
99 100 101 102 103
            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);
            }
104 105 106
        }
        for (int i = 0; i < uavTrailDistanceCount; ++i)
        {
107
            action = trailPlotMenu.addAction(tr("%1 meter%2").arg(uavTrailDistanceList[i]).arg((uavTrailDistanceList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailDistance()));
108 109 110
            action->setData(uavTrailDistanceList[i]);
            action->setCheckable(true);
            trailSettingsGroup->addAction(action);
111 112 113 114 115
            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);
            }
116
        }
117 118 119 120

        // Set no trail checked if no action is checked yet
        if (!trailSettingsGroup->checkedAction())
        {
121
            defaultTrailAction->setChecked(true);
122 123
        }

124 125 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
        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);
156 157 158
    }
}

LM's avatar
LM committed
159 160
void QGCMapToolBar::setUAVTrailTime()
{
161 162
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
163

164 165 166 167 168 169 170 171 172 173
    if (action)
    {
        bool ok;
        int trailTime = action->data().toInt(&ok);
        if (ok)
        {
            (map->setTrailModeTimed(trailTime));
            ui->posLabel->setText(tr("Trail mode: Every %1 second%2").arg(trailTime).arg((trailTime > 1) ? "s" : ""));
        }
    }
LM's avatar
LM committed
174 175 176 177
}

void QGCMapToolBar::setUAVTrailDistance()
{
178 179
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
180

181 182 183 184 185 186 187
    if (action)
    {
        bool ok;
        int trailDistance = action->data().toInt(&ok);
        if (ok)
        {
            map->setTrailModeDistance(trailDistance);
188
            ui->posLabel->setText(tr("Trail mode: Every %1 meter%2").arg(trailDistance).arg((trailDistance == 1) ? "s" : ""));
189 190 191 192 193 194 195 196 197 198 199 200 201
        }
    }
}

void QGCMapToolBar::setUpdateInterval()
{
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);

    if (action)
    {
        bool ok;
        float time = action->data().toFloat(&ok);
202 203 204
        if (ok)
        {
            map->setUpdateRateLimit(time);
205
            ui->posLabel->setText(tr("Limit: %1 second%2").arg(time).arg((time != 1.0f) ? "s" : ""));
206
        }
207
    }
LM's avatar
LM committed
208 209
}

210 211 212 213 214 215 216 217 218 219 220 221
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);
222
            ui->posLabel->setText(tr("Map: %1").arg(mapType));
223 224 225 226
        }
    }
}

227 228
void QGCMapToolBar::tileLoadStart()
{
229
    ui->posLabel->setText(tr("Loading.."));
230 231 232 233
}

void QGCMapToolBar::tileLoadEnd()
{
234
    ui->posLabel->setText(tr("Finished"));
235 236 237 238 239 240
}

void QGCMapToolBar::tileLoadProgress(int progress)
{
    if (progress == 1)
    {
241
        ui->posLabel->setText(tr("1 tile"));
242 243 244
    }
    else if (progress > 0)
    {
245
        ui->posLabel->setText(tr("%1 tile").arg(progress));
246 247 248 249
    }
    else
    {
        tileLoadEnd();
250 251 252
    }
}

253

254 255 256
QGCMapToolBar::~QGCMapToolBar()
{
    delete ui;
257 258
    delete trailSettingsGroup;
    delete updateTimesGroup;
259
    delete mapTypesGroup;
260
    // FIXME Delete all actions
261
}