WaypointEditableView.cc 24.8 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
/*===================================================================
pixhawk's avatar
pixhawk committed
2 3 4 5 6 7 8 9
======================================================================*/

/**
 * @file
 *   @brief Displays one waypoint
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *   @author Benjamin Knecht <mavteam@student.ethz.ch>
10
 *   @author Petri Tanskanen <mavteam@student.ethz.ch>
pixhawk's avatar
pixhawk committed
11 12 13 14 15 16
 *
 */

#include <QDoubleSpinBox>
#include <QDebug>

17 18
#include <cmath>
#include <qmath.h>
pixhawk's avatar
pixhawk committed
19

20 21
#include "WaypointEditableView.h"
#include "ui_WaypointEditableView.h"
22
#include "ui_QGCCustomWaypointAction.h"
pixhawk's avatar
pixhawk committed
23

24
WaypointEditableView::WaypointEditableView(Waypoint* wp, QWidget* parent) :
25 26
    QWidget(parent),
    customCommand(new Ui_QGCCustomWaypointAction),
27 28
    viewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_NAV),
    m_ui(new Ui::WaypointEditableView)
pixhawk's avatar
pixhawk committed
29 30 31 32
{
    m_ui->setupUi(this);

    this->wp = wp;
pixhawk's avatar
pixhawk committed
33
    connect(wp, SIGNAL(destroyed(QObject*)), this, SLOT(deleted(QObject*)));
34

35 36 37
    // CUSTOM COMMAND WIDGET
    customCommand->setupUi(m_ui->customActionWidget);

38
    // add actions
39 40 41 42 43 44 45
    m_ui->comboBox_action->addItem(tr("NAV: Waypoint"),MAV_CMD_NAV_WAYPOINT);
    m_ui->comboBox_action->addItem(tr("NAV: TakeOff"),MAV_CMD_NAV_TAKEOFF);
    m_ui->comboBox_action->addItem(tr("NAV: Loiter Unlim."),MAV_CMD_NAV_LOITER_UNLIM);
    m_ui->comboBox_action->addItem(tr("NAV: Loiter Time"),MAV_CMD_NAV_LOITER_TIME);
    m_ui->comboBox_action->addItem(tr("NAV: Loiter Turns"),MAV_CMD_NAV_LOITER_TURNS);
    m_ui->comboBox_action->addItem(tr("NAV: Ret. to Launch"),MAV_CMD_NAV_RETURN_TO_LAUNCH);
    m_ui->comboBox_action->addItem(tr("NAV: Land"),MAV_CMD_NAV_LAND);
lm's avatar
lm committed
46 47 48 49
//    m_ui->comboBox_action->addItem(tr("NAV: Target"),MAV_CMD_NAV_TARGET);
    //m_ui->comboBox_action->addItem(tr("IF: Delay over"),MAV_CMD_CONDITION_DELAY);
    //m_ui->comboBox_action->addItem(tr("IF: Yaw angle is"),MAV_CMD_CONDITION_YAW);
    //m_ui->comboBox_action->addItem(tr("DO: Jump to Index"),MAV_CMD_DO_JUMP);
50
    m_ui->comboBox_action->addItem(tr("Other"), MAV_CMD_ENUM_END);
51

52
    // add frames
53 54
    m_ui->comboBox_frame->addItem("Abs. Alt/Global",MAV_FRAME_GLOBAL);
    m_ui->comboBox_frame->addItem("Rel. Alt/Global", MAV_FRAME_GLOBAL_RELATIVE_ALT);
55
    m_ui->comboBox_frame->addItem("Local/Abs. Alt.",MAV_FRAME_LOCAL_NED);
56 57 58 59 60
    m_ui->comboBox_frame->addItem("Mission",MAV_FRAME_MISSION);

    // Initialize view correctly
    updateActionView(wp->getAction());
    updateFrameView(wp->getFrame());
61

pixhawk's avatar
pixhawk committed
62
    // Read values and set user interface
63
    updateValues();
pixhawk's avatar
pixhawk committed
64

65
    // Check for mission frame
66 67
    if (wp->getFrame() == MAV_FRAME_MISSION)
    {
68 69 70
        m_ui->comboBox_action->setCurrentIndex(m_ui->comboBox_action->count()-1);
    }

71 72 73 74
    connect(m_ui->posNSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setX(double)));
    connect(m_ui->posESpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setY(double)));
    connect(m_ui->posDSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setZ(double)));

