MainWindow.cc 44.3 KB
Newer Older
1
/*===================================================================
pixhawk's avatar
pixhawk committed
2 3 4 5
======================================================================*/

/**
 * @file
6
 *   @brief Implementation of class MainWindow
7
 *   @author Lorenz Meier <mail@qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
8 9 10 11 12 13 14 15 16 17 18
 */

#include <QSettings>
#include <QDockWidget>
#include <QNetworkInterface>
#include <QMessageBox>
#include <QDebug>
#include <QTimer>
#include <QHostInfo>

#include "MG.h"
19
#include "QGC.h"
pixhawk's avatar
pixhawk committed
20 21 22 23 24 25 26 27
#include "MAVLinkSimulationLink.h"
#include "SerialLink.h"
#include "UDPLink.h"
#include "MAVLinkProtocol.h"
#include "CommConfigurationWindow.h"
#include "WaypointList.h"
#include "MainWindow.h"
#include "JoystickWidget.h"
pixhawk's avatar
pixhawk committed
28
#include "GAudioOutput.h"
29
#include "QGCToolWidget.h"
30

31
#ifdef QGC_OSG_ENABLED
32
#include "Q3DWidgetFactory.h"
33
#endif
pixhawk's avatar
pixhawk committed
34

lm's avatar
lm committed
35 36 37 38
// FIXME Move
#include "PxQuadMAV.h"
#include "SlugsMAV.h"

pixhawk's avatar
pixhawk committed
39 40 41

#include "LogCompressor.h"

42 43
MainWindow* MainWindow::instance()
{
44 45 46 47
    static MainWindow* _instance = 0;
    if(_instance == 0)
    {
        _instance = new MainWindow();
48

49
        /* Set the application as parent to ensure that this object
50
                 * will be destroyed when the main application exits */
51 52 53
        //_instance->setParent(qApp);
    }
    return _instance;
54 55
}

pixhawk's avatar
pixhawk committed
56 57 58 59 60 61 62
/**
* Create new mainwindow. The constructor instantiates all parts of the user
* interface. It does NOT show the mainwindow. To display it, call the show()
* method.
*
* @see QMainWindow::show()
**/
63
MainWindow::MainWindow(QWidget *parent):
pixhawk's avatar
pixhawk committed
64
        QMainWindow(parent),
65
        toolsMenuActions(),
66 67
        currentView(VIEW_OPERATOR),
        aboutToCloseFlag(false),
pixhawk's avatar
pixhawk committed
68
        settings()
pixhawk's avatar
pixhawk committed
69
{
70 71
    // Get current settings
    settings.sync();
72

73 74 75 76 77
    // Check if the settings exist, instantiate defaults if necessary
    QString centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_MAP, currentView);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);
78 79 80 81 82
    }

    QString listKey = buildMenuKey(SUB_SECTION_CHECKED, MENU_UAS_LIST, currentView);
    if (!settings.contains(listKey))
    {
83 84
        settings.setValue(listKey, true);
    }
85

86 87
    settings.sync();

pixhawk's avatar
pixhawk committed
88 89 90
    // Setup user interface
    ui.setupUi(this);

91
    buildCommonWidgets();
92

93
    connectCommonWidgets();
94

95
    arrangeCommonCenterStack();
96 97

    configureWindowName();
pixhawk's avatar
pixhawk committed
98 99

    // Add status bar
100
    //setStatusBar(createStatusBar());
pixhawk's avatar
pixhawk committed
101 102 103 104

    // Set the application style (not the same as a style sheet)
    // Set the style to Plastique
    qApp->setStyle("plastique");
105

pixhawk's avatar
pixhawk committed
106 107 108
    // Set style sheet as last step
    reloadStylesheet();

109
    // Create actions
110
    connectCommonActions();
111 112
    // Add option for custom widgets
    connect(ui.actionNewCustomWidget, SIGNAL(triggered()), this, SLOT(createCustomWidget()));
113 114 115
    // Allow to mute audio
    ui.actionMuteAudioOutput->setChecked(GAudioOutput::instance()->isMuted());
    connect(ui.actionMuteAudioOutput, SIGNAL(triggered(bool)), GAudioOutput::instance(), SLOT(mute(bool)));
116

117 118 119
    // Set dock options
    setDockOptions(AnimatedDocks | AllowTabbedDocks | AllowNestedDocks);

120
    // Load mavlink view as default widget set
121
    //loadMAVLinkView();
122

123 124 125 126 127 128 129 130 131 132
    if (settings.contains("geometry"))
    {
        // Restore the window geometry
        restoreGeometry(settings.value("geometry").toByteArray());
    }
    else
    {
        // Adjust the size
        adjustSize();
    }
pixhawk's avatar
pixhawk committed
133

134 135 136 137 138 139
    // Populate link menu
    QList<LinkInterface*> links = LinkManager::instance()->getLinks();
    foreach(LinkInterface* link, links)
    {
        this->addLink(link);
    }
140

lm's avatar
lm committed
141 142
    // Enable and update view
    presentView();
pixhawk's avatar
pixhawk committed
143 144
}

pixhawk's avatar
pixhawk committed
145
MainWindow::~MainWindow()
pixhawk's avatar
pixhawk committed
146 147 148 149 150
{
    delete statusBar;
    statusBar = NULL;
}

151 152 153 154 155 156
void MainWindow::buildCommonWidgets()
{
    //TODO:  move protocol outside UI
    mavlink     = new MAVLinkProtocol();

    // Dock widgets
157 158 159 160 161 162
    if (!controlDockWidget)
    {
        controlDockWidget = new QDockWidget(tr("Control"), this);
        controlDockWidget->setWidget( new UASControlWidget(this) );
        addToToolsMenu (controlDockWidget, tr("Control"), SLOT(showToolWidget()), MENU_UAS_CONTROL, Qt::LeftDockWidgetArea);
    }
163

164 165 166 167 168 169
    if (!listDockWidget)
    {
        listDockWidget = new QDockWidget(tr("Unmanned Systems"), this);
        listDockWidget->setWidget( new UASListWidget(this) );
        addToToolsMenu (listDockWidget, tr("Unmanned Systems"), SLOT(showToolWidget()), MENU_UAS_LIST, Qt::RightDockWidgetArea);
    }
170

171 172 173 174 175 176
    if (!waypointsDockWidget)
    {
        waypointsDockWidget = new QDockWidget(tr("Waypoint List"), this);
        waypointsDockWidget->setWidget( new WaypointList(this, NULL) );
        addToToolsMenu (waypointsDockWidget, tr("Waypoints List"), SLOT(showToolWidget()), MENU_WAYPOINTS, Qt::BottomDockWidgetArea);
    }
177

178 179 180 181 182 183
    if (!infoDockWidget)
    {
        infoDockWidget = new QDockWidget(tr("Status Details"), this);
        infoDockWidget->setWidget( new UASInfoWidget(this) );
        addToToolsMenu (infoDockWidget, tr("Status Details"), SLOT(showToolWidget()), MENU_STATUS, Qt::RightDockWidgetArea);
    }
184

185 186 187 188 189 190
    if (!debugConsoleDockWidget)
    {
        debugConsoleDockWidget = new QDockWidget(tr("Communication Console"), this);
        debugConsoleDockWidget->setWidget( new DebugConsole(this) );
        addToToolsMenu (debugConsoleDockWidget, tr("Communication Console"), SLOT(showToolWidget()), MENU_DEBUG_CONSOLE, Qt::BottomDockWidgetArea);
    }
191

192
    // Center widgets
193 194 195 196 197
    if (!mapWidget)
    {
        mapWidget         = new MapWidget(this);
        addToCentralWidgetsMenu (mapWidget, "Maps", SLOT(showCentralWidget()),CENTRAL_MAP);
    }
198

199 200 201 202 203
    if (!protocolWidget)
    {
        protocolWidget    = new XMLCommProtocolWidget(this);
        addToCentralWidgetsMenu (protocolWidget, "Mavlink Generator", SLOT(showCentralWidget()),CENTRAL_PROTOCOL);
    }
204
}
205

