MainWindow.cc 63.1 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

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

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

pixhawk's avatar
pixhawk committed
40

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

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

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

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

89
    setDefaultSettingsForAp();
90

91 92
    settings.sync();

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

96 97
    setVisible(false);

98
    buildCommonWidgets();
99

100
    connectCommonWidgets();
101

102
    arrangeCommonCenterStack();
103 104

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

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

pixhawk's avatar
pixhawk committed
110
    // Set style sheet as last step
111 112 113 114 115 116 117
    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
118

119
    // Create actions
120
    connectCommonActions();
121

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

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

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

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

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

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

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

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

pixhawk's avatar
pixhawk committed
161
MainWindow::~MainWindow()
pixhawk's avatar
pixhawk committed
162
{
163
    delete mavlink;
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
    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
183 184
}

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

        // 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);
202 203 204 205 206 207 208 209 210 211
    }

    // 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);
212 213
        // ENABLE HUD TOOL WIDGET
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_HUD,VIEW_OPERATOR), true);
214 215
        // ENABLE WAYPOINTS
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_WAYPOINTS,VIEW_OPERATOR), true);
216 217 218 219 220 221 222
    }

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

    // 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);
239 240
        // Enable Flight display
        settings.setValue(buildMenuKey(SUB_SECTION_CHECKED,MainWindow::MENU_HDD_1,VIEW_PILOT), true);
241 242 243
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

396

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

pixhawk's avatar
pixhawk committed
405 406 407
    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");
408
    acceptList->append("0,airspeed,m/s,30");
409 410 411
    acceptList->append("0,groundspeed,m/s,30");
    acceptList->append("0,climbrate,m/s,30");
    acceptList->append("0,throttle,m/s,100");
412

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

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


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

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

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

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

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

471
#endif
472

pixhawk's avatar
pixhawk committed
473
    // Dock widgets
474

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

634

635
// Not needed any more - separate menu now available
636

637 638 639 640 641 642 643 644 645
//    // 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);
646

647 648
    tempAction->setCheckable(true);
    tempAction->setData(centralWidget);
649

650 651 652
    // populate the Hashes
    toolsMenuActions[centralWidget] = tempAction;
    dockWidgets[centralWidget] = widget;
653

654
    QString chKey = buildMenuKey(SUB_SECTION_CHECKED, centralWidget, currentView);
655

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

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


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

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

678 679
    int tool = senderAction->data().toInt();
    QString chKey;
680

681
    // check the current action
682

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

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

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

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

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

716 717 718
        // Unblock sender action
        senderAction->blockSignals(false);

719 720
        presentView();
    }
721
}
722

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

736

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

748 749
    tempAction->setCheckable(true);
    tempAction->setData(tool);
750

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

756
    posKey = buildMenuKey (SUB_SECTION_LOCATION,tool, currentView);
757

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

768
    chKey = buildMenuKey(SUB_SECTION_CHECKED,tool, currentView);
769

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

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

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

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

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

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

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

806
            QDockWidget* dockWidget = qobject_cast<QDockWidget *> (dockWidgets[tool]);
807

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

                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);
828
                        //qDebug() << "showToolWidget(): Set key" << chKey << "to" << visible;
829 830 831
                        break;
                    }
                }
832 833 834 835 836
            }
        }

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

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

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

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

            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);
859
                   // qDebug() << "showToolWidget(): Set key" << chKey << "to" << visible;
860 861 862
                    break;
                }
            }
863
        }
864 865 866 867
    }
}


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

874
    tempVisible =  settings.value(buildMenuKey(SUB_SECTION_CHECKED,widget,view), false).toBool();
875

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

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


884
    //qDebug() <<  buildMenuKey (SUB_SECTION_CHECKED,widget,view) << tempVisible;
885

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

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

898 899 900 901 902
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;

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

    apType = 1;
908

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

916 917
void MainWindow::closeEvent(QCloseEvent *event)
{
918
    settings.setValue(getWindowGeometryKey(), saveGeometry());
919 920
    //settings.setValue("windowState", saveState());
    aboutToCloseFlag = true;
921
    mavlink->storeSettings();
922 923 924
    // 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)
925
    if (UASManager::instance()->getUASList().length() > 0) settings.setValue(getWindowStateKey(), saveState(QGC::applicationVersion()));
926 927
    // Save the current view only if a UAS is connected
    if (UASManager::instance()->getUASList().length() > 0) settings.setValue("CURRENT_VIEW_WITH_UAS_CONNECTED", currentView);
928 929 930
    settings.sync();
    QMainWindow::closeEvent(event);
}
931

932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
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;
                }
            }
        }
    }
}
955

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

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

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

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

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

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

1011
    }
Alejandro's avatar
Alejandro committed
1012 1013 1014 1015 1016 1017

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

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

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

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

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

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

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

1059

1060 1061
}

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

pixhawk's avatar
pixhawk committed
1067
    if (!centerStack) return;
1068

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

    setCentralWidget(centerStack);
}

void MainWindow::arrangePxCenterStack()
{

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

1084 1085

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

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

void MainWindow::arrangeSlugsCenterStack()
{

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

1108 1109
    if (linechartWidget && (centerStack->indexOf(linechartWidget) == -1)) centerStack->addWidget(linechartWidget);
    if (hudWidget && (centerStack->indexOf(hudWidget) == -1)) centerStack->addWidget(hudWidget);
1110

1111 1112
}

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

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

pixhawk's avatar
pixhawk committed
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
    for (int i = 0; i < hostAddresses.size(); i++)
    {
        // Exclude loopback IPv4 and all IPv6 addresses
        if (hostAddresses.at(i) != QHostAddress("127.0.0.1") && !hostAddresses.at(i).toString().contains(":"))
        {
            if(prevAddr) windowname.append("/");
            windowname.append(hostAddresses.at(i).toString());
            prevAddr = true;
        }
    }
1131

pixhawk's avatar
pixhawk committed
1132
    windowname.append(")");
1133

pixhawk's avatar
pixhawk committed
1134
    setWindowTitle(windowname);
1135 1136

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

pixhawk's avatar
pixhawk committed
1141
void MainWindow::startVideoCapture()
pixhawk's avatar
pixhawk committed
1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152
{
    QString format = "bmp";
    QString initialPath = QDir::currentPath() + tr("/untitled.") + format;

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

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

    // TODO Convert raw images to PNG
}

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

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

1176
void MainWindow::selectStylesheet()
pixhawk's avatar
pixhawk committed
1177
{
1178
    // Let user select style sheet
1179
    styleFileName = QFileDialog::getOpenFileName(this, tr("Specify stylesheet"), styleFileName, tr("CSS Stylesheet (*.css);;"));
pixhawk's avatar