diff --git a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp index 884ceb4bd..f82433ae0 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp @@ -954,6 +954,10 @@ void MainWindow::shutdown() disconnect(QApplication::instance(), SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(updateFocusWidget(QWidget*,QWidget*))); m_activeContext = 0; + + // We have to remove all the existing gagdets at his point, not + // later! + uavGadgetInstanceManager()->removeAllGadgets(); } void MainWindow::createWorkspaces() { diff --git a/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.cpp b/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.cpp index f1b97f489..4776a7050 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.cpp @@ -67,6 +67,7 @@ UAVGadgetInstanceManager::~UAVGadgetInstanceManager() m_pm->removeObject(page); delete page; } + } void UAVGadgetInstanceManager::readConfigurations(QSettings *qs) @@ -275,6 +276,22 @@ void UAVGadgetInstanceManager::removeGadget(IUAVGadget *gadget) } } +/** + * Removes all the gadgets. This is called by the core plugin when + * shutting down: this ensures that all registered gadget factory destructors are + * indeed called when the GCS is shutting down. We can't destroy them at the end + * (coreplugin is deleted last), because the gadgets sometimes depend on other + * plugins, like uavobjects... + */ +void UAVGadgetInstanceManager::removeAllGadgets() +{ + foreach( IUAVGadget *gadget, m_gadgetInstances) { + m_gadgetInstances.removeOne(gadget); + delete gadget; + } +} + + bool UAVGadgetInstanceManager::canDeleteConfiguration(IUAVGadgetConfiguration *config) { // to be able to delete a configuration, no instance must be using it diff --git a/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.h b/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.h index 56f4516ed..3fc3b31c4 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.h +++ b/ground/openpilotgcs/src/plugins/coreplugin/uavgadgetinstancemanager.h @@ -62,6 +62,7 @@ public: void writeConfigurations(QSettings *qs); IUAVGadget *createGadget(QString classId, QWidget *parent); void removeGadget(IUAVGadget *gadget); + void removeAllGadgets(); bool canDeleteConfiguration(IUAVGadgetConfiguration *config); void deleteConfiguration(IUAVGadgetConfiguration *config); void cloneConfiguration(IUAVGadgetConfiguration *config);