206
void MainWindow::buildPxWidgets()
207
{
pixhawk's avatar
pixhawk committed
208 209
    //FIXME: memory of acceptList will never be freed again
    QStringList* acceptList = new QStringList();
210 211 212 213 214 215 216
    acceptList->append("-180,roll (deg),+180");
    acceptList->append("-180,pitch (deg),+180");
    acceptList->append("-180,yaw (deg),+180");

    acceptList->append("-500,roll V (deg/s),+500");
    acceptList->append("-500,pitch V (deg/s),+500");
    acceptList->append("-500,yaw V (deg/s),+500");
217

pixhawk's avatar
pixhawk committed
218 219
    //FIXME: memory of acceptList2 will never be freed again
    QStringList* acceptList2 = new QStringList();
220 221 222
    acceptList2->append("0,Abs pressure,65500");
    acceptList2->append("-2000,Accel. X, 2000");
    acceptList2->append("-2000,Accel. Y, 2000");
223

224 225 226 227 228 229
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
        addToCentralWidgetsMenu(linechartWidget, "Line Plots", SLOT(showCentralWidget()), CENTRAL_LINECHART);
    }
230 231


232 233 234 235 236
    if (!hudWidget)
    {
        hudWidget         = new HUD(320, 240, this);
        addToCentralWidgetsMenu(hudWidget, "HUD", SLOT(showCentralWidget()), CENTRAL_HUD);
    }
237

238 239 240 241 242
    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
        addToCentralWidgetsMenu(dataplotWidget, "Data Plots", SLOT(showCentralWidget()), CENTRAL_DATA_PLOT);
    }
243

244
#ifdef QGC_OSG_ENABLED
245 246 247 248 249
    if (!_3DWidget)
    {
        _3DWidget         = Q3DWidgetFactory::get("PIXHAWK");
        addToCentralWidgetsMenu(_3DWidget, "Local 3D", SLOT(showCentralWidget()), CENTRAL_3D_LOCAL);
    }
250
#endif
251

252
#ifdef QGC_OSGEARTH_ENABLED
253 254 255 256 257
    if (!_3DMapWidget)
    {
        _3DMapWidget = Q3DWidgetFactory::get("MAP3D");
        addToCentralWidgetsMenu(_3DMapWidget, "OSG Earth 3D", SLOT(showCentralWidget()), CENTRAL_OSGEARTH);
    }
258
#endif
lm's avatar
lm committed
259

260
#if (defined _MSC_VER) | (defined Q_OS_MAC)
261 262 263 264 265
    if (!gEarthWidget)
    {
        gEarthWidget = new QGCGoogleEarthView(this);
        addToCentralWidgetsMenu(gEarthWidget, "Google Earth", SLOT(showCentralWidget()), CENTRAL_GOOGLE_EARTH);
    }
266

267
#endif
268

pixhawk's avatar
pixhawk committed
269
    // Dock widgets
270

271 272 273 274 275 276
    if (!detectionDockWidget)
    {
        detectionDockWidget = new QDockWidget(tr("Object Recognition"), this);
        detectionDockWidget->setWidget( new ObjectDetectionView("images/patterns", this) );
        addToToolsMenu (detectionDockWidget, tr("Object Recognition"), SLOT(showToolWidget()), MENU_DETECTION, Qt::RightDockWidgetArea);
    }
277

278 279 280 281 282 283
    if (!parametersDockWidget)
    {
        parametersDockWidget = new QDockWidget(tr("Onboard Parameters"), this);
        parametersDockWidget->setWidget( new ParameterInterface(this) );
        addToToolsMenu (parametersDockWidget, tr("Onboard Parameters"), SLOT(showToolWidget()), MENU_PARAMETERS, Qt::RightDockWidgetArea);
    }
284

285 286 287 288 289 290
    if (!watchdogControlDockWidget)
    {
        watchdogControlDockWidget = new QDockWidget(tr("Process Control"), this);
        watchdogControlDockWidget->setWidget( new WatchdogControl(this) );
        addToToolsMenu (watchdogControlDockWidget, tr("Process Control"), SLOT(showToolWidget()), MENU_WATCHDOG, Qt::BottomDockWidgetArea);
    }
291

292 293 294 295 296 297
    if (!hsiDockWidget)
    {
        hsiDockWidget = new QDockWidget(tr("Horizontal Situation Indicator"), this);
        hsiDockWidget->setWidget( new HSIDisplay(this) );
        addToToolsMenu (hsiDockWidget, tr("HSI"), SLOT(showToolWidget()), MENU_HSI, Qt::BottomDockWidgetArea);
    }
298

299 300
    if (!headDown1DockWidget)
    {
301 302
        headDown1DockWidget = new QDockWidget(tr("Flight Display"), this);
        headDown1DockWidget->setWidget( new HDDisplay(acceptList, "Flight Display", this) );
303 304
        addToToolsMenu (headDown1DockWidget, tr("Flight Display"), SLOT(showToolWidget()), MENU_HDD_1, Qt::RightDockWidgetArea);
    }
305

306 307 308
    if (!headDown2DockWidget)
    {
        headDown2DockWidget = new QDockWidget(tr("Payload Status"), this);
309
        headDown2DockWidget->setWidget( new HDDisplay(acceptList2, "Payload Status", this) );
310 311
        addToToolsMenu (headDown2DockWidget, tr("Payload Status"), SLOT(showToolWidget()), MENU_HDD_2, Qt::RightDockWidgetArea);
    }
312

313 314 315 316 317 318
    if (!rcViewDockWidget)
    {
        rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
        rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
        addToToolsMenu (rcViewDockWidget, tr("Radio Control"), SLOT(showToolWidget()), MENU_RC_VIEW, Qt::BottomDockWidgetArea);
    }
