MainWindow.cc 67 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
        changingViewsFlag(false),
71 72 73
        styleFileName(QCoreApplication::applicationDirPath() + "/style-indoor.css"),
        autoReconnect(false),
        currentStyle(QGC_MAINWINDOW_STYLE_INDOOR)
pixhawk's avatar
pixhawk committed
74
{
75
    loadSettings();
76 77 78 79 80 81 82
    if (!settings.contains("CURRENT_VIEW"))
    {
        // Set this view as default view
        settings.setValue("CURRENT_VIEW", currentView);
    }
    else
    {
83 84 85 86 87
        // 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)
88
        {
89
            currentView = currentViewCandidate;
90
        }
91 92
    }

93
    setDefaultSettingsForAp();
94

95 96
    settings.sync();

pixhawk's avatar
pixhawk committed
97 98 99
    // Setup user interface
    ui.setupUi(this);

100 101
    setVisible(false);

102
    buildCommonWidgets();
103

104
    connectCommonWidgets();
105

106
    arrangeCommonCenterStack();
107 108

    configureWindowName();
pixhawk's avatar
pixhawk committed
109

110
    loadStyle(currentStyle);
111

112 113 114 115 116 117 118 119 120 121 122 123
//    // Set the application style (not the same as a style sheet)
//    // Set the style to Plastique
//    qApp->setStyle("plastique");

//    // Set style sheet as last step
//    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
124

125
    // Create actions
126
    connectCommonActions();
127

128 129 130
    // Set dock options
    setDockOptions(AnimatedDocks | AllowTabbedDocks | AllowNestedDocks);

131
    // Load mavlink view as default widget set
132
    //loadMAVLinkView();
133

lm's avatar
lm committed
134 135
    statusBar()->setSizeGripEnabled(true);

136 137
    // Restore the window position and size
    if (settings.contains(getWindowGeometryKey()))
138 139
    {
        // Restore the window geometry
140
        restoreGeometry(settings.value(getWindowGeometryKey()).toByteArray());
141 142 143 144 145 146
    }
    else
    {
        // Adjust the size
        adjustSize();
    }
pixhawk's avatar
pixhawk committed
147

148 149 150 151 152 153
    // Populate link menu
    QList<LinkInterface*> links = LinkManager::instance()->getLinks();
    foreach(LinkInterface* link, links)
    {
        this->addLink(link);
    }
154

155 156
    connect(LinkManager::instance(), SIGNAL(newLink(LinkInterface*)), this, SLOT(addLink(LinkInterface*)));

157 158 159 160 161 162
    // Connect user interface devices
    if (!joystick)
    {
        joystick = new JoystickInput();
    }

lm's avatar
lm committed
163 164
    // Enable and update view
    presentView();
165 166 167 168 169 170 171 172 173 174

    // Connect link
    if (autoReconnect)
    {
        SerialLink* link = new SerialLink();
        // Add to registry
        LinkManager::instance()->add(link);
        LinkManager::instance()->addProtocol(link, mavlink);
        link->connect();
    }
pixhawk's avatar
pixhawk committed
175 176
}

pixhawk's avatar
pixhawk committed
177
MainWindow::~MainWindow()
pixhawk's avatar
pixhawk committed
178
{
179 180 181
    // Store settings
    storeSettings();

182
    delete mavlink;
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
    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
202 203
}

