QGCMapToolBar.cc 6.81 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 12 13
    optionsMenu(this),
    trailPlotMenu(this),
    updateTimesMenu(this),
    trailSettingsGroup(new QActionGroup(this)),
    updateTimesGroup(new QActionGroup(this))
14 15 16 17 18 19 20 21 22 23 24 25
{
    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()));
26
        connect(ui->lastPosButton, SIGNAL(clicked()), map, SLOT(loadSettings()));
27 28 29 30 31 32 33 34 35 36
        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
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
        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);


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

        // FIXME MARK CURRENT VALUES IN MENU
54 55 56 57
        QAction* action = trailPlotMenu.addAction(tr("No trail"), this, SLOT(setUAVTrailTime()));
        action->setData(-1);
        action->setCheckable(true);
        trailSettingsGroup->addAction(action);
58 59 60 61 62 63 64

        for (int i = 0; i < uavTrailTimeCount; ++i)
        {
            QAction* action = trailPlotMenu.addAction(tr("%1 second%2").arg(uavTrailTimeList[i]).arg((uavTrailTimeList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailTime()));
            action->setData(uavTrailTimeList[i]);
            action->setCheckable(true);
            trailSettingsGroup->addAction(action);
65 66 67 68 69
            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);
            }
70 71 72 73 74 75 76
        }
        for (int i = 0; i < uavTrailDistanceCount; ++i)
        {
            QAction* action = trailPlotMenu.addAction(tr("%1 meter%2").arg(uavTrailDistanceList[i]).arg((uavTrailDistanceList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailDistance()));
            action->setData(uavTrailDistanceList[i]);
            action->setCheckable(true);
            trailSettingsGroup->addAction(action);
77 78 79 80 81
            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);
            }
82
        }
83 84 85 86 87 88 89

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

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
        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);
123 124 125
    }
}

LM's avatar
LM committed
126 127
void QGCMapToolBar::setUAVTrailTime()
{
128 129
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
130

131 132 133 134 135 136 137 138 139 140
    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
141 142 143 144
}

void QGCMapToolBar::setUAVTrailDistance()
{
145 146
    QObject* sender = QObject::sender();
    QAction* action = qobject_cast<QAction*>(sender);
LM's avatar
LM committed
147

148 149 150 151 152 153 154
    if (action)
    {
        bool ok;
        int trailDistance = action->data().toInt(&ok);
        if (ok)
        {
            map->setTrailModeDistance(trailDistance);
155
            ui->posLabel->setText(tr("Trail mode: Every %1 meter%2").arg(trailDistance).arg((trailDistance == 1) ? "s" : ""));
156 157 158 159 160 161 162 163 164 165 166 167 168
        }
    }
}

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

    if (action)
    {
        bool ok;
        float time = action->data().toFloat(&ok);
169 170 171 172 173
        if (ok)
        {
            map->setUpdateRateLimit(time);
            ui->posLabel->setText(tr("Map update rate limit: %1 second%2").arg(time).arg((time != 1.0f) ? "s" : ""));
        }
174
    }
LM's avatar
LM committed
175 176
}

177 178
void QGCMapToolBar::tileLoadStart()
{
179
    ui->posLabel->setText(tr("Starting to load tiles.."));
180 181 182 183
}

void QGCMapToolBar::tileLoadEnd()
{
184
    ui->posLabel->setText(tr("Finished"));
185 186 187 188 189 190
}

void QGCMapToolBar::tileLoadProgress(int progress)
{
    if (progress == 1)
    {
191
        ui->posLabel->setText(tr("1 tile to load.."));
192 193 194
    }
    else if (progress > 0)
    {
195
        ui->posLabel->setText(tr("%1 tiles to load..").arg(progress));
196 197 198 199
    }
    else
    {
        tileLoadEnd();
200 201 202 203 204 205
    }
}

QGCMapToolBar::~QGCMapToolBar()
{
    delete ui;
206 207 208
    delete trailSettingsGroup;
    delete updateTimesGroup;
    // FIXME Delete all actions
209
}