319

320 321 322 323 324 325
    if (!headUpDockWidget)
    {
        headUpDockWidget = new QDockWidget(tr("HUD"), this);
        headUpDockWidget->setWidget( new HUD(320, 240, this));
        addToToolsMenu (headUpDockWidget, tr("Control Indicator"), SLOT(showToolWidget()), MENU_HUD, Qt::LeftDockWidgetArea);
    }
326

pixhawk's avatar
pixhawk committed
327 328
    // Dialogue widgets
    //FIXME: free memory in destructor
329 330 331 332
    if (!joystick)
    {
        joystick    = new JoystickInput();
    }
333

334 335 336 337
}

void MainWindow::buildSlugsWidgets()
{
338 339 340 341 342
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
    }
343

344 345 346 347 348 349 350
    if (!headUpDockWidget)
    {
        // Dock widgets
        headUpDockWidget = new QDockWidget(tr("Control Indicator"), this);
        headUpDockWidget->setWidget( new HUD(320, 240, this));
        addToToolsMenu (headUpDockWidget, tr("HUD"), SLOT(showToolWidget()), MENU_HUD, Qt::LeftDockWidgetArea);
    }
351

352 353 354 355 356 357
    if (!rcViewDockWidget)
    {
        rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
        rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
        addToToolsMenu (rcViewDockWidget, tr("Radio Control"), SLOT(showToolWidget()), MENU_RC_VIEW, Qt::BottomDockWidgetArea);
    }
358

359 360 361 362 363 364 365
    if (!slugsDataWidget)
    {
        // Dialog widgets
        slugsDataWidget = new QDockWidget(tr("Slugs Data"), this);
        slugsDataWidget->setWidget( new SlugsDataSensorView(this));
        addToToolsMenu (slugsDataWidget, tr("Telemetry Data"), SLOT(showToolWidget()), MENU_SLUGS_DATA, Qt::RightDockWidgetArea);
    }
366

367 368 369 370 371 372
    if (!slugsPIDControlWidget)
    {
        slugsPIDControlWidget = new QDockWidget(tr("Slugs PID Control"), this);
        slugsPIDControlWidget->setWidget(new SlugsPIDControl(this));
        addToToolsMenu (slugsPIDControlWidget, tr("PID Configuration"), SLOT(showToolWidget()), MENU_SLUGS_PID, Qt::LeftDockWidgetArea);
    }
373

374 375 376 377 378 379
    if (!slugsHilSimWidget)
    {
        slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this);
        slugsHilSimWidget->setWidget( new SlugsHilSim(this));
        addToToolsMenu (slugsHilSimWidget, tr("HIL Sim Configuration"), SLOT(showToolWidget()), MENU_SLUGS_HIL, Qt::LeftDockWidgetArea);
    }
380

381 382 383 384 385 386
    if (!slugsCamControlWidget)
    {
        slugsCamControlWidget = new QDockWidget(tr("Slugs Video Camera Control"), this);
        slugsCamControlWidget->setWidget(new SlugsVideoCamControl(this));
        addToToolsMenu (slugsCamControlWidget, tr("Camera Control"), SLOT(showToolWidget()), MENU_SLUGS_CAMERA, Qt::BottomDockWidgetArea);
    }
387
}
388 389 390 391 392


void MainWindow::addToCentralWidgetsMenu ( QWidget* widget,
                                           const QString title,
                                           const char * slotName,
393 394
                                           TOOLS_WIDGET_NAMES centralWidget)
{
395
    QAction* tempAction;
396

397

398
    // Add the separator that will separate tools from central Widgets
399 400
    if (!toolsMenuActions[CENTRAL_SEPARATOR])
    {
401 402 403 404
        tempAction = ui.menuTools->addSeparator();
        toolsMenuActions[CENTRAL_SEPARATOR] = tempAction;
        tempAction->setData(CENTRAL_SEPARATOR);
    }
405

406
    tempAction = ui.menuTools->addAction(title);
407

408 409
    tempAction->setCheckable(true);
    tempAction->setData(centralWidget);
410

411 412 413
    // populate the Hashes
    toolsMenuActions[centralWidget] = tempAction;
    dockWidgets[centralWidget] = widget;
414

415
    QString chKey = buildMenuKey(SUB_SECTION_CHECKED, centralWidget, currentView);
416

417 418
    if (!settings.contains(chKey))
    {
419 420 421
        settings.setValue(chKey,false);
        tempAction->setChecked(false);
    }
422 423 424 425
    else
    {
        tempAction->setChecked(settings.value(chKey).toBool());
    }
426

427 428
    // connect the action
    connect(tempAction,SIGNAL(triggered()),this, slotName);
429 430 431
}


lm's avatar
lm committed
432 433
void MainWindow::showCentralWidget()
{
434 435 436
    QAction* senderAction = qobject_cast<QAction *>(sender());
    int tool = senderAction->data().toInt();
    QString chKey;
437

438
    // check the current action
439

440 441
    if (senderAction && dockWidgets[tool])
    {
442

443 444 445 446 447 448 449 450 451 452 453 454 455
        // uncheck all central widget actions
        QHashIterator<int, QAction*> i(toolsMenuActions);
        while (i.hasNext()) {
            i.next();
            qDebug() << "shCW" << i.key() << "read";
            if (i.value() && i.value()->data().toInt() > 255){
                i.value()->setChecked(false);

                // update the settings
                chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.value()->data().toInt()), currentView);
                settings.setValue(chKey,false);
            }
        }
456

457 458 459
        // check the current action
        qDebug() << senderAction->text();
        senderAction->setChecked(true);
460

461 462
        // update the central widget
        centerStack->setCurrentWidget(dockWidgets[tool]);
463

464 465 466 467
        // store the selected central widget
        chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(tool), currentView);
        settings.setValue(chKey,true);
        settings.sync();
468

469 470
        presentView();
    }
471
}
472

lm's avatar
lm committed
473 474 475 476
/**
 * Adds a widget to the tools menu and sets it visible if it was
 * enabled last time.
 */
477
void MainWindow::addToToolsMenu ( QWidget* widget,
478 479 480 481
                                  const QString title,
                                  const char * slotName,
                                  TOOLS_WIDGET_NAMES tool,
                                  Qt::DockWidgetArea location)