75 76 77
    connect(m_ui->latSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setLatitude(double)));
    connect(m_ui->lonSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setLongitude(double)));
    connect(m_ui->altSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setAltitude(double)));
lm's avatar
lm committed
78
    connect(m_ui->yawSpinBox, SIGNAL(valueChanged(int)), wp, SLOT(setYaw(int)));
pixhawk's avatar
pixhawk committed
79 80 81 82 83

    connect(m_ui->upButton, SIGNAL(clicked()), this, SLOT(moveUp()));
    connect(m_ui->downButton, SIGNAL(clicked()), this, SLOT(moveDown()));
    connect(m_ui->removeButton, SIGNAL(clicked()), this, SLOT(remove()));

pixhawk's avatar
pixhawk committed
84 85
    connect(m_ui->autoContinue, SIGNAL(stateChanged(int)), this, SLOT(changedAutoContinue(int)));
    connect(m_ui->selectedBox, SIGNAL(stateChanged(int)), this, SLOT(changedCurrent(int)));
86 87
    connect(m_ui->comboBox_action, SIGNAL(activated(int)), this, SLOT(changedAction(int)));
    connect(m_ui->comboBox_frame, SIGNAL(activated(int)), this, SLOT(changedFrame(int)));
pixhawk's avatar
pixhawk committed
88

89 90
    connect(m_ui->orbitSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setLoiterOrbit(double)));
    connect(m_ui->acceptanceSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setAcceptanceRadius(double)));
lm's avatar
lm committed
91
    connect(m_ui->holdTimeSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setHoldTime(double)));
92
    connect(m_ui->turnsSpinBox, SIGNAL(valueChanged(int)), wp, SLOT(setTurns(int)));
93
    connect(m_ui->takeOffAngleSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam1(double)));
94 95 96 97 98 99 100

    // Connect actions
    connect(customCommand->commandSpinBox, SIGNAL(valueChanged(int)),   wp, SLOT(setAction(int)));
    connect(customCommand->param1SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam1(double)));
    connect(customCommand->param2SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam2(double)));
    connect(customCommand->param3SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam3(double)));
    connect(customCommand->param4SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam4(double)));
101 102
    connect(customCommand->param5SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam5(double)));
    connect(customCommand->param6SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam6(double)));
lm's avatar
lm committed
103
    connect(customCommand->param7SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam7(double)));
pixhawk's avatar
pixhawk committed
104 105
}

106
void WaypointEditableView::moveUp()
pixhawk's avatar
pixhawk committed
107 108 109 110
{
    emit moveUpWaypoint(wp);
}

111
void WaypointEditableView::moveDown()
pixhawk's avatar
pixhawk committed
112 113 114 115
{
    emit moveDownWaypoint(wp);
}

Alejandro's avatar
Alejandro committed
116

117
void WaypointEditableView::remove()
pixhawk's avatar
pixhawk committed
118 119
{
    emit removeWaypoint(wp);
120
    deleteLater();
pixhawk's avatar
pixhawk committed
121 122
}

123
void WaypointEditableView::changedAutoContinue(int state)
pixhawk's avatar
pixhawk committed
124 125
{
    if (state == 0)
126
        wp->setAutocontinue(false);
pixhawk's avatar
pixhawk committed
127
    else
128
        wp->setAutocontinue(true);
pixhawk's avatar
pixhawk committed
129 130
}

