MainWindow.cc 67.7 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
    delete joystick;
lm's avatar
lm committed
184

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
    // 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 394 395

    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
396
        addToCentralWidgetsMenu (dataplotWidget, "Logfile Plot", SLOT(showCentralWidget()),CENTRAL_DATA_PLOT);
lm's avatar
lm committed
397
    }
398
}
399

400

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

pixhawk's avatar
pixhawk committed
409 410 411
    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");
412
    acceptList->append("0,airspeed,m/s,30");
413 414
    acceptList->append("0,groundspeed,m/s,30");
    acceptList->append("0,climbrate,m/s,30");
415
    acceptList->append("0,throttle,%,100");
416

pixhawk's avatar
pixhawk committed
417 418
    //FIXME: memory of acceptList2 will never be freed again
    QStringList* acceptList2 = new QStringList();
419 420 421 422 423 424 425 426
    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
427
    acceptList2->append("0,abs pressure,hPa,65500");
428 429 430
    //acceptList2->append("-2048,accel. x,raw,2048,s");
    //acceptList2->append("-2048,accel. y,raw,2048,s");
    //acceptList2->append("-2048,accel. z,raw,2048,s");
431

432 433 434 435
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
436
        addToCentralWidgetsMenu(linechartWidget, tr("Realtime Plot"), SLOT(showCentralWidget()), CENTRAL_LINECHART);
437
    }
438 439


440 441 442
    if (!hudWidget)
    {
        hudWidget         = new HUD(320, 240, this);
443
        addToCentralWidgetsMenu(hudWidget, tr("Head Up Display"), SLOT(showCentralWidget()), CENTRAL_HUD);
444
    }
445

446 447 448
    if (!dataplotWidget)
    {
        dataplotWidget    = new QGCDataPlot2D(this);
449
        addToCentralWidgetsMenu(dataplotWidget, "Logfile Plot", SLOT(showCentralWidget()), CENTRAL_DATA_PLOT);
450
    }
451

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

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

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

475
#endif
476

pixhawk's avatar
pixhawk committed
477
    // Dock widgets
478

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

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

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

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

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

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

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

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

pixhawk's avatar
pixhawk committed
543 544 545 546 547 548 549 550 551
    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");
552
        addToToolsMenu (video1DockWidget, tr("Video Stream 1"), SLOT(showToolWidget(bool)), MENU_VIDEO_STREAM_1, Qt::LeftDockWidgetArea);
pixhawk's avatar
pixhawk committed
553 554 555 556 557 558 559 560 561 562 563
    }

    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");
564
        addToToolsMenu (video2DockWidget, tr("Video Stream 2"), SLOT(showToolWidget(bool)), MENU_VIDEO_STREAM_2, Qt::LeftDockWidgetArea);
565
    }
566

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

void MainWindow::buildSlugsWidgets()
{
573 574 575 576
    if (!linechartWidget)
    {
        // Center widgets
        linechartWidget   = new Linecharts(this);
577
        addToCentralWidgetsMenu(linechartWidget, tr("Realtime Plot"), SLOT(showCentralWidget()), CENTRAL_LINECHART);
578
    }
579

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

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

597 598 599 600 601 602 603 604 605
#if (defined _MSC_VER) | (defined Q_OS_MAC)
    if (!gEarthWidget)
    {
        gEarthWidget = new QGCGoogleEarthView(this);
        addToCentralWidgetsMenu(gEarthWidget, tr("Google Earth"), SLOT(showCentralWidget()), CENTRAL_GOOGLE_EARTH);
    }

#endif

606 607 608 609 610 611 612 613
    if (!slugsDataWidget)
    {
        // Dialog widgets
        slugsDataWidget = new QDockWidget(tr("Slugs Data"), this);
        slugsDataWidget->setWidget( new SlugsDataSensorView(this));
        slugsDataWidget->setObjectName("SLUGS_DATA_DOCK_WIDGET");
        addToToolsMenu (slugsDataWidget, tr("Telemetry Data"), SLOT(showToolWidget(bool)), MENU_SLUGS_DATA, Qt::RightDockWidgetArea);
    }
614

615 616 617 618 619 620 621
    if (!slugsPIDControlWidget)
    {
        slugsPIDControlWidget = new QDockWidget(tr("Slugs PID Control"), this);
        slugsPIDControlWidget->setWidget(new SlugsPIDControl(this));
        slugsPIDControlWidget->setObjectName("SLUGS_PID_CONTROL_DOCK_WIDGET");
        addToToolsMenu (slugsPIDControlWidget, tr("PID Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_PID, Qt::LeftDockWidgetArea);
    }
622

623 624 625 626 627 628 629
    if (!slugsHilSimWidget)
    {
        slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this);
        slugsHilSimWidget->setWidget( new SlugsHilSim(this));
        slugsHilSimWidget->setObjectName("SLUGS_HIL_SIM_DOCK_WIDGET");
        addToToolsMenu (slugsHilSimWidget, tr("HIL Sim Configuration"), SLOT(showToolWidget(bool)), MENU_SLUGS_HIL, Qt::LeftDockWidgetArea);
    }
630

631 632 633 634 635 636 637 638
    if (!parametersDockWidget)
    {
        parametersDockWidget = new QDockWidget(tr("Calibration and Onboard Parameters"), this);
        parametersDockWidget->setWidget( new ParameterInterface(this) );
        parametersDockWidget->setObjectName("PARAMETER_INTERFACE_DOCKWIDGET");
        addToToolsMenu (parametersDockWidget, tr("Calibration and Parameters"), SLOT(showToolWidget(bool)), MENU_PARAMETERS, Qt::RightDockWidgetArea);
    }

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


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

656

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

659 660 661 662 663 664 665
//    // 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);
//    }
666

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

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

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

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

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

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


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

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

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

703
    // check the current action
704

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

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

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

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

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

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

741 742
        presentView();
    }
743
}
744

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