lm's avatar
lm committed
482
{
483 484
    QAction* tempAction;
    QString posKey, chKey;
485

486

487 488
    if (toolsMenuActions[CENTRAL_SEPARATOR])
    {
489 490 491
        tempAction = new QAction(title, this);
        ui.menuTools->insertAction(toolsMenuActions[CENTRAL_SEPARATOR],
                                   tempAction);
492 493 494
    }
    else
    {
495 496
        tempAction = ui.menuTools->addAction(title);
    }
497

498 499
    tempAction->setCheckable(true);
    tempAction->setData(tool);
500

501 502 503 504
    // populate the Hashes
    toolsMenuActions[tool] = tempAction;
    dockWidgets[tool] = widget;
    qDebug() << widget;
505

506
    posKey = buildMenuKey (SUB_SECTION_LOCATION,tool, currentView);
507

508 509
    if (!settings.contains(posKey))
    {
510 511
        settings.setValue(posKey,location);
        dockWidgetLocations[tool] = location;
512 513 514 515
    }
    else
    {
        dockWidgetLocations[tool] = static_cast <Qt::DockWidgetArea> (settings.value(posKey, Qt::RightDockWidgetArea).toInt());
516
    }
517

518
    chKey = buildMenuKey(SUB_SECTION_CHECKED,tool, currentView);
519

520 521 522 523
    if (!settings.contains(chKey))
    {
        settings.setValue(chKey,false);
        tempAction->setChecked(false);
524
        widget->setVisible(false);
525 526 527 528
    }
    else
    {
        tempAction->setChecked(settings.value(chKey).toBool());
529
        widget->setVisible(settings.value(chKey, false).toBool());
530
    }
531

532 533
    // connect the action
    connect(tempAction,SIGNAL(triggered()),this, slotName);
534

535 536
    connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
            SIGNAL(visibilityChanged(bool)), this, SLOT(updateVisibilitySettings(bool)));
537

538 539
    connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
            SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(updateLocationSettings(Qt::DockWidgetArea)));
540 541 542

}

543 544 545 546
void MainWindow::showToolWidget()
{
    QAction* temp = qobject_cast<QAction *>(sender());
    int tool = temp->data().toInt();
547 548


549 550 551 552 553 554 555 556 557 558 559 560 561 562
    if (temp && dockWidgets[tool])
    {
        if (temp->isChecked())
        {
            addDockWidget(dockWidgetLocations[tool], qobject_cast<QDockWidget *> (dockWidgets[tool]));
            qobject_cast<QDockWidget *>(dockWidgets[tool])->show();
        }
        else
        {
            removeDockWidget(qobject_cast<QDockWidget *>(dockWidgets[tool]));
        }
        QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(tool), currentView);
        settings.setValue(chKey,temp->isChecked());
        settings.sync();
563 564 565 566
    }
}


567 568 569 570 571
void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view)
{
    bool tempVisible;
    Qt::DockWidgetArea tempLocation;
    QDockWidget* tempWidget = static_cast <QDockWidget *>(dockWidgets[widget]);
572

573 574 575 576 577 578 579 580 581 582
    tempVisible =  settings.value(buildMenuKey (SUB_SECTION_CHECKED,widget,view), false).toBool();

    // Some widgets are per default visible. Overwrite the settings value if not present.
    if (widget == MainWindow::MENU_UAS_LIST)
    {
        if (!settings.contains(buildMenuKey (SUB_SECTION_CHECKED,widget,view)))
        {
            tempVisible = true;
        }
    }
583 584 585 586 587

    if (tempWidget)
    {
        toolsMenuActions[widget]->setChecked(tempVisible);
    }
588 589


590
    //qDebug() <<  buildMenuKey (SUB_SECTION_CHECKED,widget,view) << tempVisible;
591

592 593
    tempLocation = static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,widget, view), QVariant(Qt::RightDockWidgetArea)).toInt());

594 595 596 597 598 599 600
    //    if (widget == MainWindow::MENU_UAS_LIST)
    //    {
    //        if (!settings.contains(buildMenuKey (SUB_SECTION_LOCATION,widget, view)))
    //        {
    //            tempLocation = Qt::RightDockWidgetArea;
    //        }
    //    }
601

602
    if ((tempWidget != NULL) && tempVisible)
603 604 605 606
    {
        addDockWidget(tempLocation, tempWidget);
        tempWidget->show();
    }
607

608
}
609

610 611 612 613 614 615 616 617 618 619 620 621 622 623
QString MainWindow::buildMenuKey(SETTINGS_SECTIONS section, TOOLS_WIDGET_NAMES tool, VIEW_SECTIONS view)
{
    // Key is built as follows: autopilot_type/section_menu/view/tool/section
    int apType;

    apType = (UASManager::instance() && UASManager::instance()->silentGetActiveUAS())?
             UASManager::instance()->getActiveUAS()->getAutopilotType():
             -1;

    return (QString::number(apType) + "/" +
            QString::number(SECTION_MENU) + "/" +
            QString::number(view) + "/" +
            QString::number(tool) + "/" +
            QString::number(section) + "/" );
624 625
}

626 627
void MainWindow::closeEvent(QCloseEvent *event)
{
628
    settings.setValue("geometry", saveGeometry());
629 630 631 632 633 634
    //settings.setValue("windowState", saveState());
    aboutToCloseFlag = true;
    settings.setValue("VIEW_ON_APPLICATION_CLOSE", currentView);
    settings.sync();
    QMainWindow::closeEvent(event);
}
635

636 637 638 639 640
/**
 * Stores the visibility setting of each widget. This method
 * will only change the settings if the application is not
 * about to close.
 */
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
void MainWindow::updateVisibilitySettings (bool vis)
{
    if (!aboutToCloseFlag)
    {

        QDockWidget* temp = qobject_cast<QDockWidget *>(sender());

        if (temp)
        {
            QHashIterator<int, QWidget*> i(dockWidgets);
            while (i.hasNext())
            {
                i.next();
                if ((static_cast <QDockWidget *>(dockWidgets[i.key()])) == temp)
                {
656 657 658
                    QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
                    settings.setValue(chKey,vis);
                    settings.sync();
659 660 661 662 663 664
                    toolsMenuActions[i.key()]->setChecked(vis);
                    break;
                }
            }
        }
    }
665 666
}