131
void WaypointEditableView::updateActionView(int action)
132
{
133 134
    // Remove stretch item at index 17 (m_ui->removeSpacer)
    m_ui->horizontalLayout->takeAt(17);
135
    // expose ui based on action
136

137
    switch(action) {
138
    case MAV_CMD_NAV_TAKEOFF:
139 140 141 142 143 144 145
        m_ui->orbitSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
146
        m_ui->horizontalLayout->insertStretch(17, 82);
147 148
        m_ui->takeOffAngleSpinBox->show();
        break;
149
    case MAV_CMD_NAV_LAND:
150 151 152 153 154 155 156 157
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
158
        m_ui->horizontalLayout->insertStretch(17, 26);
159
        break;
160
    case MAV_CMD_NAV_RETURN_TO_LAUNCH:
161 162 163 164 165 166 167 168
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
169
        m_ui->horizontalLayout->insertStretch(17, 26);
170
        break;
171
    case MAV_CMD_NAV_WAYPOINT:
172 173 174
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->turnsSpinBox->hide();
lm's avatar
lm committed
175
        m_ui->holdTimeSpinBox->show();
176
        m_ui->customActionWidget->hide();
177
        m_ui->horizontalLayout->insertStretch(17, 1);
178

179
        m_ui->autoContinue->show();
180 181
        m_ui->acceptanceSpinBox->show();
        m_ui->yawSpinBox->show();
182
        break;
183
    case MAV_CMD_NAV_LOITER_UNLIM:
184 185 186 187 188 189 190
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
191
        m_ui->horizontalLayout->insertStretch(17, 25);
192 193
        m_ui->orbitSpinBox->show();
        break;
194
    case MAV_CMD_NAV_LOITER_TURNS:
195 196 197 198 199 200
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
201
        m_ui->horizontalLayout->insertStretch(17, 20);
202 203 204
        m_ui->orbitSpinBox->show();
        m_ui->turnsSpinBox->show();
        break;
205
    case MAV_CMD_NAV_LOITER_TIME:
206 207 208 209 210 211
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
212
        m_ui->horizontalLayout->insertStretch(17, 20);
213 214 215
        m_ui->orbitSpinBox->show();
        m_ui->holdTimeSpinBox->show();
        break;
LM's avatar
LM committed
216 217 218 219 220 221 222 223 224 225 226
//    case MAV_CMD_NAV_ORIENTATION_TARGET:
//        m_ui->orbitSpinBox->hide();
//        m_ui->takeOffAngleSpinBox->hide();
//        m_ui->turnsSpinBox->hide();
//        m_ui->holdTimeSpinBox->show();
//        m_ui->customActionWidget->hide();

//        m_ui->autoContinue->show();
//        m_ui->acceptanceSpinBox->hide();
//        m_ui->yawSpinBox->hide();
//        break;
227
    default:
228
        break;
229 230 231
    }
}

232 233 234
/**
 * @param index The index of the combo box of the action entry, NOT the action ID
 */
235
void WaypointEditableView::changedAction(int index)
236 237
{
    // set waypoint action
238
    int actionIndex = m_ui->comboBox_action->itemData(index).toUInt();
239
    if (actionIndex < MAV_CMD_ENUM_END && actionIndex >= 0) {
240
        MAV_CMD action = (MAV_CMD) actionIndex;
241 242 243 244 245 246 247
        wp->setAction(action);
    }

    // Expose ui based on action
    // Change to mission frame
    // if action is unknown

248
    switch(actionIndex) {
249 250 251 252 253 254 255
    case MAV_CMD_NAV_TAKEOFF:
    case MAV_CMD_NAV_LAND:
    case MAV_CMD_NAV_RETURN_TO_LAUNCH:
    case MAV_CMD_NAV_WAYPOINT:
    case MAV_CMD_NAV_LOITER_UNLIM:
    case MAV_CMD_NAV_LOITER_TURNS:
    case MAV_CMD_NAV_LOITER_TIME:
256
        changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_NAV);
257 258
        // Update frame view
        updateFrameView(m_ui->comboBox_frame->currentIndex());
259 260
        // Update view
        updateActionView(actionIndex);
261
        break;
262
    case MAV_CMD_ENUM_END:
263 264
    default:
        // Switch to mission frame
265
        changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING);
266 267 268
        break;
    }
}
269

