From f229dbaaa7f516dc1958d0a0555b47cb17136377 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Fri, 4 Dec 2020 08:03:40 +0100 Subject: Do not store the list of preview plugins in PreviewGenerator. --- src/previewgenerator.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) (limited to 'src/previewgenerator.cpp') diff --git a/src/previewgenerator.cpp b/src/previewgenerator.cpp index c7df5a25..904d679f 100644 --- a/src/previewgenerator.cpp +++ b/src/previewgenerator.cpp @@ -27,33 +27,32 @@ along with Mod Organizer. If not, see . #include "plugincontainer.h" +using namespace MOBase; + PreviewGenerator::PreviewGenerator(const PluginContainer* pluginContainer) : m_PluginContainer(pluginContainer) { m_MaxSize = QGuiApplication::primaryScreen()->size() * 0.8; } -void PreviewGenerator::registerPlugin(MOBase::IPluginPreview *plugin) -{ - for (const QString &extension : plugin->supportedExtensions()) { - m_PreviewPlugins.insert(std::make_pair(extension, plugin)); - } -} - bool PreviewGenerator::previewSupported(const QString &fileExtension) const { - auto it = m_PreviewPlugins.find(fileExtension.toLower()); - if (it == m_PreviewPlugins.end()) { - return false; + auto& previews = m_PluginContainer->plugins(); + for (auto* preview : previews) { + if (preview->supportedExtensions().contains(fileExtension)) { + return true; + } } - return m_PluginContainer->isEnabled(it->second); + return false; } QWidget *PreviewGenerator::genPreview(const QString &fileName) const { - auto iter = m_PreviewPlugins.find(QFileInfo(fileName).suffix().toLower()); - if (iter != m_PreviewPlugins.end() && m_PluginContainer->isEnabled(iter->second)) { - return iter->second->genFilePreview(fileName, m_MaxSize); - } else { - return nullptr; + const QString ext = QFileInfo(fileName).suffix().toLower(); + auto& previews = m_PluginContainer->plugins(); + for (auto* preview : previews) { + if (m_PluginContainer->isEnabled(preview) && preview->supportedExtensions().contains(ext)) { + return preview->genFilePreview(fileName, m_MaxSize); + } } + return nullptr; } -- cgit v1.3.1 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/previewgenerator.cpp') 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