667 668 669
void MainWindow::updateLocationSettings (Qt::DockWidgetArea location)
{
    QDockWidget* temp = qobject_cast<QDockWidget *>(sender());
670

671 672 673 674 675 676 677 678 679 680 681
    QHashIterator<int, QWidget*> i(dockWidgets);
    while (i.hasNext())
    {
        i.next();
        if ((static_cast <QDockWidget *>(dockWidgets[i.key()])) == temp)
        {
            QString posKey = buildMenuKey (SUB_SECTION_LOCATION,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
            settings.setValue(posKey,location);
            break;
        }
    }
682 683
}

684 685 686
/**
 * Connect the signals and slots of the common window widgets
 */
687
void MainWindow::connectCommonWidgets()
688
{
pixhawk's avatar
pixhawk committed
689 690 691 692 693
    if (infoDockWidget && infoDockWidget->widget())
    {
        connect(mavlink, SIGNAL(receiveLossChanged(int, float)),
                infoDockWidget->widget(), SLOT(updateSendLoss(int, float)));
    }
694

pixhawk's avatar
pixhawk committed
695 696 697 698 699 700
    if (mapWidget && waypointsDockWidget->widget())
    {
        // clear path create on the map
        connect(waypointsDockWidget->widget(), SIGNAL(clearPathclicked()), mapWidget, SLOT(clearPath()));
        // add Waypoint widget in the WaypointList widget when mouse clicked
        connect(mapWidget, SIGNAL(captureMapCoordinateClick(QPointF)), waypointsDockWidget->widget(), SLOT(addWaypointMouse(QPointF)));
701 702 703

        // it notifies that a waypoint global goes to do create and a map graphic too
        connect(waypointsDockWidget->widget(), SIGNAL(createWaypointAtMap(QPointF)), mapWidget, SLOT(createWaypointGraphAtMap(QPointF)));
704
    }
705
}
706

707 708 709 710 711 712 713 714
void MainWindow::createCustomWidget()
{
    qDebug() << "ADDING CUSTOM WIDGET";
    QGCToolWidget* tool = new QGCToolWidget(this);
    QDockWidget* dock = new QDockWidget("Unnamed Tool", this);
    dock->setWidget(tool);
    this->addDockWidget(Qt::LeftDockWidgetArea, dock);
    dock->setVisible(true);
715 716 717 718
}

void MainWindow::connectPxWidgets()
{
719
    // No special connections necessary at this point
720 721 722 723
}

void MainWindow::connectSlugsWidgets()
{
724
    if (slugsHilSimWidget && slugsHilSimWidget->widget()){
725 726
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsHilSimWidget->widget(), SLOT(activeUasSet(UASInterface*)));
727 728 729
    }

    if (slugsDataWidget && slugsDataWidget->widget()){
730 731
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsDataWidget->widget(), SLOT(setActiveUAS(UASInterface*)));
732 733
    }

734

735 736
}

737
void MainWindow::arrangeCommonCenterStack()
738
{
739
    centerStack = new QStackedWidget(this);
740

pixhawk's avatar
pixhawk committed
741
    if (!centerStack) return;
742

743 744
    if (mapWidget && (centerStack->indexOf(mapWidget) == -1)) centerStack->addWidget(mapWidget);
    if (protocolWidget && (centerStack->indexOf(protocolWidget) == -1)) centerStack->addWidget(protocolWidget);
745 746 747 748 749 750 751

    setCentralWidget(centerStack);
}

void MainWindow::arrangePxCenterStack()
{

752 753 754 755
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
756

757 758

    if (linechartWidget && (centerStack->indexOf(linechartWidget) == -1)) centerStack->addWidget(linechartWidget);
759

760
#ifdef QGC_OSG_ENABLED
761
    if (_3DWidget && (centerStack->indexOf(_3DWidget) == -1)) centerStack->addWidget(_3DWidget);
762
#endif
763
#ifdef QGC_OSGEARTH_ENABLED
764
    if (_3DMapWidget && (centerStack->indexOf(_3DMapWidget) == -1)) centerStack->addWidget(_3DMapWidget);
765
#endif
766
#if (defined _MSC_VER) | (defined Q_OS_MAC)
767
    if (gEarthWidget && (centerStack->indexOf(gEarthWidget) == -1)) centerStack->addWidget(gEarthWidget);
768
#endif
769 770
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
771 772 773 774 775
}

void MainWindow::arrangeSlugsCenterStack()
{

776 777 778 779
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
780

781 782
    if (linechartWidget && (centerStack->indexOf(linechartWidget) == -1)) centerStack->addWidget(linechartWidget);
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
783

784 785
}

786 787
void MainWindow::configureWindowName()
{
pixhawk's avatar
pixhawk committed
788 789 790
    QList<QHostAddress> hostAddresses = QNetworkInterface::allAddresses();
    QString windowname = qApp->applicationName() + " " + qApp->applicationVersion();
    bool prevAddr = false;
791

pixhawk's avatar
pixhawk committed
792
    windowname.append(" (" + QHostInfo::localHostName() + ": ");
793

pixhawk's avatar
pixhawk committed
794 795 796 797 798 799 800 801 802 803
    for (int i = 0; i < hostAddresses.size(); i++)
    {
        // Exclude loopback IPv4 and all IPv6 addresses
        if (hostAddresses.at(i) != QHostAddress("127.0.0.1") && !hostAddresses.at(i).toString().contains(":"))
        {
            if(prevAddr) windowname.append("/");
            windowname.append(hostAddresses.at(i).toString());
            prevAddr = true;
        }
    }
804

pixhawk's avatar
pixhawk committed
805
    windowname.append(")");
806

pixhawk's avatar
pixhawk committed
807
    setWindowTitle(windowname);
808 809

#ifndef Q_WS_MAC
pixhawk's avatar
pixhawk committed
810
    //qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
811 812 813
#endif
}

pixhawk's avatar
pixhawk committed
814
QStatusBar* MainWindow::createStatusBar()
pixhawk's avatar
pixhawk committed
815 816 817 818 819 820 821 822
{
    QStatusBar* bar = new QStatusBar();
    /* Add status fields and messages */
    /* Enable resize grip in the bottom right corner */
    bar->setSizeGripEnabled(true);
    return bar;
}

pixhawk's avatar
pixhawk committed
823
void MainWindow::startVideoCapture()
pixhawk's avatar
pixhawk committed
824 825 826 827 828 829 830 831 832 833 834
{
    QString format = "bmp";
    QString initialPath = QDir::currentPath() + tr("/untitled.") + format;

    QString screenFileName = QFileDialog::getSaveFileName(this, tr("Save As"),
                                                          initialPath,
                                                          tr("%1 Files (*.%2);;All Files (*)")
                                                          .arg(format.toUpper())
                                                          .arg(format));
    delete videoTimer;
    videoTimer = new QTimer(this);
835 836 837
    //videoTimer->setInterval(40);
    //connect(videoTimer, SIGNAL(timeout()), this, SLOT(saveScreen()));
    //videoTimer->stop();
pixhawk's avatar
pixhawk committed
838 839
}

pixhawk's avatar
pixhawk committed
840
void MainWindow::stopVideoCapture()
pixhawk's avatar
pixhawk committed
841 842 843 844 845 846
{
    videoTimer->stop();

    // TODO Convert raw images to PNG
}

pixhawk's avatar
pixhawk committed
847
void MainWindow::saveScreen()
pixhawk's avatar
pixhawk committed
848 849 850 851 852 853 854 855 856 857
{
    QPixmap window = QPixmap::grabWindow(this->winId());
    QString format = "bmp";

    if (!screenFileName.isEmpty())
    {
        window.save(screenFileName, format.toAscii());
    }
}

858 859 860 861 862 863
/**
 * Reload the style sheet from disk. The function tries to load "qgroundcontrol.css" from the application
 * directory (which by default does not exist). If it fails, it will load the bundled default CSS
 * from memory.
 * To customize the application, just create a qgroundcontrol.css file in the application directory
 */