270
void WaypointEditableView::changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE mode)
271
{
lm's avatar
lm committed
272
    viewMode = mode;
273
    switch (mode) {
274 275
    case QGC_WAYPOINTEDITABLEVIEW_MODE_NAV:
    case QGC_WAYPOINTEDITABLEVIEW_MODE_CONDITION:
276 277
        // Hide everything, show condition widget
        // TODO
278
    case QGC_WAYPOINTEDITABLEVIEW_MODE_DO:
279

280
        break;
281
    case QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING:
282 283 284 285 286 287 288 289 290 291 292 293 294 295
        // Hide almost everything
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->posDSpinBox->hide();
        m_ui->posESpinBox->hide();
        m_ui->posNSpinBox->hide();
        m_ui->latSpinBox->hide();
        m_ui->lonSpinBox->hide();
        m_ui->altSpinBox->hide();

lm's avatar
lm committed
296 297 298
        int action_index = m_ui->comboBox_action->findData(MAV_CMD_ENUM_END);
        m_ui->comboBox_action->setCurrentIndex(action_index);

299
        // Show action widget
300
        if (!m_ui->customActionWidget->isVisible()) {
301 302
            m_ui->customActionWidget->show();
        }
303
        if (!m_ui->autoContinue->isVisible()) {
304 305
            m_ui->autoContinue->show();
        }
306
        break;
307
    }
lm's avatar
lm committed
308

309 310
}

311
void WaypointEditableView::updateFrameView(int frame)
312
{
313
    switch(frame) {
314
    case MAV_FRAME_GLOBAL:
315
    case MAV_FRAME_GLOBAL_RELATIVE_ALT:
316 317 318 319 320 321 322 323 324 325
        m_ui->posNSpinBox->hide();
        m_ui->posESpinBox->hide();
        m_ui->posDSpinBox->hide();
        m_ui->lonSpinBox->show();
        m_ui->latSpinBox->show();
        m_ui->altSpinBox->show();
        // Coordinate frame
        m_ui->comboBox_frame->show();
        m_ui->customActionWidget->hide();
        break;
326
    case MAV_FRAME_LOCAL_NED:
327 328 329 330 331 332 333 334 335 336
        m_ui->lonSpinBox->hide();
        m_ui->latSpinBox->hide();
        m_ui->altSpinBox->hide();
        m_ui->posNSpinBox->show();
        m_ui->posESpinBox->show();
        m_ui->posDSpinBox->show();
        // Coordinate frame
        m_ui->comboBox_frame->show();
        m_ui->customActionWidget->hide();
        break;
337 338 339 340 341
    default:
        std::cerr << "unknown frame" << std::endl;
    }
}

342
void WaypointEditableView::deleted(QObject* waypoint)
pixhawk's avatar
pixhawk committed
343
{
344
    Q_UNUSED(waypoint);
lm's avatar
lm committed
345 346 347 348
//    if (waypoint == this->wp)
//    {
//        deleteLater();
//    }
pixhawk's avatar
pixhawk committed
349 350
}

351
void WaypointEditableView::changedFrame(int index)
352 353 354 355 356 357 358 359
{
    // set waypoint action
    MAV_FRAME frame = (MAV_FRAME)m_ui->comboBox_frame->itemData(index).toUInt();
    wp->setFrame(frame);

    updateFrameView(frame);
}

360
void WaypointEditableView::changedCurrent(int state)
pixhawk's avatar
pixhawk committed
361
{
362
    //m_ui->selectedBox->blockSignals(true);
363 364 365 366
    if (state == 0)
    {
        if (wp->getCurrent() == true) //User clicked on the waypoint, that is already current
        {
367
            //qDebug() << "Editable " << wp->getId() << " changedCurrent: State 0, current true" ;
368 369 370 371 372
            m_ui->selectedBox->setChecked(true);
            m_ui->selectedBox->setCheckState(Qt::Checked);
        }
        else
        {
373
            //qDebug() << "Editable " << wp->getId() << " changedCurrent: State 0, current false";
374 375
            m_ui->selectedBox->setChecked(false);
            m_ui->selectedBox->setCheckState(Qt::Unchecked);
376
            //wp->setCurrent(false);
377 378 379 380
        }
    }
    else
    {
381
        //qDebug() << "Editable " << wp->getId() << " changedCurrent: State 2";
pixhawk's avatar
pixhawk committed
382
        wp->setCurrent(true);
383
        emit changeCurrentWaypoint(wp->getId());   //the slot changeCurrentWaypoint() in WaypointList sets all other current flags to false
pixhawk's avatar
pixhawk committed
384
    }
385
    //m_ui->selectedBox->blockSignals(false);
pixhawk's avatar
pixhawk committed
386 387
}