204 205 206 207 208 209 210 211 212 213 214 215
/**
 * 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);
216 217 218 219 220

        // 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);
221 222 223 224 225 226 227 228 229 230
    }

    // 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);
231 232
        // ENABLE HUD TOOL WIDGET
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_HUD,VIEW_OPERATOR), true);
233 234
        // ENABLE WAYPOINTS
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_WAYPOINTS,VIEW_OPERATOR), true);
235 236 237 238 239 240 241
    }

    // ENGINEER VIEW DEFAULT
    centralKey = buildMenuKey(SUB_SECTION_CHECKED, CENTRAL_LINECHART, VIEW_ENGINEER);
    if (!settings.contains(centralKey))
    {
        settings.setValue(centralKey,true);
242 243
        // Enable Parameter widget
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_PARAMETERS,VIEW_ENGINEER), true);
244 245 246 247 248 249 250 251 252 253 254 255 256 257
    }

    // 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);
258 259
        // Enable Flight display
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_HDD_1,VIEW_PILOT), true);
260 261 262
    }
}

lm's avatar
lm committed
263 264 265 266 267 268 269 270 271 272 273 274 275
void MainWindow::resizeEvent(QResizeEvent * event)
{
    Q_UNUSED(event);
    if (height() < 800)
    {
        ui.statusBar->setVisible(false);
    }
    else
    {
        ui.statusBar->setVisible(true);
    }
}

276 277
QString MainWindow::getWindowStateKey()
{
278
    return QString::number(currentView)+"_windowstate";
279 280 281 282
}

QString MainWindow::getWindowGeometryKey()
{
283 284
    //return QString::number(currentView)+"_geometry";
    return "_geometry";
285 286
}

lm's avatar
lm committed
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
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);
310
                dock->setObjectName(widgets.at(i)->objectName()+"_DOCK");
lm's avatar
lm committed
311 312 313
                dock->setWidget(widgets.at(i));
                connect(widgets.at(i), SIGNAL(destroyed()), dock, SLOT(deleteLater()));
                QAction* showAction = new QAction(widgets.at(i)->windowTitle(), this);
314
                showAction->setCheckable(true);
lm's avatar
lm committed
315 316 317 318 319 320 321 322 323 324
                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);
            }
        }
    }
}

325 326 327 328
void MainWindow::buildCommonWidgets()
{
    //TODO:  move protocol outside UI
    mavlink     = new MAVLinkProtocol();
329
    connect(mavlink, SIGNAL(protocolStatusMessage(QString,QString)), this, SLOT(showCriticalMessage(QString,QString)), Qt::QueuedConnection);
330 331

    // Dock widgets
332 333 334
    if (!controlDockWidget)
    {
        controlDockWidget = new QDockWidget(tr("Control"), this);
335
        controlDockWidget->setObjectName("UNMANNED_SYSTEM_CONTROL_DOCKWIDGET");
336
        controlDockWidget->setWidget( new UASControlWidget(this) );
337
        addToToolsMenu (controlDockWidget, tr("Control"), SLOT(showToolWidget(bool)), MENU_UAS_CONTROL, Qt::LeftDockWidgetArea);
338
    }
339

340 341 342 343
    if (!listDockWidget)
    {
        listDockWidget = new QDockWidget(tr("Unmanned Systems"), this);
        listDockWidget->setWidget( new UASListWidget(this) );
344
        listDockWidget->setObjectName("UNMANNED_SYSTEMS_LIST_DOCKWIDGET");
345
        addToToolsMenu (listDockWidget, tr("Unmanned Systems"), SLOT(showToolWidget(bool)), MENU_UAS_LIST, Qt::RightDockWidgetArea);
346
    }
347

348 349
    if (!waypointsDockWidget)
    {
350
        waypointsDockWidget = new QDockWidget(tr("Mission Plan"), this);
351
        waypointsDockWidget->setWidget( new QGCWaypointListMulti(this) );
352
        waypointsDockWidget->setObjectName("WAYPOINT_LIST_DOCKWIDGET");
353
        addToToolsMenu (waypointsDockWidget, tr("Mission Plan"), SLOT(showToolWidget(bool)), MENU_WAYPOINTS, Qt::BottomDockWidgetArea);
354
    }
355

356 357 358 359
    if (!infoDockWidget)
    {
        infoDockWidget = new QDockWidget(tr("Status Details"), this);
        infoDockWidget->setWidget( new UASInfoWidget(this) );
pixhawk's avatar
pixhawk committed
360
        infoDockWidget->setObjectName("UAS_STATUS_DETAILS_DOCKWIDGET");
361
        addToToolsMenu (infoDockWidget, tr("Status Details"), SLOT(showToolWidget(bool)), MENU_STATUS, Qt::RightDockWidgetArea);
362
    }
363

364 365 366 367
    if (!debugConsoleDockWidget)
    {
        debugConsoleDockWidget = new QDockWidget(tr("Communication Console"), this);
        debugConsoleDockWidget->setWidget( new DebugConsole(this) );
368
        debugConsoleDockWidget->setObjectName("COMMUNICATION_DEBUG_CONSOLE_DOCKWIDGET");
369
        addToToolsMenu (debugConsoleDockWidget, tr("Communication Console"), SLOT(showToolWidget(bool)), MENU_DEBUG_CONSOLE, Qt::BottomDockWidgetArea);
370
    }
371

372 373 374 375 376
    if (!logPlayerDockWidget)
    {
        logPlayerDockWidget = new QDockWidget(tr("MAVLink Log Player"), this);
        logPlayerDockWidget->setWidget( new QGCMAVLinkLogPlayer(mavlink, this) );
        logPlayerDockWidget->setObjectName("MAVLINK_LOG_PLAYER_DOCKWIDGET");
377
        addToToolsMenu(logPlayerDockWidget, tr("MAVLink Log Replay"), SLOT(showToolWidget(bool)), MENU_MAVLINK_LOG_PLAYER, Qt::RightDockWidgetArea);
378 379
    }

380
    // Center widgets
381 382
    if (!mapWidget)
    {
383
        mapWidget = new MapWidget(this);
384 385
        addToCentralWidgetsMenu (mapWidget, "Maps", SLOT(showCentralWidget()),CENTRAL_MAP);
    }
386

387 388 389 390 391
    if (!protocolWidget)
    {
        protocolWidget    = new XMLCommProtocolWidget(this);
        addToCentralWidgetsMenu (protocolWidget, "Mavlink Generator", SLOT(showCentralWidget()),CENTRAL_PROTOCOL);
    }
lm's avatar
lm committed
392

393
#ifdef MAVLINK_ENABLED_SLUGS
Alejandro's avatar
Alejandro committed
394 395 396 397 398
    //TODO temporaly debug
    if (!slugsHilSimWidget)
    {
        slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this);
        slugsHilSimWidget->setWidget( new SlugsHilSim(this));
399
        addToToolsMenu (slugsHilSimWidget, tr("HIL Sim Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_HIL, Qt::LeftDockWidgetArea);
Alejandro's avatar
Alejandro committed
400 401 402 403 404 405 406
    }

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

lm's avatar
lm committed
411 412 413
    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
414
        addToCentralWidgetsMenu (dataplotWidget, "Logfile Plot", SLOT(showCentralWidget()),CENTRAL_DATA_PLOT);
lm's avatar
lm committed
415
    }
416
}
417

418

419
void MainWindow::buildPxWidgets()
420
{
pixhawk's avatar
pixhawk committed
421 422
    //FIXME: memory of acceptList will never be freed again
    QStringList* acceptList = new QStringList();
pixhawk's avatar
pixhawk committed
423 424 425
    acceptList->append("-105,roll deg,deg,+105,s");
    acceptList->append("-105,pitch deg,deg,+105,s");
    acceptList->append("-105,heading deg,deg,+105,s");
426

pixhawk's avatar
pixhawk committed
427 428 429
    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");
430
    acceptList->append("0,airspeed,m/s,30");
431 432
    acceptList->append("0,groundspeed,m/s,30");
    acceptList->append("0,climbrate,m/s,30");
433
    acceptList->append("0,throttle,%,100");
434

pixhawk's avatar
pixhawk committed
435 436
    //FIXME: memory of acceptList2 will never be freed again
    QStringList* acceptList2 = new QStringList();
437 438 439 440 441 442 443 444
    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
445
    acceptList2->append("0,abs pressure,hPa,65500");
446 447 448
    //acceptList2->append("-2048,accel. x,raw,2048,s");
    //acceptList2->append("-2048,accel. y,raw,2048,s");
    //acceptList2->append("-2048,accel. z,raw,2048,s");
449

450 451 452 453
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
454
        addToCentralWidgetsMenu(linechartWidget, tr("Realtime Plot"), SLOT(showCentralWidget()), CENTRAL_LINECHART);
455
    }
456 457


458 459 460
    if (!hudWidget)
    {
        hudWidget         = new HUD(320, 240, this);
461
        addToCentralWidgetsMenu(hudWidget, tr("Head Up Display"), SLOT(showCentralWidget()), CENTRAL_HUD);
462
    }
463

464 465 466
    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
467
        addToCentralWidgetsMenu(dataplotWidget, "Logfile Plot", SLOT(showCentralWidget()), CENTRAL_DATA_PLOT);
468
    }
469

470
#ifdef QGC_OSG_ENABLED
471 472
    if (!_3DWidget)
    {
473
        _3DWidget         = Q3DWidgetFactory::get("PIXHAWK");
474
        addToCentralWidgetsMenu(_3DWidget, tr("Local 3D"), SLOT(showCentralWidget()), CENTRAL_3D_LOCAL);
475
    }
476
#endif
477

478
#ifdef QGC_OSGEARTH_ENABLED
479 480 481
    if (!_3DMapWidget)
    {
        _3DMapWidget = Q3DWidgetFactory::get("MAP3D");
482
        addToCentralWidgetsMenu(_3DMapWidget, tr("OSG Earth 3D"), SLOT(showCentralWidget()), CENTRAL_OSGEARTH);
483
    }
484
#endif
lm's avatar
lm committed
485

486
#if (defined _MSC_VER) | (defined Q_OS_MAC)
487 488 489
    if (!gEarthWidget)
    {
        gEarthWidget = new QGCGoogleEarthView(this);
490
        addToCentralWidgetsMenu(gEarthWidget, tr("Google Earth"), SLOT(showCentralWidget()), CENTRAL_GOOGLE_EARTH);
491
    }
492

493
#endif
494

pixhawk's avatar
pixhawk committed
495
    // Dock widgets
496

497 498 499 500
    if (!detectionDockWidget)
    {
        detectionDockWidget = new QDockWidget(tr("Object Recognition"), this);
        detectionDockWidget->setWidget( new ObjectDetectionView("images/patterns", this) );
pixhawk's avatar
pixhawk committed
501
        detectionDockWidget->setObjectName("OBJECT_DETECTION_DOCK_WIDGET");
502
        addToToolsMenu (detectionDockWidget, tr("Object Recognition"), SLOT(showToolWidget(bool)), MENU_DETECTION, Qt::RightDockWidgetArea);
503
    }
504

505 506
    if (!parametersDockWidget)
    {
507
        parametersDockWidget = new QDockWidget(tr("Calibration and Onboard Parameters"), this);
508
        parametersDockWidget->setWidget( new ParameterInterface(this) );
pixhawk's avatar
pixhawk committed
509
        parametersDockWidget->setObjectName("PARAMETER_INTERFACE_DOCKWIDGET");
510
        addToToolsMenu (parametersDockWidget, tr("Calibration and Parameters"), SLOT(showToolWidget(bool)), MENU_PARAMETERS, Qt::RightDockWidgetArea);
511
    }
512

513 514 515 516
    if (!watchdogControlDockWidget)
    {
        watchdogControlDockWidget = new QDockWidget(tr("Process Control"), this);
        watchdogControlDockWidget->setWidget( new WatchdogControl(this) );
pixhawk's avatar
pixhawk committed
517
        watchdogControlDockWidget->setObjectName("WATCHDOG_CONTROL_DOCKWIDGET");
518
        addToToolsMenu (watchdogControlDockWidget, tr("Process Control"), SLOT(showToolWidget(bool)), MENU_WATCHDOG, Qt::BottomDockWidgetArea);
519
    }
520

521 522 523 524
    if (!hsiDockWidget)
    {
        hsiDockWidget = new QDockWidget(tr("Horizontal Situation Indicator"), this);
        hsiDockWidget->setWidget( new HSIDisplay(this) );
525
        hsiDockWidget->setObjectName("HORIZONTAL_SITUATION_INDICATOR_DOCK_WIDGET");
526
        addToToolsMenu (hsiDockWidget, tr("Horizontal Situation"), SLOT(showToolWidget(bool)), MENU_HSI, Qt::BottomDockWidgetArea);
527
    }
528

529 530
    if (!headDown1DockWidget)
    {
531 532
        headDown1DockWidget = new QDockWidget(tr("Flight Display"), this);
        headDown1DockWidget->setWidget( new HDDisplay(acceptList, "Flight Display", this) );
533
        headDown1DockWidget->setObjectName("HEAD_DOWN_DISPLAY_1_DOCK_WIDGET");
534
        addToToolsMenu (headDown1DockWidget, tr("Flight Display"), SLOT(showToolWidget(bool)), MENU_HDD_1, Qt::RightDockWidgetArea);
535
    }
536

537 538
    if (!headDown2DockWidget)
    {
539 540
        headDown2DockWidget = new QDockWidget(tr("Actuator Status"), this);
        headDown2DockWidget->setWidget( new HDDisplay(acceptList2, "Actuator Status", this) );
541
        headDown2DockWidget->setObjectName("HEAD_DOWN_DISPLAY_2_DOCK_WIDGET");
542
        addToToolsMenu (headDown2DockWidget, tr("Actuator Status"), SLOT(showToolWidget(bool)), MENU_HDD_2, Qt::RightDockWidgetArea);
543
    }
544

545 546 547 548
    if (!rcViewDockWidget)
    {
        rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
        rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
549
        rcViewDockWidget->setObjectName("RADIO_CONTROL_CHANNELS_DOCK_WIDGET");
550
        addToToolsMenu (rcViewDockWidget, tr("Radio Control"), SLOT(showToolWidget(bool)), MENU_RC_VIEW, Qt::BottomDockWidgetArea);
551
    }
552

553 554 555 556
    if (!headUpDockWidget)
    {
        headUpDockWidget = new QDockWidget(tr("HUD"), this);
        headUpDockWidget->setWidget( new HUD(320, 240, this));
557
        headUpDockWidget->setObjectName("HEAD_UP_DISPLAY_DOCK_WIDGET");
558
        addToToolsMenu (headUpDockWidget, tr("Head Up Display"), SLOT(showToolWidget(bool)), MENU_HUD, Qt::RightDockWidgetArea);
559
    }
560

pixhawk's avatar
pixhawk committed
561 562 563 564 565 566 567 568 569
    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");
570
        addToToolsMenu (video1DockWidget, tr("Video Stream 1"), SLOT(showToolWidget(bool)), MENU_VIDEO_STREAM_1, Qt::LeftDockWidgetArea);
pixhawk's avatar
pixhawk committed
571 572 573 574 575 576 577 578 579 580 581
    }

    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");
582
        addToToolsMenu (video2DockWidget, tr("Video Stream 2"), SLOT(showToolWidget(bool)), MENU_VIDEO_STREAM_2, Qt::LeftDockWidgetArea);
pixhawk's avatar
pixhawk committed
583 584
    }

pixhawk's avatar
pixhawk committed
585 586
    // Dialogue widgets
    //FIXME: free memory in destructor
587 588 589 590
}

void MainWindow::buildSlugsWidgets()
{
591 592 593 594
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
595
        addToCentralWidgetsMenu(linechartWidget, tr("Realtime Plot"), SLOT(showCentralWidget()), CENTRAL_LINECHART);
596
    }
597

598 599 600 601 602
    if (!headUpDockWidget)
    {
        // Dock widgets
        headUpDockWidget = new QDockWidget(tr("Control Indicator"), this);
        headUpDockWidget->setWidget( new HUD(320, 240, this));
pixhawk's avatar
pixhawk committed
603
        headUpDockWidget->setObjectName("HEAD_UP_DISPLAY_DOCK_WIDGET");
604
        addToToolsMenu (headUpDockWidget, tr("Head Up Display"), SLOT(showToolWidget(bool)), MENU_HUD, Qt::LeftDockWidgetArea);
605
    }
606

607 608 609 610
    if (!rcViewDockWidget)
    {
        rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
        rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
pixhawk's avatar
pixhawk committed
611
        rcViewDockWidget->setObjectName("RADIO_CONTROL_CHANNELS_DOCK_WIDGET");
612
        addToToolsMenu (rcViewDockWidget, tr("Radio Control"), SLOT(showToolWidget(bool)), MENU_RC_VIEW, Qt::BottomDockWidgetArea);
613
    }
614

615 616 617 618 619
    if (!slugsDataWidget)
    {
        // Dialog widgets
        slugsDataWidget = new QDockWidget(tr("Slugs Data"), this);
        slugsDataWidget->setWidget( new SlugsDataSensorView(this));
pixhawk's avatar
pixhawk committed
620
        slugsDataWidget->setObjectName("SLUGS_DATA_DOCK_WIDGET");
621
        addToToolsMenu (slugsDataWidget, tr("Telemetry Data"), SLOT(showToolWidget(bool)), MENU_SLUGS_DATA, Qt::RightDockWidgetArea);
622
    }
623

624 625 626 627
    if (!slugsPIDControlWidget)
    {
        slugsPIDControlWidget = new QDockWidget(tr("Slugs PID Control"), this);
        slugsPIDControlWidget->setWidget(new SlugsPIDControl(this));
pixhawk's avatar
pixhawk committed
628
        slugsPIDControlWidget->setObjectName("SLUGS_PID_CONTROL_DOCK_WIDGET");
629
        addToToolsMenu (slugsPIDControlWidget, tr("PID Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_PID, Qt::LeftDockWidgetArea);
630
    }
631

632 633 634 635
    if (!slugsHilSimWidget)
    {
        slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this);
        slugsHilSimWidget->setWidget( new SlugsHilSim(this));
pixhawk's avatar
pixhawk committed
636
        slugsHilSimWidget->setObjectName("SLUGS_HIL_SIM_DOCK_WIDGET");
637
        addToToolsMenu (slugsHilSimWidget, tr("HIL Sim Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_HIL, Qt::LeftDockWidgetArea);
638
    }
639

640 641 642 643
    if (!slugsCamControlWidget)
    {
        slugsCamControlWidget = new QDockWidget(tr("Slugs Video Camera Control"), this);
        slugsCamControlWidget->setWidget(new SlugsVideoCamControl(this));
pixhawk's avatar
pixhawk committed
644
        slugsCamControlWidget->setObjectName("SLUGS_CAM_CONTROL_DOCK_WIDGET");
645
        addToToolsMenu (slugsCamControlWidget, tr("Camera Control"), SLOT(showToolWidget(bool)), MENU_SLUGS_CAMERA, Qt::BottomDockWidgetArea);
646
    }
647
}
648 649 650 651 652


void MainWindow::addToCentralWidgetsMenu ( QWidget* widget,
                                           const QString title,
                                           const char * slotName,
653 654
                                           TOOLS_WIDGET_NAMES centralWidget)
{
655
    QAction* tempAction;
656

657

658
// Not needed any more - separate menu now available
659

660 661 662 663 664 665 666 667 668
//    // 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);
669

670 671
    tempAction->setCheckable(true);
    tempAction->setData(centralWidget);
672

673 674 675
    // populate the Hashes
    toolsMenuActions[centralWidget] = tempAction;
    dockWidgets[centralWidget] = widget;
676

677
    QString chKey = buildMenuKey(SUB_SECTION_CHECKED, centralWidget, currentView);
678

679 680
    if (!settings.contains(chKey))
    {
681 682 683
        settings.setValue(chKey,false);
        tempAction->setChecked(false);
    }
684 685 686 687
    else
    {
        tempAction->setChecked(settings.value(chKey).toBool());
    }
688

689
    // connect the action
690
    connect(tempAction,SIGNAL(triggered(bool)),this, slotName);
691 692 693
}


lm's avatar
lm committed
694 695
void MainWindow::showCentralWidget()
{
696
    QAction* senderAction = qobject_cast<QAction *>(sender());
697 698 699 700

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

701 702
    int tool = senderAction->data().toInt();
    QString chKey;
703

704
    // check the current action
705

706 707 708 709
    if (senderAction && dockWidgets[tool])
    {
        // uncheck all central widget actions
        QHashIterator<int, QAction*> i(toolsMenuActions);
710 711
        while (i.hasNext())
        {
712
            i.next();
713 714 715
            //qDebug() << "shCW" << i.key() << "read";
            if (i.value() && i.value()->data().toInt() > 255)
            {
716 717 718
                // Block signals and uncheck action
                // firing would be unneccesary
                i.value()->blockSignals(true);
719
                i.value()->setChecked(false);
720
                i.value()->blockSignals(false);
721 722 723 724 725 726

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

728
        // check the current action
729
        //qDebug() << senderAction->text();
730
        senderAction->setChecked(true);
731

732 733
        // update the central widget
        centerStack->setCurrentWidget(dockWidgets[tool]);
734

735 736 737
        // store the selected central widget
        chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(tool), currentView);
        settings.setValue(chKey,true);
738

739 740 741
        // Unblock sender action
        senderAction->blockSignals(false);

742 743
        presentView();
    }
744
}
745

lm's avatar
lm committed
746 747 748 749
/**
 * Adds a widget to the tools menu and sets it visible if it was
 * enabled last time.
 */