pixhawk's avatar
pixhawk committed
864
void MainWindow::reloadStylesheet()
pixhawk's avatar
pixhawk committed
865 866
{
    // Load style sheet
867 868 869 870 871
    QFile* styleSheet = new QFile(QCoreApplication::applicationDirPath() + "/qgroundcontrol.css");
    if (!styleSheet->exists())
    {
        styleSheet = new QFile(":/images/style-mission.css");
    }
872 873
    if (styleSheet->open(QIODevice::ReadOnly | QIODevice::Text))
    {
874 875
        QString style = QString(styleSheet->readAll());
        style.replace("ICONDIR", QCoreApplication::applicationDirPath()+ "/images/");
pixhawk's avatar
pixhawk committed
876
        qApp->setStyleSheet(style);
877 878 879
    }
    else
    {
880
        qDebug() << "Style not set:" << styleSheet->fileName() << "opened: " << styleSheet->isOpen();
pixhawk's avatar
pixhawk committed
881
    }
882
    delete styleSheet;
pixhawk's avatar
pixhawk committed
883 884
}

pixhawk's avatar
pixhawk committed
885
void MainWindow::showStatusMessage(const QString& status, int timeout)
pixhawk's avatar
pixhawk committed
886
{
lm's avatar
lm committed
887 888
    Q_UNUSED(status);
    Q_UNUSED(timeout);
889
    //statusBar->showMessage(status, timeout);
pixhawk's avatar
pixhawk committed
890 891
}

892
void MainWindow::showStatusMessage(const QString& status)
pixhawk's avatar
pixhawk committed
893
{
lm's avatar
lm committed
894
    Q_UNUSED(status);
895
    //statusBar->showMessage(status, 5);
pixhawk's avatar
pixhawk committed
896 897 898 899 900 901
}

/**
* @brief Create all actions associated to the main window
*
**/
902
void MainWindow::connectCommonActions()
pixhawk's avatar
pixhawk committed
903 904 905 906 907 908 909
{
    // Connect actions from ui
    connect(ui.actionAdd_Link, SIGNAL(triggered()), this, SLOT(addLink()));

    // Connect internal actions
    connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(UASCreated(UASInterface*)));

910
    // Unmanned System controls
pixhawk's avatar
pixhawk committed
911 912 913 914 915 916 917
    connect(ui.actionLiftoff, SIGNAL(triggered()), UASManager::instance(), SLOT(launchActiveUAS()));
    connect(ui.actionLand, SIGNAL(triggered()), UASManager::instance(), SLOT(returnActiveUAS()));
    connect(ui.actionEmergency_Land, SIGNAL(triggered()), UASManager::instance(), SLOT(stopActiveUAS()));
    connect(ui.actionEmergency_Kill, SIGNAL(triggered()), UASManager::instance(), SLOT(killActiveUAS()));

    connect(ui.actionConfiguration, SIGNAL(triggered()), UASManager::instance(), SLOT(configureActiveUAS()));

918
    // Views actions
919
    connect(ui.actionPilotsView, SIGNAL(triggered()), this, SLOT(loadPilotView()));
920
    connect(ui.actionEngineersView, SIGNAL(triggered()), this, SLOT(loadEngineerView()));
921
    connect(ui.actionOperatorsView, SIGNAL(triggered()), this, SLOT(loadOperatorView()));
922

923 924
    connect(ui.actionMavlinkView, SIGNAL(triggered()), this, SLOT(loadMAVLinkView()));
    connect(ui.actionReloadStyle, SIGNAL(triggered()), this, SLOT(reloadStylesheet()));
925

926
    // Help Actions
927 928 929
    connect(ui.actionOnline_documentation, SIGNAL(triggered()), this, SLOT(showHelp()));
    connect(ui.actionDeveloper_Credits, SIGNAL(triggered()), this, SLOT(showCredits()));
    connect(ui.actionProject_Roadmap, SIGNAL(triggered()), this, SLOT(showRoadMap()));
930 931 932 933
}

void MainWindow::connectPxActions()
{
934
    ui.actionJoystickSettings->setVisible(true);
935

936 937
    // Joystick configuration
    connect(ui.actionJoystickSettings, SIGNAL(triggered()), this, SLOT(configure()));
938 939 940 941 942

}

void MainWindow::connectSlugsActions()
{
943

pixhawk's avatar
pixhawk committed
944 945
}

946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
void MainWindow::showHelp()
{
    if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/user_guide")))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not open help in browser");
        msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/user_guide in a browser.");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
    }
}

void MainWindow::showCredits()
{
    if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/credits")))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not open credits in browser");
        msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/credits in a browser.");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
    }
}

void MainWindow::showRoadMap()
{
    if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/roadmap")))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not open roadmap in browser");
        msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/roadmap in a browser.");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
    }
}

pixhawk's avatar
pixhawk committed
988
void MainWindow::configure()
pixhawk's avatar
pixhawk committed
989 990 991 992
{
    joystickWidget = new JoystickWidget(joystick, this);
}

pixhawk's avatar
pixhawk committed
993
void MainWindow::addLink()
pixhawk's avatar
pixhawk committed
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
{
    SerialLink* link = new SerialLink();
    // TODO This should be only done in the dialog itself

    LinkManager::instance()->addProtocol(link, mavlink);

    CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this);

    ui.menuNetwork->addAction(commWidget->getAction());

    commWidget->show();
}

pixhawk's avatar
pixhawk committed
1007 1008
void MainWindow::addLink(LinkInterface *link)
{
1009
    LinkManager::instance()->addProtocol(link, mavlink);
pixhawk's avatar
pixhawk committed
1010 1011 1012 1013 1014 1015 1016
    CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this);
    ui.menuNetwork->addAction(commWidget->getAction());

    // Special case for simulationlink
    MAVLinkSimulationLink* sim = dynamic_cast<MAVLinkSimulationLink*>(link);
    if (sim)
    {
1017
        //connect(sim, SIGNAL(valueChanged(int,QString,double,quint64)), linechart, SLOT(appendData(int,QString,double,quint64)));
pixhawk's avatar
pixhawk committed
1018 1019 1020 1021
        connect(ui.actionSimulate, SIGNAL(triggered(bool)), sim, SLOT(connectLink(bool)));
    }
}

