QGCMapToolBar.cc 8.25 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
    optionsMenu(this),
10
    mapTypesMenu(this),
11 12
    trailPlotMenu(this),
    updateTimesMenu(this),
13
    mapTypesGroup(new QActionGroup(this)),
14 15
    trailSettingsGroup(new QActionGroup(this)),
    updateTimesGroup(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 63 64 65 66 67 68 69 70 71

        //setup the mapTypesMenu
        QAction* action;
        action =  mapTypesMenu.addAction(tr("Bing Hybrid"),this,SLOT(setMapType()));
        action->setData(MapType::BingHybrid);
        action->setCheckable(true);
        mapTypesGroup->addAction(action);

        action =  mapTypesMenu.addAction(tr("Google Hybrid"),this,SLOT(setMapType()));
        action->setData(MapType::GoogleHybrid);
        action->setCheckable(true);
        mapTypesGroup->addAction(action);

        action =  mapTypesMenu.addAction(tr("OpenStreetMap"),this,SLOT(setMapType()));
        action->setData(MapType::OpenStreetMap);
72
        action->setCheckable(true);
73 74 75 76 77 78 79 80 81 82
        mapTypesGroup->addAction(action);
        //TODO check current item
        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);
83 84 85

        for (int i = 0; i < uavTrailTimeCount; ++i)
        {
86
            action = trailPlotMenu.addAction(tr("%1 second%2").arg(uavTrailTimeList[i]).arg((uavTrailTimeList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailTime()));
87 88 89
            action->setData(uavTrailTimeList[i]);
            action->setCheckable(true);
            trailSettingsGroup->addAction(action);
90 91 92 93 94
            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);
            }
95 96 97
        }
        for (int i = 0; i < uavTrailDistanceCount; ++i)
        {
98
            action = trailPlotMenu.addAction(tr("%1 meter%2").arg(uavTrailDistanceList[i]).arg((uavTrailDistanceList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailDistance()));
99 100 101
            action->setData(uavTrailDistanceList[i]);
            action->setCheckable(true);
            trailSettingsGroup->addAction(action);
102 103 104 105 106
            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);
            }
107
        }
108 109 110 111

        // Set no trail checked if no action is checked yet
        if (!trailSettingsGroup->checkedAction())
        {
112
            defaultTrailAction->setChecked(true);
113 114
        }

115 116 117 118 119 120 121 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
        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);
147 148 149
    }
}

LM's avatar
LM committed
150 151
void QGCMapToolBar::setUAVTrailTime()
{
152 153
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
154

155 156 157 158 159 160 161 162 163 164
    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
165 166 167 168
}

void QGCMapToolBar::setUAVTrailDistance()
{
169 170
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
171

172 173 174 175 176 177 178
    if (action)
    {
        bool ok;
        int trailDistance = action->data().toInt(&ok);
        if (ok)
        {
            map->setTrailModeDistance(trailDistance);
179
            ui->posLabel->setText(tr("Trail mode: Every %1 meter%2").arg(trailDistance).arg((trailDistance == 1) ? "s" : ""));
180 181 182 183 184 185 186 187 188 189 190 191 192
        }
    }
}

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

    if (action)
    {
        bool ok;
        float time = action->data().toFloat(&ok);
193 194 195 196 197
        if (ok)
        {
            map->setUpdateRateLimit(time);
            ui->posLabel->setText(tr("Map update rate limit: %1 second%2").arg(time).arg((time != 1.0f) ? "s" : ""));
        }
198
    }
LM's avatar
LM committed
199 200
}

201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
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);
            ui->posLabel->setText(tr("Map type: %1").arg(mapType));
        }
    }
}

218 219
void QGCMapToolBar::tileLoadStart()
{
220
    ui->posLabel->setText(tr("Starting to load tiles.."));
221 222 223 224
}

void QGCMapToolBar::tileLoadEnd()
{
225
    ui->posLabel->setText(tr("Finished"));
226 227 228 229 230 231
}

void QGCMapToolBar::tileLoadProgress(int progress)
{
    if (progress == 1)
    {
232
        ui->posLabel->setText(tr("1 tile to load.."));
233 234 235
    }
    else if (progress > 0)
    {
236
        ui->posLabel->setText(tr("%1 tiles to load..").arg(progress));
237 238 239 240
    }
    else
    {
        tileLoadEnd();
241 242 243
    }
}

244

245 246 247
QGCMapToolBar::~QGCMapToolBar()
{
    delete ui;
248 249
    delete trailSettingsGroup;
    delete updateTimesGroup;
250
    delete mapTypesGroup;
251
    // FIXME Delete all actions
252
}