MainWindow.cc 63.4 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
#include "MAVLinkSimulationLink.h"
#include "SerialLink.h"
#include "UDPLink.h"
#include "MAVLinkProtocol.h"
#include "CommConfigurationWindow.h"
25
#include "QGCWaypointListMulti.h"
pixhawk's avatar
pixhawk committed
26 27
#include "MainWindow.h"
#include "JoystickWidget.h"
pixhawk's avatar
pixhawk committed
28
#include "GAudioOutput.h"
29
#include "QGCToolWidget.h"
30
#include "QGCMAVLinkLogPlayer.h"
31
#include "QGCSettingsWidget.h"
32

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

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

pixhawk's avatar
pixhawk committed
41

42
#include "LogCompressor.h"
pixhawk's avatar
pixhawk committed
43

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

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

pixhawk's avatar
pixhawk committed
58 59 60 61 62 63 64
/**
* 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()
**/
65
MainWindow::MainWindow(QWidget *parent):
pixhawk's avatar
pixhawk committed
66
        QMainWindow(parent),
67
        toolsMenuActions(),
68
        currentView(VIEW_UNCONNECTED),
69
        aboutToCloseFlag(false),
70 71
        changingViewsFlag(false),
        styleFileName(QCoreApplication::applicationDirPath() + "/style-indoor.css")
pixhawk's avatar
pixhawk committed
72
{
73 74 75 76 77 78 79
    if (!settings.contains("CURRENT_VIEW"))
    {
        // Set this view as default view
        settings.setValue("CURRENT_VIEW", currentView);
    }
    else
    {
80 81 82 83 84
        // LOAD THE LAST VIEW
        VIEW_SECTIONS currentViewCandidate = (VIEW_SECTIONS) settings.value("CURRENT_VIEW", currentView).toInt();
        if (currentViewCandidate != VIEW_ENGINEER &&
            currentViewCandidate != VIEW_OPERATOR &&
            currentViewCandidate != VIEW_PILOT)
85
        {
86
            currentView = currentViewCandidate;
87
        }
88 89
    }

90
    setDefaultSettingsForAp();
91

92 93
    settings.sync();

pixhawk's avatar
pixhawk committed
94 95 96
    // Setup user interface
    ui.setupUi(this);

97 98
    setVisible(false);

99
    buildCommonWidgets();
100

101
    connectCommonWidgets();
102

103
    arrangeCommonCenterStack();
104 105

    configureWindowName();
pixhawk's avatar
pixhawk committed
106 107 108 109

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

pixhawk's avatar
pixhawk committed
111
    // Set style sheet as last step
112 113 114 115 116 117 118
    QFile* styleSheet = new QFile(":/images/style-mission.css");
    if (styleSheet->open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QString style = QString(styleSheet->readAll());
        style.replace("ICONDIR", QCoreApplication::applicationDirPath()+ "/images/");
        qApp->setStyleSheet(style);
    }
pixhawk's avatar
pixhawk committed
119

120
    // Create actions
121
    connectCommonActions();
122

123 124 125
    // Set dock options
    setDockOptions(AnimatedDocks | AllowTabbedDocks | AllowNestedDocks);

126
    // Load mavlink view as default widget set
127
    //loadMAVLinkView();
128

lm's avatar
lm committed
129 130
    statusBar()->setSizeGripEnabled(true);

131 132
    // Restore the window position and size
    if (settings.contains(getWindowGeometryKey()))
133 134
    {
        // Restore the window geometry
135
        restoreGeometry(settings.value(getWindowGeometryKey()).toByteArray());
136 137 138 139 140 141
    }
    else
    {
        // Adjust the size
        adjustSize();
    }
pixhawk's avatar
pixhawk committed
142

143 144 145 146 147 148
    // Populate link menu
    QList<LinkInterface*> links = LinkManager::instance()->getLinks();
    foreach(LinkInterface* link, links)
    {
        this->addLink(link);
    }
149

150 151
    connect(LinkManager::instance(), SIGNAL(newLink(LinkInterface*)), this, SLOT(addLink(LinkInterface*)));

152 153 154 155 156 157
    // Connect user interface devices
    if (!joystick)
    {
        joystick = new JoystickInput();
    }

lm's avatar
lm committed
158 159
    // Enable and update view
    presentView();
pixhawk's avatar
pixhawk committed
160 161
}

pixhawk's avatar
pixhawk committed
162
MainWindow::~MainWindow()
pixhawk's avatar
pixhawk committed
163
{
164
    delete mavlink;
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
    delete joystick;

    // Get and delete all dockwidgets and contained
    // widgets
    QObjectList childList( this->children() );

    QObjectList::iterator i;
    QDockWidget* dockWidget;
    for (i = childList.begin(); i != childList.end(); ++i)
    {
        dockWidget = dynamic_cast<QDockWidget*>(*i);
        if (dockWidget)
        {
            // Remove dock widget from main window
            removeDockWidget(dockWidget);
            delete dockWidget->widget();
            delete dockWidget;
        }
    }
pixhawk's avatar
pixhawk committed
184 185
}

186 187 188 189 190 191 192 193 194 195 196 197
/**
 * Set default settings for this AP type.
 */
void MainWindow::setDefaultSettingsForAp()
{
    // Check if the settings exist, instantiate defaults if necessary

    // UNCONNECTED VIEW DEFAULT
    QString centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_MAP, VIEW_UNCONNECTED);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);