pixhawk's avatar
pixhawk committed
1022
void MainWindow::UASCreated(UASInterface* uas)
pixhawk's avatar
pixhawk committed
1023 1024 1025
{
    // Connect the UAS to the full user interface

1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
    if (uas != NULL)
    {
        QIcon icon;
        // Set matching icon
        switch (uas->getSystemType())
        {
        case 0:
            icon = QIcon(":/images/mavs/generic.svg");
            break;
        case 1:
            icon = QIcon(":/images/mavs/fixed-wing.svg");
            break;
        case 2:
            icon = QIcon(":/images/mavs/quadrotor.svg");
            break;
        case 3:
            icon = QIcon(":/images/mavs/coaxial.svg");
            break;
        case 4:
            icon = QIcon(":/images/mavs/helicopter.svg");
            break;
        case 5:
            icon = QIcon(":/images/mavs/groundstation.svg");
            break;
        default:
            icon = QIcon(":/images/mavs/unknown.svg");
            break;
        }

        ui.menuConnected_Systems->addAction(icon, tr("Select %1 for control").arg(uas->getUASName()), uas, SLOT(setSelected()));

        // FIXME Should be not inside the mainwindow
1058 1059
        if (debugConsoleDockWidget)
        {
pixhawk's avatar
pixhawk committed
1060 1061 1062 1063 1064 1065
            DebugConsole *debugConsole = dynamic_cast<DebugConsole*>(debugConsoleDockWidget->widget());
            if (debugConsole)
            {
                connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)),
                        debugConsole, SLOT(receiveTextMessage(int,int,int,QString)));
            }
1066
        }
1067 1068

        // Health / System status indicator
1069 1070
        if (infoDockWidget)
        {
pixhawk's avatar
pixhawk committed
1071 1072 1073 1074 1075
            UASInfoWidget *infoWidget = dynamic_cast<UASInfoWidget*>(infoDockWidget->widget());
            if (infoWidget)
            {
                infoWidget->addUAS(uas);
            }
1076
        }
1077 1078

        // UAS List
1079 1080
        if (listDockWidget)
        {
pixhawk's avatar
pixhawk committed
1081 1082 1083 1084 1085
            UASListWidget *listWidget = dynamic_cast<UASListWidget*>(listDockWidget->widget());
            if (listWidget)
            {
                listWidget->addUAS(uas);
            }
1086
        }
1087 1088 1089 1090 1091 1092 1093 1094

        // Camera view
        //camera->addUAS(uas);

        // Revalidate UI
        // TODO Stylesheet reloading should in theory not be necessary
        reloadStylesheet();

1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
        switch (uas->getAutopilotType())
        {
        case (MAV_AUTOPILOT_SLUGS):
            {
                // Build Slugs Widgets
                buildSlugsWidgets();

                // Connect Slugs Widgets
                connectSlugsWidgets();

                // Arrange Slugs Centerstack
                arrangeSlugsCenterStack();

                // Connect Slugs Actions
                connectSlugsActions();

                // FIXME: This type checking might be redundant
                //            if (slugsDataWidget) {
                //              SlugsDataSensorView* dataWidget = dynamic_cast<SlugsDataSensorView*>(slugsDataWidget->widget());
                //              if (dataWidget) {
                //                SlugsMAV* mav2 = dynamic_cast<SlugsMAV*>(uas);
                //                if (mav2) {
                (dynamic_cast<SlugsDataSensorView*>(slugsDataWidget->widget()))->addUAS(uas);
                //                  //loadSlugsView();
                //                  loadGlobalOperatorView();
                //                }
                //              }
                //            }
            }
            break;
        default:
        case (MAV_AUTOPILOT_GENERIC):
        case (MAV_AUTOPILOT_ARDUPILOTMEGA):
        case (MAV_AUTOPILOT_PIXHAWK):
            {
                // Build Pixhawk Widgets
                buildPxWidgets();

                // Connect Pixhawk Widgets
                connectPxWidgets();

                // Arrange Pixhawk Centerstack
                arrangePxCenterStack();

                // Connect Pixhawk Actions
                connectPxActions();

            }
            break;

        }

        // Change the view only if this is the first UAS

        // If this is the first connected UAS, it is both created as well as
        // the currently active UAS
        if (UASManager::instance()->getActiveUAS() == uas)
        {
            qDebug() << "UPDATING THE VIEW SINCE THIS IS THE FIRST CONNECTED SYSTEM";

            // Load last view if setting is present
            if (settings.contains("VIEW_ON_APPLICATION_CLOSE"))
            {
                int view = settings.value("VIEW_ON_APPLICATION_CLOSE").toInt();
                currentView = (VIEW_SECTIONS) view;
                presentView();
            }
            else
            {
                loadEngineerView();
            }
1166
        }
1167

1168
    }
pixhawk's avatar
pixhawk committed
1169 1170
}

1171 1172 1173
/**
 * Clears the current view completely
 */
pixhawk's avatar
pixhawk committed
1174
void MainWindow::clearView()
1175
{
1176 1177
    // Remove all dock widgets from main window
    QObjectList childList( this->children() );
pixhawk's avatar
pixhawk committed
1178

1179 1180 1181
    QObjectList::iterator i;
    QDockWidget* dockWidget;
    for (i = childList.begin(); i != childList.end(); ++i)
pixhawk's avatar
pixhawk committed
1182
    {
1183 1184
        dockWidget = dynamic_cast<QDockWidget*>(*i);
        if (dockWidget)
pixhawk's avatar
pixhawk committed
1185
        {
1186
            // Remove dock widget from main window
1187 1188
            //this->removeDockWidget(dockWidget);
            dockWidget->setVisible(false);
1189 1190 1191
            // Deletion of dockWidget would also delete all child
            // widgets of dockWidget
            // Is there a way to unset a widget from QDockWidget?
pixhawk's avatar
pixhawk committed
1192 1193 1194 1195
        }
    }
}

1196
void MainWindow::loadEngineerView()
lm's avatar
lm committed
1197
{
1198
    clearView();
lm's avatar
lm committed
1199

1200
    currentView = VIEW_ENGINEER;
lm's avatar
lm committed
1201

1202
    presentView();
lm's avatar
lm committed
1203 1204
}

1205
void MainWindow::loadOperatorView()
lm's avatar
lm committed
1206
{
1207 1208 1209
    clearView();

    currentView = VIEW_OPERATOR;
lm's avatar
lm committed
1210

1211
    presentView();
lm's avatar
lm committed
1212 1213
}

1214
void MainWindow::loadPilotView()
1215 1216
{
    clearView();
1217

1218 1219 1220
    currentView = VIEW_PILOT;

    presentView();
1221 1222
}

1223
void MainWindow::loadMAVLinkView()
1224 1225
{
    clearView();
pixhawk's avatar
pixhawk committed
1226

1227 1228 1229
    currentView = VIEW_MAVLINK;

    presentView();
1230 1231
}