750
void MainWindow::addToToolsMenu ( QWidget* widget,
751 752 753 754
                                  const QString title,
                                  const char * slotName,
                                  TOOLS_WIDGET_NAMES tool,
                                  Qt::DockWidgetArea location)
lm's avatar
lm committed
755
{
756 757
    QAction* tempAction;
    QString posKey, chKey;
758

759

760 761
    if (toolsMenuActions[CENTRAL_SEPARATOR])
    {
762 763 764
        tempAction = new QAction(title, this);
        ui.menuTools->insertAction(toolsMenuActions[CENTRAL_SEPARATOR],
                                   tempAction);
765 766 767
    }
    else
    {
768 769
        tempAction = ui.menuTools->addAction(title);
    }
770

771 772
    tempAction->setCheckable(true);
    tempAction->setData(tool);
773

774 775 776
    // populate the Hashes
    toolsMenuActions[tool] = tempAction;
    dockWidgets[tool] = widget;
777
    //qDebug() << widget;
778

779
    posKey = buildMenuKey (SUB_SECTION_LOCATION,tool, currentView);
780

781 782
    if (!settings.contains(posKey))
    {
783 784
        settings.setValue(posKey,location);
        dockWidgetLocations[tool] = location;
785 786 787 788
    }
    else
    {
        dockWidgetLocations[tool] = static_cast <Qt::DockWidgetArea> (settings.value(posKey, Qt::RightDockWidgetArea).toInt());
789
    }
790

791
    chKey = buildMenuKey(SUB_SECTION_CHECKED,tool, currentView);
792

793 794 795 796
    if (!settings.contains(chKey))
    {
        settings.setValue(chKey,false);
        tempAction->setChecked(false);
797
        widget->setVisible(false);
798 799 800
    }
    else
    {
801
        tempAction->setChecked(settings.value(chKey, false).toBool());
802
        widget->setVisible(settings.value(chKey, false).toBool());
803
    }
804

805
    // connect the action
806 807 808
    connect(tempAction,SIGNAL(toggled(bool)),this, slotName);

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

811 812
    //  connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
    //          SIGNAL(visibilityChanged(bool)), this, SLOT(updateVisibilitySettings(bool)));
813

814 815
    connect(qobject_cast <QDockWidget *>(dockWidgets[tool]),
            SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(updateLocationSettings(Qt::DockWidgetArea)));
816 817
}