198 199 200 201 202

        // ENABLE UAS LIST
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_UAS_LIST, VIEW_UNCONNECTED), true);
        // ENABLE COMMUNICATION CONSOLE
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_DEBUG_CONSOLE, VIEW_UNCONNECTED), true);
203 204 205 206 207 208 209 210 211 212
    }

    // OPERATOR VIEW DEFAULT
    centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_MAP, VIEW_OPERATOR);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);

        // ENABLE UAS LIST
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_UAS_LIST,VIEW_OPERATOR), true);
213 214
        // ENABLE HUD TOOL WIDGET
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_HUD,VIEW_OPERATOR), true);
215 216
        // ENABLE WAYPOINTS
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_WAYPOINTS,VIEW_OPERATOR), true);
217 218 219 220 221 222 223
    }

    // ENGINEER VIEW DEFAULT
    centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_LINECHART, VIEW_ENGINEER);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);
224 225
        // Enable Parameter widget
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_PARAMETERS,VIEW_ENGINEER), true);
226 227 228 229 230 231 232 233 234 235 236 237 238 239
    }

    // MAVLINK VIEW DEFAULT
    centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_PROTOCOL, VIEW_MAVLINK);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);
    }

    // PILOT VIEW DEFAULT
    centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_HUD, VIEW_PILOT);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);
240 241
        // Enable Flight display
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_HDD_1,VIEW_PILOT), true);
242 243 244
    }
}

lm's avatar
lm committed
245 246 247 248 249 250 251 252 253 254 255 256 257
void MainWindow::resizeEvent(QResizeEvent * event)
{
    Q_UNUSED(event);
    if (height() < 800)
    {
        ui.statusBar->setVisible(false);
    }
    else
    {
        ui.statusBar->setVisible(true);
    }
}

258 259
QString MainWindow::getWindowStateKey()
{
260
    return QString::number(currentView)+"_windowstate";
261 262 263 264
}

QString MainWindow::getWindowGeometryKey()
{
265 266
    //return QString::number(currentView)+"_geometry";
    return "_geometry";
267 268
}

lm's avatar
lm committed
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
void MainWindow::buildCustomWidget()
{
    // Show custom widgets only if UAS is connected
    if (UASManager::instance()->getActiveUAS() != NULL)
    {
        // Enable custom widgets
        ui.actionNewCustomWidget->setEnabled(true);

        // Create custom widgets
        QList<QGCToolWidget*> widgets = QGCToolWidget::createWidgetsFromSettings(this);

        if (widgets.size() > 0)
        {
            ui.menuTools->addSeparator();
        }

        for(int i = 0; i < widgets.size(); ++i)
        {
            // Check if this widget already has a parent, do not create it in this case
            QDockWidget* dock = dynamic_cast<QDockWidget*>(widgets.at(i)->parentWidget());
            if (!dock)
            {
                QDockWidget* dock = new QDockWidget(widgets.at(i)->windowTitle(), this);
                dock->setWidget(widgets.at(i));
                connect(widgets.at(i), SIGNAL(destroyed()), dock, SLOT(deleteLater()));
                QAction* showAction = new QAction(widgets.at(i)->windowTitle(), this);
                connect(showAction, SIGNAL(triggered(bool)), dock, SLOT(setVisible(bool)));
                connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool)));
                widgets.at(i)->setMainMenuAction(showAction);
                ui.menuTools->addAction(showAction);
                addDockWidget(Qt::BottomDockWidgetArea, dock);
            }
        }
    }
}