388
void WaypointEditableView::updateValues()
389
{
pixhawk's avatar
pixhawk committed
390 391
    // Check if we just lost the wp, delete the widget
    // accordingly
392
    if (!wp) {
pixhawk's avatar
pixhawk committed
393 394 395
        deleteLater();
        return;
    }
396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

    //wp->blockSignals(true);

    // Deactivate all QDoubleSpinBox signals due to
    // unwanted rounding effects
    for (int j = 0; j  < children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(children().at(j));
        if (spin)
        {
            //qDebug() << "DEACTIVATED SPINBOX #" << j;
            spin->blockSignals(true);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QWidget* item = dynamic_cast<QWidget*>(children().at(j));
            if (item)
            {
                //qDebug() << "FOUND WIDGET BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                        //qDebug() << "DEACTIVATED SPINBOX #" << k;
                        spin->blockSignals(true);
                    }
                }
            }
        }
    }

    // Block all custom action widget actions
    for (int j = 0; j  < m_ui->customActionWidget->children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(m_ui->customActionWidget->children().at(j));
        if (spin)
        {
            //qDebug() << "DEACTIVATED SPINBOX #" << j;
            spin->blockSignals(true);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QWidget* item = dynamic_cast<QWidget*>(m_ui->customActionWidget->children().at(j));
            if (item)
            {
                //qDebug() << "CUSTOM ACTIONS FOUND WIDGET BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                        //qDebug() << "DEACTIVATED SPINBOX #" << k;
                        spin->blockSignals(true);
                    }
                }
            }
        }
    }


463 464
    // update frame
    MAV_FRAME frame = wp->getFrame();
465
    int frame_index = m_ui->comboBox_frame->findData(frame);
466
    if (m_ui->comboBox_frame->currentIndex() != frame_index) {
467
        m_ui->comboBox_frame->setCurrentIndex(frame_index);
468
        updateFrameView(frame);
469
    }
470
    switch(frame) {
471
    case MAV_FRAME_LOCAL_NED: {
472 473
        if (m_ui->posNSpinBox->value() != wp->getX()) {
            m_ui->posNSpinBox->setValue(wp->getX());
pixhawk's avatar
pixhawk committed
474
        }
475 476 477 478 479 480 481 482
        if (m_ui->posESpinBox->value() != wp->getY()) {
            m_ui->posESpinBox->setValue(wp->getY());
        }
        if (m_ui->posDSpinBox->value() != wp->getZ()) {
            m_ui->posDSpinBox->setValue(wp->getZ());
        }
    }
    break;
483
    case MAV_FRAME_GLOBAL:
484
    case MAV_FRAME_GLOBAL_RELATIVE_ALT: {
485 486 487 488
        if (m_ui->latSpinBox->value() != wp->getLatitude()) {
            // Rounding might occur, prevent spin box from
            // firing back changes
            m_ui->latSpinBox->setValue(wp->getLatitude());
pixhawk's avatar
pixhawk committed
489
        }
490 491 492 493
        if (m_ui->lonSpinBox->value() != wp->getLongitude()) {
            // Rounding might occur, prevent spin box from
            // firing back changes
            m_ui->lonSpinBox->setValue(wp->getLongitude());
494
        }
495 496 497 498
        if (m_ui->altSpinBox->value() != wp->getAltitude()) {
            // Rounding might occur, prevent spin box from
            // firing back changes
            m_ui->altSpinBox->setValue(wp->getAltitude());
499 500 501
        }
    }
    break;
502 503
    default:
        // Do nothing
504
        break;
505 506
    }

507
    // Update action
508
    MAV_CMD action = wp->getAction();
509
    int action_index = m_ui->comboBox_action->findData(action);
510
    // Set to "Other" action if it was -1
