From 8b02a5a7965440b883e9601ece0e30bca1169a65 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Fri, 4 Dec 2020 19:32:11 +0100 Subject: Fix crash when starting MO2 without instance. --- src/plugincontainer.cpp | 22 +++++++++++++--------- src/plugincontainer.h | 2 ++ src/previewgenerator.cpp | 8 ++++---- src/previewgenerator.h | 4 ++-- 4 files changed, 21 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index e4eb389f..c703a36a 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -280,7 +280,7 @@ void PluginRequirements::requiredFor(std::vector &required, st PluginContainer::PluginContainer(OrganizerCore *organizer) : m_Organizer(organizer) , m_UserInterface(nullptr) - , m_PreviewGenerator(this) + , m_PreviewGenerator(*this) { } @@ -397,6 +397,7 @@ bool PluginContainer::initPlugin(IPlugin *plugin, IPluginProxy *pluginProxy, boo OrganizerProxy* proxy = nullptr; if (m_Organizer) { proxy = new OrganizerProxy(m_Organizer, this, plugin); + proxy->setParent(as_qobject(plugin)); } // Check if it is a proxy plugin: @@ -417,8 +418,6 @@ bool PluginContainer::initPlugin(IPlugin *plugin, IPluginProxy *pluginProxy, boo return false; } - proxy->setParent(as_qobject(plugin)); - // Update requirements: it->second.fetchRequirements(); @@ -732,12 +731,17 @@ void PluginContainer::startPluginsImpl(const std::vector& plugins) con } // Trigger initial callbacks, e.g. onUserInterfaceInitialized and onProfileChanged. - for (auto* object : plugins) { - auto* plugin = qobject_cast(object); - auto* oproxy = organizerProxy(plugin); - oproxy->connectSignals(); - oproxy->m_UserInterfaceInitialized(m_UserInterface->mainWindow()); - oproxy->m_ProfileChanged(nullptr, m_Organizer->currentProfile()); + if (m_Organizer) { + for (auto* object : plugins) { + auto* plugin = qobject_cast(object); + auto* oproxy = organizerProxy(plugin); + oproxy->connectSignals(); + oproxy->m_ProfileChanged(nullptr, m_Organizer->currentProfile()); + + if (m_UserInterface) { + oproxy->m_UserInterfaceInitialized(m_UserInterface->mainWindow()); + } + } } } diff --git a/src/plugincontainer.h b/src/plugincontainer.h index 4eb30db6..386b9bca 100644 --- a/src/plugincontainer.h +++ b/src/plugincontainer.h @@ -462,8 +462,10 @@ private: MOBase::IPlugin* registerPlugin(QObject *pluginObj, const QString &fileName, MOBase::IPluginProxy *proxy); + // Core organizer, can be null (e.g. on first MO2 startup). OrganizerCore *m_Organizer; + // Main user interface, can be null until MW has been initialized. IUserInterface *m_UserInterface; PluginMap m_Plugins; diff --git a/src/previewgenerator.cpp b/src/previewgenerator.cpp index 904d679f..22332af3 100644 --- a/src/previewgenerator.cpp +++ b/src/previewgenerator.cpp @@ -29,14 +29,14 @@ along with Mod Organizer. If not, see . using namespace MOBase; -PreviewGenerator::PreviewGenerator(const PluginContainer* pluginContainer) : +PreviewGenerator::PreviewGenerator(const PluginContainer& pluginContainer) : m_PluginContainer(pluginContainer) { m_MaxSize = QGuiApplication::primaryScreen()->size() * 0.8; } bool PreviewGenerator::previewSupported(const QString &fileExtension) const { - auto& previews = m_PluginContainer->plugins(); + auto& previews = m_PluginContainer.plugins(); for (auto* preview : previews) { if (preview->supportedExtensions().contains(fileExtension)) { return true; @@ -48,9 +48,9 @@ bool PreviewGenerator::previewSupported(const QString &fileExtension) const QWidget *PreviewGenerator::genPreview(const QString &fileName) const { const QString ext = QFileInfo(fileName).suffix().toLower(); - auto& previews = m_PluginContainer->plugins(); + auto& previews = m_PluginContainer.plugins(); for (auto* preview : previews) { - if (m_PluginContainer->isEnabled(preview) && preview->supportedExtensions().contains(ext)) { + if (m_PluginContainer.isEnabled(preview) && preview->supportedExtensions().contains(ext)) { return preview->genFilePreview(fileName, m_MaxSize); } } diff --git a/src/previewgenerator.h b/src/previewgenerator.h index f70649b5..8e491116 100644 --- a/src/previewgenerator.h +++ b/src/previewgenerator.h @@ -31,7 +31,7 @@ class PluginContainer; class PreviewGenerator { public: - PreviewGenerator(const PluginContainer* pluginContainer); + PreviewGenerator(const PluginContainer& pluginContainer); bool previewSupported(const QString &fileExtension) const; @@ -39,7 +39,7 @@ public: private: - const PluginContainer* m_PluginContainer; + const PluginContainer& m_PluginContainer; QSize m_MaxSize; }; -- cgit v1.3.1