305 306 307 308
void MainWindow::buildCommonWidgets()
{
    //TODO:  move protocol outside UI
    mavlink     = new MAVLinkProtocol();
309
    connect(mavlink, SIGNAL(protocolStatusMessage(QString,QString)), this, SLOT(showCriticalMessage(QString,QString)), Qt::QueuedConnection);
310 311

    // Dock widgets
312 313 314
    if (!controlDockWidget)
    {
        controlDockWidget = new QDockWidget(tr("Control"), this);
315
        controlDockWidget->setObjectName("UNMANNED_SYSTEM_CONTROL_DOCKWIDGET");
316
        controlDockWidget->setWidget( new UASControlWidget(this) );
317
        addToToolsMenu (controlDockWidget, tr("Control"), SLOT(showToolWidget(bool)), MENU_UAS_CONTROL, Qt::LeftDockWidgetArea);
318
    }
319

320 321 322 323
    if (!listDockWidget)
    {
        listDockWidget = new QDockWidget(tr("Unmanned Systems"), this);
        listDockWidget->setWidget( new UASListWidget(this) );
324
        listDockWidget->setObjectName("UNMANNED_SYSTEMS_LIST_DOCKWIDGET");
325
        addToToolsMenu (listDockWidget, tr("Unmanned Systems"), SLOT(showToolWidget(bool)), MENU_UAS_LIST, Qt::RightDockWidgetArea);
326
    }
327

328 329
    if (!waypointsDockWidget)
    {
330
        waypointsDockWidget = new QDockWidget(tr("Mission Plan"), this);
331
        waypointsDockWidget->setWidget( new QGCWaypointListMulti(this) );
332
        waypointsDockWidget->setObjectName("WAYPOINT_LIST_DOCKWIDGET");
333
        addToToolsMenu (waypointsDockWidget, tr("Mission Plan"), SLOT(showToolWidget(bool)), MENU_WAYPOINTS, Qt::BottomDockWidgetArea);
334
    }
335

336 337 338 339
    if (!infoDockWidget)
    {
        infoDockWidget = new QDockWidget(tr("Status Details"), this);
        infoDockWidget->setWidget( new UASInfoWidget(this) );
pixhawk's avatar
pixhawk committed
340
        infoDockWidget->setObjectName("UAS_STATUS_DETAILS_DOCKWIDGET");
341
        addToToolsMenu (infoDockWidget, tr("Status Details"), SLOT(showToolWidget(bool)), MENU_STATUS, Qt::RightDockWidgetArea);
342
    }
343

344 345 346 347
    if (!debugConsoleDockWidget)
    {
        debugConsoleDockWidget = new QDockWidget(tr("Communication Console"), this);
        debugConsoleDockWidget->setWidget( new DebugConsole(this) );
348
        debugConsoleDockWidget->setObjectName("COMMUNICATION_DEBUG_CONSOLE_DOCKWIDGET");
349
        addToToolsMenu (debugConsoleDockWidget, tr("Communication Console"), SLOT(showToolWidget(bool)), MENU_DEBUG_CONSOLE, Qt::BottomDockWidgetArea);
350
    }
351

352 353 354 355 356
    if (!logPlayerDockWidget)
    {
        logPlayerDockWidget = new QDockWidget(tr("MAVLink Log Player"), this);
        logPlayerDockWidget->setWidget( new QGCMAVLinkLogPlayer(mavlink, this) );
        logPlayerDockWidget->setObjectName("MAVLINK_LOG_PLAYER_DOCKWIDGET");
357
        addToToolsMenu(logPlayerDockWidget, tr("MAVLink Log Replay"), SLOT(showToolWidget(bool)), MENU_MAVLINK_LOG_PLAYER, Qt::RightDockWidgetArea);
358 359
    }

360
    // Center widgets
361 362
    if (!mapWidget)
    {
363
        mapWidget = new MapWidget(this);
364 365
        addToCentralWidgetsMenu (mapWidget, "Maps", SLOT(showCentralWidget()),CENTRAL_MAP);
    }
366

367 368 369 370 371
    if (!protocolWidget)
    {
        protocolWidget    = new XMLCommProtocolWidget(this);
        addToCentralWidgetsMenu (protocolWidget, "Mavlink Generator", SLOT(showCentralWidget()),CENTRAL_PROTOCOL);
    }
lm's avatar
lm committed
372

373
#ifdef MAVLINK_ENABLED_SLUGS
Alejandro's avatar
Alejandro committed
374 375 376 377 378
    //TODO temporaly debug
    if (!slugsHilSimWidget)
    {
        slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this);
        slugsHilSimWidget->setWidget( new SlugsHilSim(this));
379
        addToToolsMenu (slugsHilSimWidget, tr("HIL Sim Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_HIL, Qt::LeftDockWidgetArea);
Alejandro's avatar
Alejandro committed
380 381 382 383 384 385 386
    }

    //TODO temporaly debug
    if (!slugsCamControlWidget)
    {
        slugsCamControlWidget = new QDockWidget(tr("Slugs Video Camera Control"), this);
        slugsCamControlWidget->setWidget(new SlugsVideoCamControl(this));
387
        addToToolsMenu (slugsCamControlWidget, tr("Camera Control"), SLOT(showToolWidget(bool)), MENU_SLUGS_CAMERA, Qt::BottomDockWidgetArea);
Alejandro's avatar
Alejandro committed
388
    }
389 390
#endif

lm's avatar
lm committed
391 392 393 394 395
    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
        addToCentralWidgetsMenu (dataplotWidget, "Data Plot", SLOT(showCentralWidget()),CENTRAL_DATA_PLOT);
    }
396
}
397

398

399
void MainWindow::buildPxWidgets()
400
{
pixhawk's avatar
pixhawk committed
401 402
    //FIXME: memory of acceptList will never be freed again
    QStringList* acceptList = new QStringList();
pixhawk's avatar
pixhawk committed
403 404 405
    acceptList->append("-105,roll deg,deg,+105,s");
    acceptList->append("-105,pitch deg,deg,+105,s");
    acceptList->append("-105,heading deg,deg,+105,s");
406

pixhawk's avatar
pixhawk committed
407 408 409
    acceptList->append("-60,rollspeed d/s,deg/s,+60,s");
    acceptList->append("-60,pitchspeed d/s,deg/s,+60,s");
    acceptList->append("-60,yawspeed d/s,deg/s,+60,s");
410
    acceptList->append("0,airspeed,m/s,30");
411 412
    acceptList->append("0,groundspeed,m/s,30");
    acceptList->append("0,climbrate,m/s,30");
413
    acceptList->append("0,throttle,%,100");
414

pixhawk's avatar
pixhawk committed
415 416
    //FIXME: memory of acceptList2 will never be freed again
    QStringList* acceptList2 = new QStringList();
417 418 419 420 421 422 423 424
    acceptList2->append("900,servo #1,us,2100,s");
    acceptList2->append("900,servo #2,us,2100,s");
    acceptList2->append("900,servo #3,us,2100,s");
    acceptList2->append("900,servo #4,us,2100,s");
    acceptList2->append("900,servo #5,us,2100,s");
    acceptList2->append("900,servo #6,us,2100,s");
    acceptList2->append("900,servo #7,us,2100,s");
    acceptList2->append("900,servo #8,us,2100,s");
lm's avatar
lm committed
425
    acceptList2->append("0,abs pressure,hPa,65500");
426 427 428
    //acceptList2->append("-2048,accel. x,raw,2048,s");
    //acceptList2->append("-2048,accel. y,raw,2048,s");
    //acceptList2->append("-2048,accel. z,raw,2048,s");
429

430 431 432 433 434 435
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
        addToCentralWidgetsMenu(linechartWidget, "Line Plots", SLOT(showCentralWidget()), CENTRAL_LINECHART);
    }
436 437


438 439 440 441 442
    if (!hudWidget)
    {
        hudWidget         = new HUD(320, 240, this);
        addToCentralWidgetsMenu(hudWidget, "HUD", SLOT(showCentralWidget()), CENTRAL_HUD);
    }
443

444 445 446 447 448
    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
        addToCentralWidgetsMenu(dataplotWidget, "Data Plots", SLOT(showCentralWidget()), CENTRAL_DATA_PLOT);
    }