818
void MainWindow::showToolWidget(bool visible)
819
{
820
    if (!aboutToCloseFlag && !changingViewsFlag)
821
    {
822 823
        QAction* action = qobject_cast<QAction *>(sender());

824 825
        // Prevent this to fire if undocked
        if (action)
826
        {
827
            int tool = action->data().toInt();
828

829
            QDockWidget* dockWidget = qobject_cast<QDockWidget *> (dockWidgets[tool]);
830

831 832 833 834 835 836 837 838 839 840 841
            if (dockWidget && dockWidget->isVisible() != visible)
            {
                if (visible)
                {
                    addDockWidget(dockWidgetLocations[tool], dockWidget);
                    dockWidget->show();
                }
                else
                {
                    removeDockWidget(dockWidget);
                }
842 843 844 845 846 847 848 849 850

                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);
851
                        //qDebug() << "showToolWidget(): Set key" << chKey << "to" << visible;
852 853 854
                        break;
                    }
                }
855 856 857 858 859
            }
        }

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

860
        //qDebug() << "Trying to cast dockwidget" << dockWidget << "isvisible" << visible;
861 862 863 864 865 866

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

867
            //qDebug() << "Updating widget setting" << tool << "to" << visible;
868 869 870 871 872 873 874 875 876 877 878 879 880 881

            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);
