QGCMapToolBar.cc 8.59 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
    updateTimesGroup(new QActionGroup(this)),
15 16
    mapTypesGroup(new QActionGroup(this)),
    statusMaxLen(15)
17 18 19 20 21 22 23 24 25 26 27 28
{
    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()));
29
        connect(ui->lastPosButton, SIGNAL(clicked()), map, SLOT(loadSettings()));
lm's avatar
lm committed
30
        connect(ui->clearTrailsButton, SIGNAL(clicked()), map, SLOT(deleteTrails()));
31
        connect(ui->lockCheckBox, SIGNAL(clicked(bool)), map, SLOT(setZoomBlocked(bool)));
32 33 34 35 36 37 38 39 40 41
        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
42

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

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

59 60 61 62 63 64

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

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

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

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

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

        // Set no trail checked if no action is checked yet
        if (!trailSettingsGroup->checkedAction())
        {
123
            defaultTrailAction->setChecked(true);
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 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);
158 159 160
    }
}

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

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

178 179 180 181 182
void QGCMapToolBar::setStatusLabelText(const QString &text)
{
    ui->posLabel->setText(text.leftJustified(statusMaxLen, QChar('.'), true));
}

LM's avatar
LM committed
183 184
void QGCMapToolBar::setUAVTrailDistance()
{
185 186
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
187

188 189 190 191 192 193 194
    if (action)
    {
        bool ok;
        int trailDistance = action->data().toInt(&ok);
        if (ok)
        {
            map->setTrailModeDistance(trailDistance);
195
            setStatusLabelText(tr("Trail mode: Every %1 meter%2").arg(trailDistance).arg((trailDistance == 1) ? "s" : ""));
196 197 198 199 200 201 202 203 204 205 206 207 208
        }
    }
}

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

    if (action)
    {
        bool ok;
        float time = action->data().toFloat(&ok);
209 210 211
        if (ok)
        {
            map->setUpdateRateLimit(time);
212
            setStatusLabelText(tr("Limit: %1 second%2").arg(time).arg((time != 1.0f) ? "s" : ""));
213
        }
214
    }
LM's avatar
LM committed
215 216
}

217 218 219 220 221 222 223 224 225 226 227 228
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);
229
            setStatusLabelText(tr("Map: %1").arg(mapType));
230 231 232 233
        }
    }
}

234 235
void QGCMapToolBar::tileLoadStart()
{
236
    setStatusLabelText(tr("Loading"));
237 238 239 240
}

void QGCMapToolBar::tileLoadEnd()
{
241
    setStatusLabelText(tr("Finished"));
242 243 244 245 246 247
}

void QGCMapToolBar::tileLoadProgress(int progress)
{
    if (progress == 1)
    {
248
        setStatusLabelText(tr("1 tile"));
249 250 251
    }
    else if (progress > 0)
    {
252
        setStatusLabelText(tr("%1 tile").arg(progress));
253 254 255 256
    }
    else
    {
        tileLoadEnd();
257 258 259
    }
}

260

261 262 263
QGCMapToolBar::~QGCMapToolBar()
{
    delete ui;
264 265
    delete trailSettingsGroup;
    delete updateTimesGroup;
266
    delete mapTypesGroup;
267
    // FIXME Delete all actions
268
}