449

450
#ifdef QGC_OSG_ENABLED
451 452
    if (!_3DWidget)
    {
453 454
        _3DWidget         = Q3DWidgetFactory::get("PIXHAWK");
        addToCentralWidgetsMenu(_3DWidget, "Local 3D", SLOT(showCentralWidget()), CENTRAL_3D_LOCAL);
455
    }
456
#endif
457

458
#ifdef QGC_OSGEARTH_ENABLED
459 460 461 462 463
    if (!_3DMapWidget)
    {
        _3DMapWidget = Q3DWidgetFactory::get("MAP3D");
        addToCentralWidgetsMenu(_3DMapWidget, "OSG Earth 3D", SLOT(showCentralWidget()), CENTRAL_OSGEARTH);
    }
464
#endif
lm's avatar
lm committed
465

466
#if (defined _MSC_VER) | (defined Q_OS_MAC)
467 468 469 470 471
    if (!gEarthWidget)
    {
        gEarthWidget = new QGCGoogleEarthView(this);
        addToCentralWidgetsMenu(gEarthWidget, "Google Earth", SLOT(showCentralWidget()), CENTRAL_GOOGLE_EARTH);
    }
472

473
#endif
474

pixhawk's avatar
pixhawk committed
475
    // Dock widgets
476

477 478 479 480
    if (!detectionDockWidget)
    {
        detectionDockWidget = new QDockWidget(tr("Object Recognition"), this);
        detectionDockWidget->setWidget( new ObjectDetectionView("images/patterns", this) );
pixhawk's avatar
pixhawk committed
481
        detectionDockWidget->setObjectName("OBJECT_DETECTION_DOCK_WIDGET");
482
        addToToolsMenu (detectionDockWidget, tr("Object Recognition"), SLOT(showToolWidget(bool)), MENU_DETECTION, Qt::RightDockWidgetArea);
483
    }
484

485 486
    if (!parametersDockWidget)
    {
487
        parametersDockWidget = new QDockWidget(tr("Calibration and Onboard Parameters"), this);
488
        parametersDockWidget->setWidget( new ParameterInterface(this) );
pixhawk's avatar
pixhawk committed
489
        parametersDockWidget->setObjectName("PARAMETER_INTERFACE_DOCKWIDGET");
490
        addToToolsMenu (parametersDockWidget, tr("Calibration and Parameters"), SLOT(showToolWidget(bool)), MENU_PARAMETERS, Qt::RightDockWidgetArea);
491
    }
492

493 494 495 496
    if (!watchdogControlDockWidget)
    {
        watchdogControlDockWidget = new QDockWidget(tr("Process Control"), this);
        watchdogControlDockWidget->setWidget( new WatchdogControl(this) );
pixhawk's avatar
pixhawk committed
497
        watchdogControlDockWidget->setObjectName("WATCHDOG_CONTROL_DOCKWIDGET");
498
        addToToolsMenu (watchdogControlDockWidget, tr("Process Control"), SLOT(showToolWidget(bool)), MENU_WATCHDOG, Qt::BottomDockWidgetArea);
499
    }
500

501 502 503 504
    if (!hsiDockWidget)
    {
        hsiDockWidget = new QDockWidget(tr("Horizontal Situation Indicator"), this);
        hsiDockWidget->setWidget( new HSIDisplay(this) );
505
        hsiDockWidget->setObjectName("HORIZONTAL_SITUATION_INDICATOR_DOCK_WIDGET");
506
        addToToolsMenu (hsiDockWidget, tr("HSI"), SLOT(showToolWidget(bool)), MENU_HSI, Qt::BottomDockWidgetArea);
507
    }
508

509 510
    if (!headDown1DockWidget)
    {
511 512
        headDown1DockWidget = new QDockWidget(tr("Flight Display"), this);
        headDown1DockWidget->setWidget( new HDDisplay(acceptList, "Flight Display", this) );
513
        headDown1DockWidget->setObjectName("HEAD_DOWN_DISPLAY_1_DOCK_WIDGET");
514
        addToToolsMenu (headDown1DockWidget, tr("Flight Display"), SLOT(showToolWidget(bool)), MENU_HDD_1, Qt::RightDockWidgetArea);
515
    }
516

517 518
    if (!headDown2DockWidget)
    {
519 520
        headDown2DockWidget = new QDockWidget(tr("Actuator Status"), this);
        headDown2DockWidget->setWidget( new HDDisplay(acceptList2, "Actuator Status", this) );
521
        headDown2DockWidget->setObjectName("HEAD_DOWN_DISPLAY_2_DOCK_WIDGET");
522
        addToToolsMenu (headDown2DockWidget, tr("Actuator Status"), SLOT(showToolWidget(bool)), MENU_HDD_2, Qt::RightDockWidgetArea);
523
    }
524

525 526 527 528
    if (!rcViewDockWidget)
    {
        rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
        rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
529
        rcViewDockWidget->setObjectName("RADIO_CONTROL_CHANNELS_DOCK_WIDGET");
530
        addToToolsMenu (rcViewDockWidget, tr("Radio Control"), SLOT(showToolWidget(bool)), MENU_RC_VIEW, Qt::BottomDockWidgetArea);
531
    }
532

533 534 535 536
    if (!headUpDockWidget)
    {
        headUpDockWidget = new QDockWidget(tr("HUD"), this);
        headUpDockWidget->setWidget( new HUD(320, 240, this));
537
        headUpDockWidget->setObjectName("HEAD_UP_DISPLAY_DOCK_WIDGET");
538
        addToToolsMenu (headUpDockWidget, tr("Head Up Display"), SLOT(showToolWidget(bool)), MENU_HUD, Qt::RightDockWidgetArea);
539
    }
