From 38fa93312cf01764887d3c8e9d78ef85b3cd46ee Mon Sep 17 00:00:00 2001 From: edouard Date: Tue, 1 Feb 2011 22:47:10 +0000 Subject: [PATCH] OP-306 Tell core plugin to get rid of the gadgets upon plugin shutdown. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2678 ebee16cc-31ac-478f-84a7-5cbb03baadba --- .../src/plugins/coreplugin/mainwindow.cpp | 4 ++++ .../coreplugin/uavgadgetinstancemanager.cpp | 17 +++++++++++++++++ .../coreplugin/uavgadgetinstancemanager.h | 1 + 3 files changed, 22 insertions(+) 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);