summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp16
-rw-r--r--src/plugincontainer.cpp8
-rw-r--r--src/plugincontainer.h1
3 files changed, 16 insertions, 9 deletions
diff --git a/src/main.cpp b/src/main.cpp
index c7a2834c..46f2f0aa 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -560,6 +560,7 @@ int runApplication(MOApplication &application, SingleInstance &instance,
});
log::debug("initializing core");
+ std::unique_ptr<PluginContainer> pluginContainer;
OrganizerCore organizer(settings);
if (!organizer.bootstrap()) {
reportError("failed to set up data paths");
@@ -582,11 +583,11 @@ int runApplication(MOApplication &application, SingleInstance &instance,
}
log::debug("initializing plugins");
- PluginContainer pluginContainer(&organizer);
- pluginContainer.loadPlugins();
+ pluginContainer = std::make_unique<PluginContainer>(&organizer);
+ pluginContainer->loadPlugins();
MOBase::IPluginGame *game = determineCurrentGame(
- application.applicationDirPath(), settings, pluginContainer);
+ application.applicationDirPath(), settings, *pluginContainer);
if (game == nullptr) {
InstanceManager &instance = InstanceManager::instance();
@@ -723,7 +724,7 @@ int runApplication(MOApplication &application, SingleInstance &instance,
QString apiKey;
if (settings.nexus().apiKey(apiKey)) {
- NexusInterface::instance(&pluginContainer)->getAccessManager()->apiCheck(apiKey);
+ NexusInterface::instance(pluginContainer.get())->getAccessManager()->apiCheck(apiKey);
}
log::debug("initializing tutorials");
@@ -741,9 +742,9 @@ int runApplication(MOApplication &application, SingleInstance &instance,
{ // scope to control lifetime of mainwindow
// set up main window and its data structures
- MainWindow mainWindow(settings, organizer, pluginContainer);
+ MainWindow mainWindow(settings, organizer, *pluginContainer);
- NexusInterface::instance(&pluginContainer)
+ NexusInterface::instance(pluginContainer.get())
->getAccessManager()->setTopLevelWidget(&mainWindow);
QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application,
@@ -766,13 +767,12 @@ int runApplication(MOApplication &application, SingleInstance &instance,
res = application.exec();
mainWindow.close();
- NexusInterface::instance(&pluginContainer)
+ NexusInterface::instance(pluginContainer.get())
->getAccessManager()->setTopLevelWidget(nullptr);
}
settings.geometry().resetIfNeeded();
return res;
-
} catch (const std::exception &e) {
reportError(e.what());
}
diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp
index caab2115..d989fac9 100644
--- a/src/plugincontainer.cpp
+++ b/src/plugincontainer.cpp
@@ -28,6 +28,10 @@ PluginContainer::PluginContainer(OrganizerCore *organizer)
{
}
+PluginContainer::~PluginContainer() {
+ m_Organizer = nullptr;
+ unloadPlugins();
+}
void PluginContainer::setUserInterface(IUserInterface *userInterface, QWidget *widget)
{
@@ -213,7 +217,9 @@ void PluginContainer::unloadPlugins()
}
// disconnect all slots before unloading plugins so plugins don't have to take care of that
- m_Organizer->disconnectPlugins();
+ if (m_Organizer != nullptr) {
+ m_Organizer->disconnectPlugins();
+ }
bf::for_each(m_Plugins, clearPlugins());
diff --git a/src/plugincontainer.h b/src/plugincontainer.h
index 21ad4241..d405198a 100644
--- a/src/plugincontainer.h
+++ b/src/plugincontainer.h
@@ -49,6 +49,7 @@ private:
public:
PluginContainer(OrganizerCore *organizer);
+ virtual ~PluginContainer();
void setUserInterface(IUserInterface *userInterface, QWidget *widget);