540

pixhawk's avatar
pixhawk committed
541 542 543 544 545 546 547 548 549
    if (!video1DockWidget)
    {
        video1DockWidget = new QDockWidget(tr("Video Stream 1"), this);
        HUD* video1 =  new HUD(160, 120, this);
        video1->enableHUDInstruments(false);
        video1->enableVideo(true);
        // FIXME select video stream as well
        video1DockWidget->setWidget(video1);
        video1DockWidget->setObjectName("VIDEO_STREAM_1_DOCK_WIDGET");
550
        addToToolsMenu (video1DockWidget, tr("Video Stream 1"), SLOT(showToolWidget(bool)), MENU_VIDEO_STREAM_1, Qt::LeftDockWidgetArea);
pixhawk's avatar
pixhawk committed
551 552 553 554 555 556 557 558 559 560 561
    }

    if (!video2DockWidget)
    {
        video2DockWidget = new QDockWidget(tr("Video Stream 2"), this);
        HUD* video2 =  new HUD(160, 120, this);
        video2->enableHUDInstruments(false);
        video2->enableVideo(true);
        // FIXME select video stream as well
        video2DockWidget->setWidget(video2);
        video2DockWidget->setObjectName("VIDEO_STREAM_2_DOCK_WIDGET");
562
        addToToolsMenu (video2DockWidget, tr("Video Stream 2"), SLOT(showToolWidget(bool)), MENU_VIDEO_STREAM_2, Qt::LeftDockWidgetArea);
pixhawk's avatar
pixhawk committed
563 564
    }

pixhawk's avatar
pixhawk committed
565 566
    // Dialogue widgets
    //FIXME: free memory in destructor
567 568 569 570
}

void MainWindow::buildSlugsWidgets()
{
571 572 573 574 575
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
    }
576

577 578 579 580 581
    if (!headUpDockWidget)
    {
        // Dock widgets
        headUpDockWidget = new QDockWidget(tr("Control Indicator"), this);
        headUpDockWidget->setWidget( new HUD(320, 240, this));
pixhawk's avatar
pixhawk committed
582
        headUpDockWidget->setObjectName("HEAD_UP_DISPLAY_DOCK_WIDGET");
583
        addToToolsMenu (headUpDockWidget, tr("HUD"), SLOT(showToolWidget(bool)), MENU_HUD, Qt::LeftDockWidgetArea);
584
    }
585

586 587 588 589
    if (!rcViewDockWidget)
    {
        rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
        rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
pixhawk's avatar
pixhawk committed
590
        rcViewDockWidget->setObjectName("RADIO_CONTROL_CHANNELS_DOCK_WIDGET");
591
        addToToolsMenu (rcViewDockWidget, tr("Radio Control"), SLOT(showToolWidget(bool)), MENU_RC_VIEW, Qt::BottomDockWidgetArea);
592
    }
593

594 595 596 597 598
    if (!slugsDataWidget)
    {
        // Dialog widgets
        slugsDataWidget = new QDockWidget(tr("Slugs Data"), this);
        slugsDataWidget->setWidget( new SlugsDataSensorView(this));
pixhawk's avatar
pixhawk committed
599
        slugsDataWidget->setObjectName("SLUGS_DATA_DOCK_WIDGET");
600
        addToToolsMenu (slugsDataWidget, tr("Telemetry Data"), SLOT(showToolWidget(bool)), MENU_SLUGS_DATA, Qt::RightDockWidgetArea);
601
    }
602