511 512
    if (action_index == -1)
    {
513
        action_index = m_ui->comboBox_action->findData(MAV_CMD_ENUM_END);
514 515
    }
    // Only update if changed
516 517
    if (m_ui->comboBox_action->currentIndex() != action_index)
    {
518
        // If action is unknown, set direct editing mode
519 520
        if (wp->getAction() < 0 || wp->getAction() > MAV_CMD_NAV_TAKEOFF)
        {
521
            changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING);
522 523 524
        }
        else
        {
525
            if (viewMode != QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING)
526
            {
lm's avatar
lm committed
527 528 529 530
                // Action ID known, update
                m_ui->comboBox_action->setCurrentIndex(action_index);
                updateActionView(action);
            }
531
        }
pixhawk's avatar
pixhawk committed
532
    }
533

534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
//    // Do something on actions - currently unused
////    switch(action) {
////    case MAV_CMD_NAV_TAKEOFF:
////        break;
////    case MAV_CMD_NAV_LAND:
////        break;
////    case MAV_CMD_NAV_WAYPOINT:
////        break;
////    case MAV_CMD_NAV_LOITER_UNLIM:
////        break;
////    default:
////        std::cerr << "unknown action" << std::endl;
////    }

    if (m_ui->yawSpinBox->value() != wp->getYaw())
    {
lm's avatar
lm committed
550
        m_ui->yawSpinBox->setValue(wp->getYaw());
pixhawk's avatar
pixhawk committed
551
    }
552 553
    if (m_ui->selectedBox->isChecked() != wp->getCurrent())
    {
pixhawk's avatar
pixhawk committed
554 555
        m_ui->selectedBox->setChecked(wp->getCurrent());
    }
556 557
    if (m_ui->autoContinue->isChecked() != wp->getAutoContinue())
    {
pixhawk's avatar
pixhawk committed
558 559
        m_ui->autoContinue->setChecked(wp->getAutoContinue());
    }
pixhawk's avatar
pixhawk committed
560
    m_ui->idLabel->setText(QString("%1").arg(wp->getId()));
561 562
    if (m_ui->orbitSpinBox->value() != wp->getLoiterOrbit())
    {
563 564
        m_ui->orbitSpinBox->setValue(wp->getLoiterOrbit());
    }
565 566
    if (m_ui->acceptanceSpinBox->value() != wp->getAcceptanceRadius())
    {
567
        m_ui->acceptanceSpinBox->setValue(wp->getAcceptanceRadius());
pixhawk's avatar
pixhawk committed
568
    }
569 570
    if (m_ui->holdTimeSpinBox->value() != wp->getHoldTime())
    {
pixhawk's avatar
pixhawk committed
571 572
        m_ui->holdTimeSpinBox->setValue(wp->getHoldTime());
    }
573 574
    if (m_ui->turnsSpinBox->value() != wp->getTurns())
    {
575 576
        m_ui->turnsSpinBox->setValue(wp->getTurns());
    }
577 578
    if (m_ui->takeOffAngleSpinBox->value() != wp->getParam1())
    {
579 580
        m_ui->takeOffAngleSpinBox->setValue(wp->getParam1());
    }
581

582
//    // UPDATE CUSTOM ACTION WIDGET
583

584 585
    if (customCommand->commandSpinBox->value() != wp->getAction())
    {
586
        customCommand->commandSpinBox->setValue(wp->getAction());
587
        // qDebug() << "Changed action";
588 589
    }
    // Param 1
590
    if (customCommand->param1SpinBox->value() != wp->getParam1()) {
591 592 593
        customCommand->param1SpinBox->setValue(wp->getParam1());
    }
    // Param 2
594
    if (customCommand->param2SpinBox->value() != wp->getParam2()) {
595 596 597
        customCommand->param2SpinBox->setValue(wp->getParam2());
    }
    // Param 3
598
    if (customCommand->param3SpinBox->value() != wp->getParam3()) {
599 600 601
        customCommand->param3SpinBox->setValue(wp->getParam3());
    }
    // Param 4