882
                   // qDebug() << "showToolWidget(): Set key" << chKey << "to" << visible;
883 884 885
                    break;
                }
            }
886
        }
887 888 889 890
    }
}


891 892 893 894 895
void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view)
{
    bool tempVisible;
    Qt::DockWidgetArea tempLocation;
    QDockWidget* tempWidget = static_cast <QDockWidget *>(dockWidgets[widget]);
896

897
    tempVisible =  settings.value(buildMenuKey(SUB_SECTION_CHECKED,widget,view), false).toBool();
898

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

901 902 903 904
    if (tempWidget)
    {
        toolsMenuActions[widget]->setChecked(tempVisible);
    }
905 906


907
    //qDebug() <<  buildMenuKey (SUB_SECTION_CHECKED,widget,view) << tempVisible;
908

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

911
    if (tempWidget != NULL)
912
    {
913 914 915 916 917
        if (tempVisible)
        {
            addDockWidget(tempLocation, tempWidget);
            tempWidget->show();
        }
918 919
    }
}
920

921 922 923 924 925
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;

926 927 928 929 930
//    apType = (UASManager::instance() && UASManager::instance()->silentGetActiveUAS())?
//             UASManager::instance()->getActiveUAS()->getAutopilotType():
//             -1;

    apType = 1;