603 604 605 606
    if (!slugsPIDControlWidget)
    {
        slugsPIDControlWidget = new QDockWidget(tr("Slugs PID Control"), this);
        slugsPIDControlWidget->setWidget(new SlugsPIDControl(this));
pixhawk's avatar
pixhawk committed
607
        slugsPIDControlWidget->setObjectName("SLUGS_PID_CONTROL_DOCK_WIDGET");
608
        addToToolsMenu (slugsPIDControlWidget, tr("PID Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_PID, Qt::LeftDockWidgetArea);
609
    }
610

611 612 613 614
    if (!slugsHilSimWidget)
    {
        slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this);
        slugsHilSimWidget->setWidget( new SlugsHilSim(this));
pixhawk's avatar
pixhawk committed
615
        slugsHilSimWidget->setObjectName("SLUGS_HIL_SIM_DOCK_WIDGET");
616
        addToToolsMenu (slugsHilSimWidget, tr("HIL Sim Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_HIL, Qt::LeftDockWidgetArea);
617
    }
618

619 620 621 622
    if (!slugsCamControlWidget)
    {
        slugsCamControlWidget = new QDockWidget(tr("Slugs Video Camera Control"), this);
        slugsCamControlWidget->setWidget(new SlugsVideoCamControl(this));
pixhawk's avatar
pixhawk committed
623
        slugsCamControlWidget->setObjectName("SLUGS_CAM_CONTROL_DOCK_WIDGET");
624
        addToToolsMenu (slugsCamControlWidget, tr("Camera Control"), SLOT(showToolWidget(bool)), MENU_SLUGS_CAMERA, Qt::BottomDockWidgetArea);
625
    }
626
}
627 628 629 630 631


void MainWindow::addToCentralWidgetsMenu ( QWidget* widget,
                                           const QString title,
                                           const char * slotName,
632 633
                                           TOOLS_WIDGET_NAMES centralWidget)
{
634
    QAction* tempAction;
635

636

637
// Not needed any more - separate menu now available
638

639 640 641 642 643 644 645 646 647
//    // Add the separator that will separate tools from central Widgets
//    if (!toolsMenuActions[CENTRAL_SEPARATOR])
//    {
//        tempAction = ui.menuTools->addSeparator();
//        toolsMenuActions[CENTRAL_SEPARATOR] = tempAction;
//        tempAction->setData(CENTRAL_SEPARATOR);
//    }

    tempAction = ui.menuMain->addAction(title);
648

649 650
    tempAction->setCheckable(true);
    tempAction->setData(centralWidget);
651

652 653 654
    // populate the Hashes
    toolsMenuActions[centralWidget] = tempAction;
    dockWidgets[centralWidget] = widget;
655

656
    QString chKey = buildMenuKey(SUB_SECTION_CHECKED, centralWidget, currentView);
657

658 659
    if (!settings.contains(chKey))
    {
660 661 662
        settings.setValue(chKey,false);
        tempAction->setChecked(false);
    }
663 664 665 666
    else
    {
        tempAction->setChecked(settings.value(chKey).toBool());
    }
667

668
    // connect the action
669
    connect(tempAction,SIGNAL(triggered(bool)),this, slotName);
670 671 672
}


lm's avatar
lm committed
673 674
void MainWindow::showCentralWidget()
{
675
    QAction* senderAction = qobject_cast<QAction *>(sender());
676 677 678 679

    // Block sender action while manipulating state
    senderAction->blockSignals(true);

680 681
    int tool = senderAction->data().toInt();
    QString chKey;
682

683
    // check the current action
684

685 686 687 688
    if (senderAction && dockWidgets[tool])
    {
        // uncheck all central widget actions
        QHashIterator<int, QAction*> i(toolsMenuActions);
689 690
        while (i.hasNext())
        {
691
            i.next();
692 693 694
            //qDebug() << "shCW" << i.key() << "read";
            if (i.value() && i.value()->data().toInt() > 255)
            {
695 696 697
                // Block signals and uncheck action
                // firing would be unneccesary
                i.value()->blockSignals(true);
698
                i.value()->setChecked(false);
699
                i.value()->blockSignals(false);
700 701 702 703 704 705

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

707
        // check the current action
708
        //qDebug() << senderAction->text();
709
        senderAction->setChecked(true);
710

711 712
        // update the central widget
        centerStack->setCurrentWidget(dockWidgets[tool]);
713

714 715 716
        // store the selected central widget
        chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(tool), currentView);
        settings.setValue(chKey,true);
717

718 719 720
        // Unblock sender action
        senderAction->blockSignals(false);

721 722
        presentView();
    }
723
}
724

lm's avatar
lm committed
725 726 727 728
/**
 * Adds a widget to the tools menu and sets it visible if it was
 * enabled last time.
 */
729
void MainWindow::addToToolsMenu ( QWidget* widget,
730 731 732 733
                                  const QString title,
                                  const char * slotName,
                                  TOOLS_WIDGET_NAMES tool,
                                  Qt::DockWidgetArea location)
lm's avatar
lm committed
734
{
735 736
    QAction* tempAction;
    QString posKey, chKey;
737

738

739 740
    if (toolsMenuActions[CENTRAL_SEPARATOR])
    {
741 742 743
        tempAction = new QAction(title, this);
        ui.menuTools->insertAction(toolsMenuActions[CENTRAL_SEPARATOR],
                                   tempAction);
744 745 746
    }
    else
    {
747 748
        tempAction = ui.menuTools->addAction(title);
    }
749

750 751
    tempAction->setCheckable(true);
    tempAction->setData(tool);
752

753 754 755
    // populate the Hashes
    toolsMenuActions[tool] = tempAction;
    dockWidgets[tool] = widget;
756
    //qDebug() << widget;
757

758
    posKey = buildMenuKey (SUB_SECTION_LOCATION,tool, currentView);
759

760 761
    if (!settings.contains(posKey))
    {
762 763
        settings.setValue(posKey,location);
        dockWidgetLocations[tool] = location;
764 765 766 767
    }
    else
    {
        dockWidgetLocations[tool] = static_cast <Qt::DockWidgetArea> (settings.value(posKey, Qt::RightDockWidgetArea).toInt());
768
    }
769

770
    chKey = buildMenuKey(SUB_SECTION_CHECKED,tool, currentView);
771

772 773 774 775
    if (!settings.contains(chKey))
    {
        settings.setValue(chKey,false);
        tempAction->setChecked(false);
776
        widget->setVisible(false);
777 778 779
    }
    else
    {
780
        tempAction->setChecked(settings.value(chKey, false).toBool());
781
        widget->setVisible(settings.value(chKey, false).toBool());
782
    }
783

784
    // connect the action
785 786 787
    connect(tempAction,SIGNAL(toggled(bool)),this, slotName);

    connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
788
            SIGNAL(visibilityChanged(bool)), this, SLOT(showToolWidget(bool)));
789

790 791
    //  connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
    //          SIGNAL(visibilityChanged(bool)), this, SLOT(updateVisibilitySettings(bool)));
792

793 794
    connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
            SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(updateLocationSettings(Qt::DockWidgetArea)));
795 796
}

797
void MainWindow::showToolWidget(bool visible)
798
{
799
    if (!aboutToCloseFlag && !changingViewsFlag)
800
    {
801 802
        QAction* action = qobject_cast<QAction *>(sender());

803 804
        // Prevent this to fire if undocked
        if (action)
805
        {
806
            int tool = action->data().toInt();
807

808
            QDockWidget* dockWidget = qobject_cast<QDockWidget *> (dockWidgets[tool]);
809

810 811 812 813 814 815 816 817 818 819 820
            if (dockWidget && dockWidget->isVisible() != visible)
            {
                if (visible)
                {
                    addDockWidget(dockWidgetLocations[tool], dockWidget);
                    dockWidget->show();
                }
                else
                {
                    removeDockWidget(dockWidget);
                }
821 822 823 824 825 826 827 828 829

                QHashIterator<int, QWidget*> i(dockWidgets);
                while (i.hasNext())
                {
                    i.next();
                    if ((static_cast <QDockWidget *>(dockWidgets[i.key()])) == dockWidget)
                    {
                        QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
                        settings.setValue(chKey,visible);
830
                        //qDebug() << "showToolWidget(): Set key" << chKey << "to" << visible;
831 832 833
                        break;
                    }
                }
834 835 836 837 838
            }
        }

        QDockWidget* dockWidget = qobject_cast<QDockWidget*>(QObject::sender());

839
        //qDebug() << "Trying to cast dockwidget" << dockWidget << "isvisible" << visible;
840 841 842 843 844 845

        if (dockWidget)
        {
            // Get action
            int tool = dockWidgets.key(dockWidget);

846
            //qDebug() << "Updating widget setting" << tool << "to" << visible;
847 848 849 850 851 852 853 854 855 856 857 858 859 860

            QAction* action = toolsMenuActions[tool];
            action->blockSignals(true);
            action->setChecked(visible);
            action->blockSignals(false);

            QHashIterator<int, QWidget*> i(dockWidgets);
            while (i.hasNext())
            {
                i.next();
                if ((static_cast <QDockWidget *>(dockWidgets[i.key()])) == dockWidget)
                {
                    QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
                    settings.setValue(chKey,visible);
861
                   // qDebug() << "showToolWidget(): Set key" << chKey << "to" << visible;
862 863 864
                    break;
                }
            }
865
        }
866 867 868 869
    }
}


870 871 872 873 874
void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view)
{
    bool tempVisible;
    Qt::DockWidgetArea tempLocation;
    QDockWidget* tempWidget = static_cast <QDockWidget *>(dockWidgets[widget]);
875

876
    tempVisible =  settings.value(buildMenuKey(SUB_SECTION_CHECKED,widget,view), false).toBool();
877

878
     //qDebug() << "showTheWidget(): Set key" << buildMenuKey(SUB_SECTION_CHECKED,widget,view) << "to" << tempVisible;
879

880 881 882 883
    if (tempWidget)
    {
        toolsMenuActions[widget]->setChecked(tempVisible);
    }
884 885


886
    //qDebug() <<  buildMenuKey (SUB_SECTION_CHECKED,widget,view) << tempVisible;
887

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

890
    if (tempWidget != NULL)
891
    {
892 893 894 895 896
        if (tempVisible)
        {
            addDockWidget(tempLocation, tempWidget);
            tempWidget->show();
        }
897 898
    }
}
899