758

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

859
        //qDebug() << "Trying to cast dockwidget" << dockWidget << "isvisible" << visible;
860 861

        if (dockWidget)
862
        {
863 864 865
            // Get action
            int tool = dockWidgets.key(dockWidget);

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

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


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

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

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

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


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

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

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

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

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

    apType = 1;
930

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

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

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

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

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

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

999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
    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;
        }
    }
1010 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 1028 1029 1030 1031 1032
        //
        connect(waypointsDockWidget->widget(), SIGNAL(changePointList()), mapWidget, SLOT(clearWaypoints()));




1033
    }
Alejandro's avatar
Alejandro committed
1034 1035 1036 1037 1038 1039

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

1042 1043
void MainWindow::createCustomWidget()
{
lm's avatar
lm committed
1044 1045 1046 1047 1048 1049 1050 1051
    QGCToolWidget* tool = new QGCToolWidget("Unnamed Tool", this);

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

1052
    QDockWidget* dock = new QDockWidget("Unnamed Tool", this);
lm's avatar
lm committed
1053
    connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater()));
1054
    dock->setWidget(tool);
1055

lm's avatar
lm committed
1056
    QAction* showAction = new QAction("Show Unnamed Tool", this);
1057
    showAction->setCheckable(true);
lm's avatar
lm committed
1058 1059 1060 1061 1062
    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);
1063
    dock->setVisible(true);
1064 1065 1066 1067
}

void MainWindow::connectPxWidgets()
{
1068
    // No special connections necessary at this point
1069 1070 1071 1072
}

void MainWindow::connectSlugsWidgets()
{
1073
    if (slugsHilSimWidget && slugsHilSimWidget->widget()){
1074 1075
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsHilSimWidget->widget(), SLOT(activeUasSet(UASInterface*)));
1076 1077 1078
    }

    if (slugsDataWidget && slugsDataWidget->widget()){
1079 1080
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsDataWidget->widget(), SLOT(setActiveUAS(UASInterface*)));
1081 1082
    }

1083 1084 1085 1086
    if (slugsPIDControlWidget && slugsPIDControlWidget->widget()){
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
                slugsPIDControlWidget->widget(), SLOT(activeUasSet(UASInterface*)));
    }
1087 1088
}

1089
void MainWindow::arrangeCommonCenterStack()
1090
{
1091
    centerStack = new QStackedWidget(this);
1092
    centerStack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1093

pixhawk's avatar
pixhawk committed
1094
    if (!centerStack) return;
1095

1096
    if (mapWidget && (centerStack->indexOf(mapWidget) == -1)) centerStack->addWidget(mapWidget);
lm's avatar
lm committed
1097
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
1098
    if (protocolWidget && (centerStack->indexOf(protocolWidget) == -1)) centerStack->addWidget(protocolWidget);
1099 1100 1101 1102 1103 1104 1105

    setCentralWidget(centerStack);
}

void MainWindow::arrangePxCenterStack()
{

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

1111 1112

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

1114
#ifdef QGC_OSG_ENABLED
1115
    if (_3DWidget && (centerStack->indexOf(_3DWidget) == -1)) centerStack->addWidget(_3DWidget);
1116
#endif
1117
#ifdef QGC_OSGEARTH_ENABLED
1118
    if (_3DMapWidget && (centerStack->indexOf(_3DMapWidget) == -1)) centerStack->addWidget(_3DMapWidget);
1119
#endif
1120
#if (defined _MSC_VER) | (defined Q_OS_MAC)
1121
    if (gEarthWidget && (centerStack->indexOf(gEarthWidget) == -1)) centerStack->addWidget(gEarthWidget);
1122
#endif
1123 1124
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
    if (dataplotWidget && (centerStack->indexOf(dataplotWidget) == -1)) centerStack->addWidget(dataplotWidget);
1125 1126 1127 1128 1129
}

void MainWindow::arrangeSlugsCenterStack()
{

1130 1131 1132 1133
    if (!centerStack) {
        qDebug() << "Center Stack not Created!";
        return;
    }
1134

1135 1136
    if (linechartWidget && (centerStack->indexOf(linechartWidget) == -1)) centerStack->addWidget(linechartWidget);
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
1137

1138 1139 1140 1141
#if (defined _MSC_VER) | (defined Q_OS_MAC)
    if (gEarthWidget && (centerStack->indexOf(gEarthWidget) == -1)) centerStack->addWidget(gEarthWidget);
#endif

1142 1143
}

1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
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();
}

1170 1171
void MainWindow::configureWindowName()
{
pixhawk's avatar
pixhawk committed
1172 1173 1174
    QList<QHostAddress> hostAddresses = QNetworkInterface::allAddresses();
    QString windowname = qApp->applicationName() + " " + qApp->applicationVersion();
    bool prevAddr = false;
1175