931

932 933 934 935 936
    return (QString::number(apType) + "_" +
            QString::number(SECTION_MENU) + "_" +
            QString::number(view) + "_" +
            QString::number(tool) + "_" +
            QString::number(section) + "_" );
937 938
}

939 940
void MainWindow::closeEvent(QCloseEvent *event)
{
941
    storeSettings();
942
    aboutToCloseFlag = true;
943
    mavlink->storeSettings();
944
    UASManager::instance()->storeSettings();
945 946
    QMainWindow::closeEvent(event);
}
947

948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
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;
                }
            }
        }
    }
}
971

972 973
void MainWindow::updateVisibilitySettings (bool vis)
{
974
    if (!aboutToCloseFlag && !changingViewsFlag)
975 976 977 978 979 980
    {
        QDockWidget* temp = qobject_cast<QDockWidget *>(sender());

        if (temp)
        {
            QHashIterator<int, QWidget*> i(dockWidgets);
981 982
            while (i.hasNext())
            {
983
                i.next();
984 985
                if ((static_cast <QDockWidget *>(dockWidgets[i.key()])) == temp)
                {
986 987
                    QString chKey = buildMenuKey (SUB_SECTION_CHECKED,static_cast<TOOLS_WIDGET_NAMES>(i.key()), currentView);
                    settings.setValue(chKey,vis);
988 989 990 991 992 993
                    toolsMenuActions[i.key()]->setChecked(vis);
                    break;
                }
            }
        }
    }
994 995
}