900 901 902 903 904
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;

905 906 907 908 909
//    apType = (UASManager::instance() && UASManager::instance()->silentGetActiveUAS())?
//             UASManager::instance()->getActiveUAS()->getAutopilotType():
//             -1;

    apType = 1;
910

911 912 913 914 915
    return (QString::number(apType) + "_" +
            QString::number(SECTION_MENU) + "_" +
            QString::number(view) + "_" +
            QString::number(tool) + "_" +
            QString::number(section) + "_" );
916 917
}

918 919
void MainWindow::closeEvent(QCloseEvent *event)
{
920
    settings.setValue(getWindowGeometryKey(), saveGeometry());
921 922
    //settings.setValue("windowState", saveState());
    aboutToCloseFlag = true;
923
    mavlink->storeSettings();
924 925 926
    // Save the last current view in any case
    settings.setValue("CURRENT_VIEW", currentView);
    // Save the current window state, but only if a system is connected (else no real number of widgets would be present)
927
    if (UASManager::instance()->getUASList().length() > 0) settings.setValue(getWindowStateKey(), saveState(QGC::applicationVersion()));
928 929
    // Save the current view only if a UAS is connected
    if (UASManager::instance()->getUASList().length() > 0) settings.setValue("CURRENT_VIEW_WITH_UAS_CONNECTED", currentView);
930 931 932
    settings.sync();
    QMainWindow::closeEvent(event);
}
933

934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
void MainWindow::showDockWidget (bool vis)
{
    if (!aboutToCloseFlag && !changingViewsFlag)
    {
        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)
                {
                    QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
                    settings.setValue(chKey,vis);
                    toolsMenuActions[i.key()]->setChecked(vis);
                    break;
                }
            }
        }
    }
}
957

958 959
void MainWindow::updateVisibilitySettings (bool vis)
{
960
    if (!aboutToCloseFlag && !changingViewsFlag)
961 962 963 964 965 966
    {
        QDockWidget* temp = qobject_cast<QDockWidget *>(sender());

        if (temp)
        {
            QHashIterator<int, QWidget*> i(dockWidgets);
967 968
            while (i.hasNext())
            {
969
                i.next();
970 971
                if ((static_cast <QDockWidget *>(dockWidgets[i.key()])) == temp)
                {
972 973
                    QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
                    settings.setValue(chKey,vis);
974 975 976 977 978 979
                    toolsMenuActions[i.key()]->setChecked(vis);
                    break;
                }
            }
        }
    }
980 981
}

982 983 984
void MainWindow::updateLocationSettings (Qt::DockWidgetArea location)
{
    QDockWidget* temp = qobject_cast<QDockWidget *>(sender());
985

986 987 988 989 990 991 992 993 994 995 996
    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;
        }
    }
997 998
}

999 1000 1001
/**
 * Connect the signals and slots of the common window widgets
 */
