From 15a15098747af302191a9a40cbd0c47ff76bf799 Mon Sep 17 00:00:00 2001 From: lm Date: Tue, 21 Dec 2010 15:19:39 +0100 Subject: [PATCH] Significantly bugfixed persistence and link adding/removal. Not yet fully there, but getting closer to release --- qgroundcontrol.pro | 9 ++- src/Core.cc | 31 +++++----- src/comm/LinkManager.cc | 12 ++++ src/comm/LinkManager.h | 1 + src/comm/MAVLinkSimulationLink.cc | 12 ++++ src/comm/MAVLinkSimulationLink.h | 1 + src/uas/UAS.cc | 2 +- src/ui/DebugConsole.cc | 18 +++++- src/ui/DebugConsole.h | 2 + src/ui/MainWindow.cc | 77 ++++++++++++++---------- src/ui/MainWindow.h | 4 +- src/ui/uas/QGCUnconnectedInfoWidget.cc | 17 ++++++ src/ui/uas/QGCUnconnectedInfoWidget.h | 25 ++++++++ src/ui/uas/QGCUnconnectedInfoWidget.ui | 81 ++++++++++++++++++++++++++ src/ui/uas/UASListWidget.cc | 37 +++++++++++- src/ui/uas/UASListWidget.h | 6 ++ 16 files changed, 281 insertions(+), 54 deletions(-) create mode 100644 src/ui/uas/QGCUnconnectedInfoWidget.cc create mode 100644 src/ui/uas/QGCUnconnectedInfoWidget.h create mode 100644 src/ui/uas/QGCUnconnectedInfoWidget.ui diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 731315a90..1d761bbba 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -150,7 +150,8 @@ FORMS += src/ui/MainWindow.ui \ src/ui/SlugsHilSim.ui \ src/ui/SlugsPIDControl.ui \ src/ui/SlugsVideoCamControl.ui \ - src/ui/SlugsPadCameraControl.ui + src/ui/SlugsPadCameraControl.ui \ + src/ui/uas/QGCUnconnectedInfoWidget.ui INCLUDEPATH += src \ src/ui \ @@ -251,7 +252,8 @@ HEADERS += src/MG.h \ src/ui/SlugsVideoCamControl.h \ src/ui/SlugsPadCameraControl.h \ src/ui/QGCMainWindowAPConfigurator.h \ - src/comm/MAVLinkSwarmSimulationLink.h + src/comm/MAVLinkSwarmSimulationLink.h \ + src/ui/uas/QGCUnconnectedInfoWidget.h contains(DEPENDENCIES_PRESENT, osg) { message("Including headers for OpenSceneGraph") @@ -363,7 +365,8 @@ SOURCES += src/main.cc \ src/ui/SlugsVideoCamControl.cpp \ src/ui/SlugsPadCameraControl.cpp \ src/ui/QGCMainWindowAPConfigurator.cc \ - src/comm/MAVLinkSwarmSimulationLink.cc + src/comm/MAVLinkSwarmSimulationLink.cc \ + src/ui/uas/QGCUnconnectedInfoWidget.cc contains(DEPENDENCIES_PRESENT, osg) { message("Including sources for OpenSceneGraph") diff --git a/src/Core.cc b/src/Core.cc index e49a06c53..2beaf5876 100644 --- a/src/Core.cc +++ b/src/Core.cc @@ -66,7 +66,7 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) { this->setApplicationName(QGC_APPLICATION_NAME); this->setApplicationVersion(QGC_APPLICATION_VERSION); - this->setOrganizationName(QLatin1String("PIXHAWK Association Zurich")); + this->setOrganizationName(QLatin1String("OPENMAV")); this->setOrganizationDomain("http://qgroundcontrol.org"); // Show splash screen @@ -105,10 +105,6 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) // Start the user interface splashScreen->showMessage(tr("Starting User Interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); // Start UI - mainWindow = new MainWindow(); - - // Remove splash screen - splashScreen->finish(mainWindow); // Connect links // to make sure that all components are initialized when the @@ -117,7 +113,21 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) // Listen on Multicast-Address 239.255.77.77, Port 14550 //QHostAddress * multicast_udp = new QHostAddress("239.255.77.77"); //UDPLink* udpLink = new UDPLink(*multicast_udp, 14550); - mainWindow->addLink(udpLink); + //mainWindow->addLink(udpLink); + +#ifdef OPAL_RT + // Add OpalRT Link, but do not connect + OpalLink* opalLink = new OpalLink(); + //mainWindow->addLink(opalLink); +#endif + // MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(MG::DIR::getSupportFilesDirectory() + "/demo-log.txt"); + MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt"); + //mainWindow->addLink(simulationLink); + + mainWindow = MainWindow::instance(); + + // Remove splash screen + splashScreen->finish(mainWindow); // Check if link could be connected if (!udpLink->connect()) @@ -140,15 +150,6 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) QTimer::singleShot(200, mainWindow, SLOT(close())); } } - -#ifdef OPAL_RT - // Add OpalRT Link, but do not connect - OpalLink* opalLink = new OpalLink(); - mainWindow->addLink(opalLink); -#endif - // MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(MG::DIR::getSupportFilesDirectory() + "/demo-log.txt"); - MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt"); - mainWindow->addLink(simulationLink); } /** diff --git a/src/comm/LinkManager.cc b/src/comm/LinkManager.cc index 802cf1741..c2cf73b94 100644 --- a/src/comm/LinkManager.cc +++ b/src/comm/LinkManager.cc @@ -67,6 +67,7 @@ LinkManager::~LinkManager() void LinkManager::add(LinkInterface* link) { if(!link) return; + connect(link, SIGNAL(destroyed(QObject*)), this, SLOT(removeLink(QObject*))); links.append(link); emit newLink(link); } @@ -127,6 +128,17 @@ bool LinkManager::disconnectLink(LinkInterface* link) return link->disconnect(); } +void LinkManager::removeLink(QObject* link) +{ + LinkInterface* linkInterface = dynamic_cast(link); + // Add link to link list + if (links.contains(linkInterface)) + { + int linkIndex = links.indexOf(linkInterface); + links.removeAt(linkIndex); + } +} + bool LinkManager::removeLink(LinkInterface* link) { if(link) diff --git a/src/comm/LinkManager.h b/src/comm/LinkManager.h index 8d283c3de..36ef64cee 100644 --- a/src/comm/LinkManager.h +++ b/src/comm/LinkManager.h @@ -67,6 +67,7 @@ public slots: void add(LinkInterface* link); void addProtocol(LinkInterface* link, ProtocolInterface* protocol); + void removeLink(QObject* link); bool removeLink(LinkInterface* link); bool connectAll(); diff --git a/src/comm/MAVLinkSimulationLink.cc b/src/comm/MAVLinkSimulationLink.cc index 35cd85a75..6a909edcb 100644 --- a/src/comm/MAVLinkSimulationLink.cc +++ b/src/comm/MAVLinkSimulationLink.cc @@ -927,6 +927,18 @@ bool MAVLinkSimulationLink::connect() return true; } +/** + * Connect the link. + * + * @param connect true connects the link, false disconnects it + * @return True if connection has been established, false if connection + * couldn't be established. + **/ +void MAVLinkSimulationLink::connectLink() +{ + this->connect(); +} + /** * Connect the link. * diff --git a/src/comm/MAVLinkSimulationLink.h b/src/comm/MAVLinkSimulationLink.h index fe92e5fa8..db40af5b2 100644 --- a/src/comm/MAVLinkSimulationLink.h +++ b/src/comm/MAVLinkSimulationLink.h @@ -87,6 +87,7 @@ public slots: void readBytes(); virtual void mainloop(); bool connectLink(bool connect); + void connectLink(); protected: diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index 5c58a34f0..87650a671 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -1532,7 +1532,7 @@ void UAS::addLink(LinkInterface* link) links->append(link); } //links->append(link); - qDebug() << link<<" ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK"; + //qDebug() << link<<" ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK"; } /** diff --git a/src/ui/DebugConsole.cc b/src/ui/DebugConsole.cc index 9853826dd..36629e67d 100644 --- a/src/ui/DebugConsole.cc +++ b/src/ui/DebugConsole.cc @@ -125,12 +125,28 @@ void DebugConsole::addLink(LinkInterface* link) // Register for name changes connect(link, SIGNAL(nameChanged(QString)), this, SLOT(updateLinkName(QString))); + connect(link, SIGNAL(destroyed(QObject*)), this, SLOT(removeLink(QObject*))); +} + +void DebugConsole::removeLink(QObject* link) +{ + LinkInterface* linkInterface = dynamic_cast(link); + // Add link to link list + if (links.contains(linkInterface)) + { + int linkIndex = links.indexOf(linkInterface); + + links.removeAt(linkIndex); + + m_ui->linkComboBox->removeItem(linkIndex); + } + if (link == currLink) currLink = NULL; } void DebugConsole::linkSelected(int linkId) { // Disconnect - if (currLink != NULL) + if (currLink) { disconnect(currLink, SIGNAL(bytesReceived(LinkInterface*,QByteArray)), this, SLOT(receiveBytes(LinkInterface*, QByteArray))); } diff --git a/src/ui/DebugConsole.h b/src/ui/DebugConsole.h index ffc97c45b..b68fa7c11 100644 --- a/src/ui/DebugConsole.h +++ b/src/ui/DebugConsole.h @@ -59,6 +59,8 @@ public: public slots: /** @brief Add a link to the list of monitored links */ void addLink(LinkInterface* link); + /** @brief Remove a link from the list */ + void removeLink(QObject* link); /** @brief Update a link name */ void updateLinkName(QString name); /** @brief Select a link for the active view */ diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index be6980c35..2360cfcc4 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -38,6 +38,20 @@ #include "LogCompressor.h" +MainWindow* MainWindow::instance() +{ + static MainWindow* _instance = 0; + if(_instance == 0) + { + _instance = new MainWindow(); + + /* Set the application as parent to ensure that this object + * will be destroyed when the main application exits */ + //_instance->setParent(qApp); + } + return _instance; +} + /** * Create new mainwindow. The constructor instantiates all parts of the user * interface. It does NOT show the mainwindow. To display it, call the show() @@ -82,35 +96,17 @@ MainWindow::MainWindow(QWidget *parent): connectCommonActions(); // Load mavlink view as default widget set - loadMAVLinkView(); + //loadMAVLinkView(); // Adjust the size adjustSize(); - // Load previous widget setup - - // // FIXME WORK IN PROGRESS - // QSettings settings(QGC::COMPANYNAME, QGC::APPNAME); - - // QList dockwidgets = qFindChildren(this); - // if (dockwidgets.size()) - // { - // settings.beginGroup("mainwindow/dockwidgets"); - // for (int i = 0; i < dockwidgets.size(); ++i) - // { - // QDockWidget *dockWidget = dockwidgets.at(i); - // if (dockWidget->parentWidget() == this) - // { - // if (settings.contains(dockWidget->windowTitle())) - // { - // dockWidget->setVisible(settings.value(dockWidget->windowTitle(), dockWidget->isVisible()).toBool()); - // } - // } - // } - // settings.endGroup(); - // } - -// // Select the right perspective + // Populate link menu + QList links = LinkManager::instance()->getLinks(); + foreach(LinkInterface* link, links) + { + this->addLink(link); + } // Enable and update view this->show(); @@ -398,8 +394,10 @@ void MainWindow::addToToolsMenu ( QWidget* widget, if (!settings.contains(posKey)){ settings.setValue(posKey,location); dockWidgetLocations[tool] = location; - } else { - dockWidgetLocations[tool] = static_cast (settings.value(posKey).toInt()); + } + else + { + dockWidgetLocations[tool] = static_cast (settings.value(posKey, Qt::RightDockWidgetArea).toInt()); } chKey = buildMenuKey(SUB_SECTION_CHECKED,tool, currentView); @@ -412,7 +410,7 @@ void MainWindow::addToToolsMenu ( QWidget* widget, else { tempAction->setChecked(settings.value(chKey).toBool()); - widget->setVisible(settings.value(chKey).toBool()); + widget->setVisible(settings.value(chKey, false).toBool()); } // connect the action @@ -456,7 +454,16 @@ void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view) Qt::DockWidgetArea tempLocation; QDockWidget* tempWidget = static_cast (dockWidgets[widget]); - tempVisible = settings.value(buildMenuKey (SUB_SECTION_CHECKED,widget,view)).toBool(); + tempVisible = settings.value(buildMenuKey (SUB_SECTION_CHECKED,widget,view), false).toBool(); + + // Some widgets are per default visible. Overwrite the settings value if not present. + if (widget == MainWindow::MENU_UAS_LIST) + { + if (!settings.contains(buildMenuKey (SUB_SECTION_CHECKED,widget,view))) + { + tempVisible = true; + } + } if (tempWidget) { @@ -466,9 +473,17 @@ void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view) //qDebug() << buildMenuKey (SUB_SECTION_CHECKED,widget,view) << tempVisible; - tempLocation = static_cast (settings.value(buildMenuKey (SUB_SECTION_LOCATION,widget, view)).toInt()); + tempLocation = static_cast (settings.value(buildMenuKey (SUB_SECTION_LOCATION,widget, view), QVariant(Qt::RightDockWidgetArea)).toInt()); + + if (widget == MainWindow::MENU_UAS_LIST) + { + if (!settings.contains(buildMenuKey (SUB_SECTION_LOCATION,widget, view))) + { + tempLocation = Qt::RightDockWidgetArea; + } + } - if (tempWidget && tempVisible) + if ((tempWidget != NULL) && tempVisible) { addDockWidget(tempLocation, tempWidget); tempWidget->show(); diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 4cc664427..1abf9761c 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -83,7 +83,7 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - MainWindow(QWidget *parent = 0); + static MainWindow* instance(); ~MainWindow(); public slots: @@ -188,6 +188,8 @@ public slots: protected: + MainWindow(QWidget *parent = 0); + // These defines are used to save the settings when selecting with // which widgets populate the views // FIXME: DO NOT PUT CUSTOM VALUES IN THIS ENUM since it is iterated over diff --git a/src/ui/uas/QGCUnconnectedInfoWidget.cc b/src/ui/uas/QGCUnconnectedInfoWidget.cc new file mode 100644 index 000000000..7adbfef80 --- /dev/null +++ b/src/ui/uas/QGCUnconnectedInfoWidget.cc @@ -0,0 +1,17 @@ +#include "QGCUnconnectedInfoWidget.h" +#include "ui_QGCUnconnectedInfoWidget.h" + +QGCUnconnectedInfoWidget::QGCUnconnectedInfoWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::QGCUnconnectedInfoWidget) +{ + ui->setupUi(this); + + connect(ui->simulationButton, SIGNAL(clicked()), this, SIGNAL(simulation())); + connect(ui->connectButton, SIGNAL(clicked()), this, SIGNAL(addLink())); +} + +QGCUnconnectedInfoWidget::~QGCUnconnectedInfoWidget() +{ + delete ui; +} diff --git a/src/ui/uas/QGCUnconnectedInfoWidget.h b/src/ui/uas/QGCUnconnectedInfoWidget.h new file mode 100644 index 000000000..b5b282ac7 --- /dev/null +++ b/src/ui/uas/QGCUnconnectedInfoWidget.h @@ -0,0 +1,25 @@ +#ifndef QGCUNCONNECTEDINFOWIDGET_H +#define QGCUNCONNECTEDINFOWIDGET_H + +#include + +namespace Ui { + class QGCUnconnectedInfoWidget; +} + +class QGCUnconnectedInfoWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QGCUnconnectedInfoWidget(QWidget *parent = 0); + ~QGCUnconnectedInfoWidget(); + + Ui::QGCUnconnectedInfoWidget *ui; + +signals: + void simulation(); + void addLink(); +}; + +#endif // QGCUNCONNECTEDINFOWIDGET_H diff --git a/src/ui/uas/QGCUnconnectedInfoWidget.ui b/src/ui/uas/QGCUnconnectedInfoWidget.ui new file mode 100644 index 000000000..9b3b50b71 --- /dev/null +++ b/src/ui/uas/QGCUnconnectedInfoWidget.ui @@ -0,0 +1,81 @@ + + + QGCUnconnectedInfoWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QTextEdit::AutoAll + + + false + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Unmanned System List</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:6pt; font-weight:600;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">No Systems are connected yet.</span><span style=" font-size:10pt;"> Please either connect a link or use the simulation function to see QGroundControl in action.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-style:italic;">Click on the simulation button below to simulate a micro air vehicle or on the connect link button to connect a serial port link. A UDP link is already open for connections.</span></p></td></tr></table></body></html> + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Simulate MAV + + + + + + + Connect Link + + + + + + + + diff --git a/src/ui/uas/UASListWidget.cc b/src/ui/uas/UASListWidget.cc index e4fb0026f..1d2c3885f 100644 --- a/src/ui/uas/UASListWidget.cc +++ b/src/ui/uas/UASListWidget.cc @@ -33,12 +33,17 @@ This file is part of the PIXHAWK project #include #include #include +#include #include "MG.h" #include "UASListWidget.h" #include "UASManager.h" #include "UAS.h" #include "UASView.h" +#include "QGCUnconnectedInfoWidget.h" +#include "MainWindow.h" +#include "MAVLinkSimulationLink.h" +#include "LinkManager.h" UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::UASList) { @@ -48,6 +53,13 @@ UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::UA listLayout->setAlignment(Qt::AlignTop); this->setLayout(listLayout); + // Construct initial widget + uWidget = new QGCUnconnectedInfoWidget(this); + listLayout->addWidget(uWidget); + + connect(uWidget, SIGNAL(addLink()), this, SLOT(addLink())); + connect(uWidget, SIGNAL(simulation()), this, SLOT(simulate())); + this->setMinimumWidth(250); uasViews = QMap(); @@ -72,11 +84,32 @@ void UASListWidget::changeEvent(QEvent *e) } } +void UASListWidget::addLink() +{ + MainWindow::instance()->addLink(); +} + +void UASListWidget::simulate() +{ + // Try to get reference to MAVLinkSimulationlink + QList links = LinkManager::instance()->getLinks(); + foreach(LinkInterface* link, links) + { + MAVLinkSimulationLink* sim = dynamic_cast(link); + if (sim) + { + sim->connectLink(); + } + } +} + void UASListWidget::addUAS(UASInterface* uas) { - if (uasViews.size() == 0) + if (uasViews.isEmpty()) { - // TODO Add label when no UAS is present yet. + listLayout->removeWidget(uWidget); + delete uWidget; + uWidget = NULL; } if (!uasViews.contains(uas)) diff --git a/src/ui/uas/UASListWidget.h b/src/ui/uas/UASListWidget.h index 33d0c7b88..a4150f83a 100644 --- a/src/ui/uas/UASListWidget.h +++ b/src/ui/uas/UASListWidget.h @@ -36,6 +36,7 @@ This file is part of the QGROUNDCONTROL project #include #include "UASInterface.h" #include "UASView.h" +#include "QGCUnconnectedInfoWidget.h" #include "ui_UASList.h" class UASListWidget : public QWidget @@ -51,9 +52,14 @@ public slots: void activeUAS(UASInterface* uas); void removeUAS(UASInterface* uas); + // TODO Kind of hack, works flawless but is bad architecture + void addLink(); + void simulate(); + protected: QMap uasViews; QVBoxLayout* listLayout; + QGCUnconnectedInfoWidget* uWidget; void changeEvent(QEvent *e); private: -- 2.22.0