996 997 998
void MainWindow::updateLocationSettings (Qt::DockWidgetArea location)
{
    QDockWidget* temp = qobject_cast<QDockWidget *>(sender());
999

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
    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;
        }
    }
1011 1012
}

1013 1014 1015
/**
 * Connect the signals and slots of the common window widgets
 */
1016
void MainWindow::connectCommonWidgets()
1017
{
pixhawk's avatar
pixhawk committed
1018 1019 1020 1021 1022
    if (infoDockWidget && infoDockWidget->widget())
    {
        connect(mavlink, SIGNAL(receiveLossChanged(int, float)),
                infoDockWidget->widget(), SLOT(updateSendLoss(int, float)));
    }
1023

pixhawk's avatar
pixhawk committed
1024 1025
    if (mapWidget && waypointsDockWidget->widget())
    {
1026

1027
    }
Alejandro's avatar
Alejandro committed
1028 1029 1030 1031 1032 1033

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

1036 1037
void MainWindow::createCustomWidget()
{
lm's avatar
lm committed
1038 1039 1040 1041 1042 1043 1044 1045
    QGCToolWidget* tool = new QGCToolWidget("Unnamed Tool", this);

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

1046
    QDockWidget* dock = new QDockWidget("Unnamed Tool", this);
lm's avatar
lm committed
1047
    connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater()));