lm's avatar
lm committed
1232 1233
void MainWindow::presentView()
{
1234 1235
    qDebug() << "LC";
    showTheCentralWidget(CENTRAL_LINECHART, currentView);
1236

1237 1238 1239
    // MAP
    qDebug() << "MAP";
    showTheCentralWidget(CENTRAL_MAP, currentView);
pixhawk's avatar
pixhawk committed
1240

1241 1242 1243
    // PROTOCOL
    qDebug() << "CP";
    showTheCentralWidget(CENTRAL_PROTOCOL, currentView);
pixhawk's avatar
pixhawk committed
1244

1245 1246
    // HEAD UP DISPLAY
    showTheCentralWidget(CENTRAL_HUD, currentView);
pixhawk's avatar
pixhawk committed
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257

    // GOOGLE EARTH
    showTheCentralWidget(CENTRAL_GOOGLE_EARTH, currentView);

    // LOCAL 3D VIEW
    showTheCentralWidget(CENTRAL_3D_LOCAL, currentView);

    // GLOBAL 3D VIEW
    showTheCentralWidget(CENTRAL_3D_MAP, currentView);


pixhawk's avatar
pixhawk committed
1258

1259
    // Show docked widgets based on current view and autopilot type
1260

1261 1262
    // UAS CONTROL
    showTheWidget(MENU_UAS_CONTROL, currentView);
1263

1264 1265
    // UAS LIST
    showTheWidget(MENU_UAS_LIST, currentView);
1266

1267 1268
    // WAYPOINT LIST
    showTheWidget(MENU_WAYPOINTS, currentView);
pixhawk's avatar
pixhawk committed
1269

1270 1271
    // UAS STATUS
    showTheWidget(MENU_STATUS, currentView);
1272

1273 1274
    // DETECTION
    showTheWidget(MENU_DETECTION, currentView);
1275

1276 1277
    // DEBUG CONSOLE
    showTheWidget(MENU_DEBUG_CONSOLE, currentView);
1278

1279 1280
    // ONBOARD PARAMETERS
    showTheWidget(MENU_PARAMETERS, currentView);
1281

1282 1283
    // WATCHDOG
    showTheWidget(MENU_WATCHDOG, currentView);
1284

1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297
    // HUD
    showTheWidget(MENU_HUD, currentView);
    if (headUpDockWidget)
    {
        HUD* tmpHud = dynamic_cast<HUD*>( headUpDockWidget->widget() );
        if (tmpHud){
            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HUD,currentView)).toBool()){
                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HUD, currentView)).toInt()),
                              hsiDockWidget);
                headUpDockWidget->show();
            } else {
                headUpDockWidget->hide();
            }
1298
        }
1299
    }
1300

1301

1302 1303
    // RC View
    showTheWidget(MENU_RC_VIEW, currentView);
1304

1305 1306
    // SLUGS DATA
    showTheWidget(MENU_SLUGS_DATA, currentView);
1307

1308 1309
    // SLUGS PID
    showTheWidget(MENU_SLUGS_PID, currentView);
1310

1311 1312
    // SLUGS HIL
    showTheWidget(MENU_SLUGS_HIL, currentView);
1313

1314 1315
    // SLUGS CAMERA
    showTheWidget(MENU_SLUGS_CAMERA, currentView);
1316

1317 1318
    // HORIZONTAL SITUATION INDICATOR
    showTheWidget(MENU_HSI, currentView);
1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
    //    if (hsiDockWidget)
    //    {
    //        HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
    //        if (hsi){
    //            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HSI,currentView)).toBool()){
    //                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HSI, currentView)).toInt()),
    //                              hsiDockWidget);
    //            }
    //        }
    //    }
1329

1330 1331
    // HEAD DOWN 1
    showTheWidget(MENU_HDD_1, currentView);
1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
    //    if (headDown1DockWidget)
    //    {
    //        HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown1DockWidget->widget());
    //        if (hdd) {
    //            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HDD_1,currentView)).toBool()) {
    //                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HDD_1, currentView)).toInt()),
    //                              headDown1DockWidget);
    //                headDown1DockWidget->show();
    //                hdd->start();
    //            } else {
    //                headDown1DockWidget->hide();;
    //                hdd->stop();
    //            }
    //        }
    //    }
1347 1348 1349

    // HEAD DOWN 2
    showTheWidget(MENU_HDD_2, currentView);
1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364
    //    if (headDown2DockWidget)
    //    {
    //        HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown2DockWidget->widget());
    //        if (hdd){
    //            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HDD_2,currentView)).toBool()){
    //                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HDD_2, currentView)).toInt()),
    //                              headDown2DockWidget);
    //                headDown2DockWidget->show();
    //                hdd->start();
    //            } else {
    //                headDown2DockWidget->hide();
    //                hdd->stop();
    //            }
    //        }
    //    }
1365

1366
    this->show();
1367

1368
}
1369

1370 1371 1372 1373
void MainWindow::showTheCentralWidget (TOOLS_WIDGET_NAMES centralWidget, VIEW_SECTIONS view)
{
    bool tempVisible;
    QWidget* tempWidget = dockWidgets[centralWidget];
1374

1375 1376 1377
    tempVisible =  settings.value(buildMenuKey (SUB_SECTION_CHECKED,centralWidget,view)).toBool();
    qDebug() << buildMenuKey (SUB_SECTION_CHECKED,centralWidget,view) << tempVisible;
    if (toolsMenuActions[centralWidget])
1378
    {
1379
        toolsMenuActions[centralWidget]->setChecked(tempVisible);
1380
    }
1381

1382
    if (centerStack && tempWidget && tempVisible)
1383
    {
1384
        centerStack->setCurrentWidget(tempWidget);
1385
    }
1386 1387
}

pixhawk's avatar
pixhawk committed
1388
void MainWindow::loadWidgets()
pixhawk's avatar
pixhawk committed
1389
{
1390 1391
    loadOperatorView();
    //loadMAVLinkView();
pixhawk's avatar
pixhawk committed
1392 1393
    //loadPilotView();
}
1394

1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411
void MainWindow::loadDataView(QString fileName)
{
    // DATAPLOT
    if (dataplotWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            centerStack->setCurrentWidget(dataplotWidget);
            dataplotWidget->loadFile(fileName);
        }
    }
}

void MainWindow::load3DMapView()
{
#ifdef QGC_OSGEARTH_ENABLED
1412
    clearView();
1413

1414 1415 1416 1417 1418 1419 1420 1421 1422 1423
    // 3D map
    if (_3DMapWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            //map3DWidget->setActive(true);
            centerStack->setCurrentWidget(_3DMapWidget);
        }
    }
1424 1425 1426 1427 1428
#endif
}

void MainWindow::loadGoogleEarthView()
{
1429
#if (defined _MSC_VER) | (defined Q_OS_MAC)
1430
    clearView();
1431

1432 1433
    // 3D map
    if (gEarthWidget)
1434 1435 1436 1437
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
1438
            centerStack->setCurrentWidget(gEarthWidget);
1439 1440
        }
    }
1441
#endif
1442 1443 1444

}

1445
void MainWindow::load3DView()
1446 1447
{
#ifdef QGC_OSG_ENABLED
1448
    clearView();
1449

1450 1451
    // 3D map
    if (_3DWidget)
1452
    {
1453 1454 1455 1456 1457 1458
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            //map3DWidget->setActive(true);
            centerStack->setCurrentWidget(_3DWidget);
        }
1459
    }
1460 1461 1462
#endif
}