1002
void MainWindow::connectCommonWidgets()
1003
{
pixhawk's avatar
pixhawk committed
1004 1005 1006 1007 1008
    if (infoDockWidget && infoDockWidget->widget())
    {
        connect(mavlink, SIGNAL(receiveLossChanged(int, float)),
                infoDockWidget->widget(), SLOT(updateSendLoss(int, float)));
    }
1009

pixhawk's avatar
pixhawk committed
1010 1011
    if (mapWidget && waypointsDockWidget->widget())
    {
1012

1013
    }
Alejandro's avatar
Alejandro committed
1014 1015 1016 1017 1018 1019

    //TODO temporaly debug
    if (slugsHilSimWidget && slugsHilSimWidget->widget()){
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsHilSimWidget->widget(), SLOT(activeUasSet(UASInterface*)));
    }
1020
}
1021

1022 1023
void MainWindow::createCustomWidget()
{
lm's avatar
lm committed
1024 1025 1026 1027 1028 1029 1030 1031
    QGCToolWidget* tool = new QGCToolWidget("Unnamed Tool", this);

    if (QGCToolWidget::instances()->size() < 2)
    {
        // This is the first widget
        ui.menuTools->addSeparator();
    }

1032
    QDockWidget* dock = new QDockWidget("Unnamed Tool", this);
lm's avatar
lm committed
1033
    connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater()));
1034
    dock->setWidget(tool);
lm's avatar
lm committed
1035 1036 1037 1038 1039 1040
    QAction* showAction = new QAction("Show Unnamed Tool", this);
    connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool)));
    connect(showAction, SIGNAL(triggered(bool)), dock, SLOT(setVisible(bool)));
    tool->setMainMenuAction(showAction);
    ui.menuTools->addAction(showAction);
    this->addDockWidget(Qt::BottomDockWidgetArea, dock);
1041
    dock->setVisible(true);
1042 1043 1044 1045
}

void MainWindow::connectPxWidgets()
{
1046
    // No special connections necessary at this point
1047 1048 1049 1050
}

void MainWindow::connectSlugsWidgets()
{
1051
    if (slugsHilSimWidget && slugsHilSimWidget->widget()){
1052 1053
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsHilSimWidget->widget(), SLOT(activeUasSet(UASInterface*)));
1054 1055 1056
    }

    if (slugsDataWidget && slugsDataWidget->widget()){
1057 1058
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsDataWidget->widget(), SLOT(setActiveUAS(UASInterface*)));
1059 1060
    }

1061

1062 1063
}

1064
void MainWindow::arrangeCommonCenterStack()
1065
{
1066
    centerStack = new QStackedWidget(this);
1067
    centerStack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1068

pixhawk's avatar
pixhawk committed
1069
    if (!centerStack) return;
1070

1071
    if (mapWidget && (centerStack->indexOf(mapWidget) == -1)) centerStack->addWidget(mapWidget);
lm's avatar
lm committed
1072
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
1073
    if (protocolWidget && (centerStack->indexOf(protocolWidget) == -1)) centerStack->addWidget(protocolWidget);
1074 1075 1076 1077 1078 1079 1080

    setCentralWidget(centerStack);
}

void MainWindow::arrangePxCenterStack()
{

1081 1082 1083 1084
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
1085

1086 1087

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

1089
#ifdef QGC_OSG_ENABLED
1090
    if (_3DWidget && (centerStack->indexOf(_3DWidget) == -1)) centerStack->addWidget(_3DWidget);
1091
#endif
1092
#ifdef QGC_OSGEARTH_ENABLED
1093
    if (_3DMapWidget && (centerStack->indexOf(_3DMapWidget) == -1)) centerStack->addWidget(_3DMapWidget);
1094
#endif
1095
#if (defined _MSC_VER) | (defined Q_OS_MAC)
1096
    if (gEarthWidget && (centerStack->indexOf(gEarthWidget) == -1)) centerStack->addWidget(gEarthWidget);
1097
#endif
1098 1099
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
1100 1101 1102 1103 1104
}

void MainWindow::arrangeSlugsCenterStack()
{

1105 1106 1107 1108
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
1109

1110 1111
    if (linechartWidget && (centerStack->indexOf(linechartWidget) == -1)) centerStack->addWidget(linechartWidget);
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
1112

1113 1114
}

1115 1116
void MainWindow::configureWindowName()
{
pixhawk's avatar
pixhawk committed
1117 1118 1119
    QList<QHostAddress> hostAddresses = QNetworkInterface::allAddresses();
    QString windowname = qApp->applicationName() + " " + qApp->applicationVersion();
    bool prevAddr = false;
1120

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

pixhawk's avatar
pixhawk committed
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
    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;
        }
    }
1133

pixhawk's avatar
pixhawk committed
1134
    windowname.append(")");
1135

pixhawk's avatar
pixhawk committed
1136
    setWindowTitle(windowname);
1137 1138

#ifndef Q_WS_MAC
pixhawk's avatar
pixhawk committed
1139
    //qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
1140 1141 1142
#endif
}

pixhawk's avatar
pixhawk committed
1143
void MainWindow::startVideoCapture()
pixhawk's avatar
pixhawk committed
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
{
    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);
1155 1156 1157
    //videoTimer->setInterval(40);
    //connect(videoTimer, SIGNAL(timeout()), this, SLOT(saveScreen()));
    //videoTimer->stop();
pixhawk's avatar
pixhawk committed
1158 1159
}

pixhawk's avatar
pixhawk committed
1160
void MainWindow::stopVideoCapture()
pixhawk's avatar
pixhawk committed
1161 1162 1163 1164 1165 1166
{
    videoTimer->stop();

    // TODO Convert raw images to PNG
}

pixhawk's avatar
pixhawk committed
1167
void MainWindow::saveScreen()
pixhawk's avatar
pixhawk committed
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177
{
    QPixmap window = QPixmap::grabWindow(this->winId());
    QString format = "bmp";

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

1178
void MainWindow::selectStylesheet()
pixhawk's avatar
pixhawk committed
1179
{