1048
    dock->setWidget(tool);
lm's avatar
lm committed
1049
    QAction* showAction = new QAction("Show Unnamed Tool", this);
1050
    showAction->setCheckable(true);
lm's avatar
lm committed
1051 1052 1053 1054 1055
    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);
1056
    dock->setVisible(true);
1057 1058 1059 1060
}

void MainWindow::connectPxWidgets()
{
1061
    // No special connections necessary at this point
1062 1063 1064 1065
}

void MainWindow::connectSlugsWidgets()
{
1066
    if (slugsHilSimWidget && slugsHilSimWidget->widget()){
1067 1068
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsHilSimWidget->widget(), SLOT(activeUasSet(UASInterface*)));
1069 1070 1071
    }

    if (slugsDataWidget && slugsDataWidget->widget()){
1072 1073
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsDataWidget->widget(), SLOT(setActiveUAS(UASInterface*)));
1074 1075
    }

1076

1077 1078
}

1079
void MainWindow::arrangeCommonCenterStack()
1080
{
1081
    centerStack = new QStackedWidget(this);
1082
    centerStack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1083

pixhawk's avatar
pixhawk committed
1084
    if (!centerStack) return;
1085

1086
    if (mapWidget && (centerStack->indexOf(mapWidget) == -1)) centerStack->addWidget(mapWidget);
lm's avatar
lm committed
1087
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
1088
    if (protocolWidget && (centerStack->indexOf(protocolWidget) == -1)) centerStack->addWidget(protocolWidget);
1089 1090 1091 1092 1093 1094 1095

    setCentralWidget(centerStack);
}

void MainWindow::arrangePxCenterStack()
{

1096 1097 1098 1099
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
1100

1101 1102

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

1104
#ifdef QGC_OSG_ENABLED
1105
    if (_3DWidget && (centerStack->indexOf(_3DWidget) == -1)) centerStack->addWidget(_3DWidget);
1106
#endif
1107
#ifdef QGC_OSGEARTH_ENABLED
1108
    if (_3DMapWidget && (centerStack->indexOf(_3DMapWidget) == -1)) centerStack->addWidget(_3DMapWidget);
1109
#endif
1110
#if (defined _MSC_VER) | (defined Q_OS_MAC)
1111
    if (gEarthWidget && (centerStack->indexOf(gEarthWidget) == -1)) centerStack->addWidget(gEarthWidget);
1112
#endif
1113 1114
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
1115 1116 1117 1118 1119
}

void MainWindow::arrangeSlugsCenterStack()
{

1120 1121 1122 1123
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
1124

1125 1126
    if (linechartWidget && (centerStack->indexOf(linechartWidget) == -1)) centerStack->addWidget(linechartWidget);
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
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
void MainWindow::loadSettings()
{
    QSettings settings;
    settings.beginGroup("QGC_MAINWINDOW");
    autoReconnect = settings.value("AUTO_RECONNECT", autoReconnect).toBool();
    currentStyle = (QGC_MAINWINDOW_STYLE)settings.value("CURRENT_STYLE", currentStyle).toInt();
    settings.endGroup();
}

void MainWindow::storeSettings()
{
    QSettings settings;
    settings.beginGroup("QGC_MAINWINDOW");
    settings.setValue("AUTO_RECONNECT", autoReconnect);
    settings.setValue("CURRENT_STYLE", currentStyle);
    settings.endGroup();
    settings.setValue(getWindowGeometryKey(), saveGeometry());
    // 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)
    if (UASManager::instance()->getUASList().length() > 0) settings.setValue(getWindowStateKey(), saveState(QGC::applicationVersion()));
    // Save the current view only if a UAS is connected
    if (UASManager::instance()->getUASList().length() > 0) settings.setValue("CURRENT_VIEW_WITH_UAS_CONNECTED", currentView);
    settings.sync();
}

1156 1157
void MainWindow::configureWindowName()
{
pixhawk's avatar
pixhawk committed
1158 1159 1160
    QList<QHostAddress> hostAddresses = QNetworkInterface::allAddresses();
    QString windowname = qApp->applicationName() + " " + qApp->applicationVersion();
    bool prevAddr = false;
1161

pixhawk's avatar
pixhawk committed
</