602
    if (customCommand->param4SpinBox->value() != wp->getParam4()) {
603 604
        customCommand->param4SpinBox->setValue(wp->getParam4());
    }
605
    // Param 5
606
    if (customCommand->param5SpinBox->value() != wp->getParam5()) {
607 608 609
        customCommand->param5SpinBox->setValue(wp->getParam5());
    }
    // Param 6
610
    if (customCommand->param6SpinBox->value() != wp->getParam6()) {
611 612
        customCommand->param6SpinBox->setValue(wp->getParam6());
    }
lm's avatar
lm committed
613
    // Param 7
614
    if (customCommand->param7SpinBox->value() != wp->getParam7()) {
lm's avatar
lm committed
615 616
        customCommand->param7SpinBox->setValue(wp->getParam7());
    }
617

618 619 620 621 622 623 624 625
    QColor backGroundColor = QGC::colorBackground;

    static int lastId = -1;
    int currId = wp->getId() % 2;

    if (currId != lastId)
    {

626
        // qDebug() << "COLOR ID: " << currId;
627 628 629 630 631 632 633 634 635
        if (currId == 1)
        {
            //backGroundColor = backGroundColor.lighter(150);
            backGroundColor = QColor("#252528").lighter(150);
        }
        else
        {
            backGroundColor = QColor("#252528").lighter(250);
        }
636
        // qDebug() << "COLOR:" << backGroundColor.name();
637 638 639 640 641 642 643 644 645 646 647 648

        // Update color based on id
        QString groupBoxStyle = QString("QGroupBox {padding: 0px; margin: 0px; border: 0px; background-color: %1; }").arg(backGroundColor.name());
        QString labelStyle = QString("QWidget {background-color: %1; color: #DDDDDF; border-color: #EEEEEE; }").arg(backGroundColor.name());
        QString checkBoxStyle = QString("QCheckBox {background-color: %1; color: #454545; border-color: #EEEEEE; }").arg(backGroundColor.name());

        m_ui->autoContinue->setStyleSheet(checkBoxStyle);
        m_ui->selectedBox->setStyleSheet(checkBoxStyle);
        m_ui->idLabel->setStyleSheet(labelStyle);
        m_ui->groupBox->setStyleSheet(groupBoxStyle);
        lastId = currId;
    }
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713

    // Activate all QDoubleSpinBox signals due to
    // unwanted rounding effects
    for (int j = 0; j  < children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(children().at(j));
        if (spin)
        {
            //qDebug() << "ACTIVATED SPINBOX #" << j;
            spin->blockSignals(false);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QGroupBox* item = dynamic_cast<QGroupBox*>(children().at(j));
            if (item)
            {
                //qDebug() << "FOUND GROUP BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                        //qDebug() << "ACTIVATED SPINBOX #" << k;
                        spin->blockSignals(false);
                    }
                }
            }
        }
    }

    // Unblock all custom action widget actions
    for (int j = 0; j  < m_ui->customActionWidget->children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(m_ui->customActionWidget->children().at(j));
        if (spin)
        {
            //qDebug() << "ACTIVATED SPINBOX #" << j;
            spin->blockSignals(false);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QWidget* item = dynamic_cast<QWidget*>(m_ui->customActionWidget->children().at(j));
            if (item)
            {
                //qDebug() << "FOUND WIDGET BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                       //qDebug() << "ACTIVATED SPINBOX #" << k;
                        spin->blockSignals(false);
                    }
                }
            }
        }
    }

//    wp->blockSignals(false);
714 715
}

716
void WaypointEditableView::setCurrent(bool state)
pixhawk's avatar
pixhawk committed
717
{
718
    m_ui->selectedBox->blockSignals(true);
719
    m_ui->selectedBox->setChecked(state);
720
    m_ui->selectedBox->blockSignals(false);
pixhawk's avatar
pixhawk committed
721 722
}

723
WaypointEditableView::~WaypointEditableView()
pixhawk's avatar
pixhawk committed
724 725 726 727
{
    delete m_ui;
}

728
void WaypointEditableView::changeEvent(QEvent *e)
pixhawk's avatar
pixhawk committed
729 730 731 732 733 734 735 736 737
{
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}