From feb411fb2a320284cb01ee9f5ca13baf105c1f29 Mon Sep 17 00:00:00 2001 From: Chris Bessent Date: Sun, 23 Jan 2022 08:25:58 -0700 Subject: Force priority of primary plugins This fixes a problem with new instances where the primary plugins would be ordered alphabetically instead of in the correct order. --- src/pluginlist.cpp | 39 +++++++++++++++++++++++++++++++++++---- src/pluginlist.h | 3 ++- 2 files changed, 37 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 3812143a..692d03dd 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -272,6 +272,8 @@ void PluginList::refresh(const QString &profileName gamePlugins->readPluginLists(m_Organizer.managedGameOrganizer()->pluginList()); } + fixPrimaryPlugins(); + testMasters(); updateIndices(); @@ -287,6 +289,35 @@ void PluginList::refresh(const QString &profileName m_Refreshed(); } +void PluginList::fixPrimaryPlugins() +{ + if (!m_Organizer.settings().game().forceEnableCoreFiles()) { + return; + } + + // This function ensures that the primary plugins are first and in the correct order + QStringList primaryPlugins = m_Organizer.managedGame()->primaryPlugins(); + int prio = 0; + bool somethingChanged = false; + for (QString plugin : primaryPlugins) { + std::map::iterator iter = m_ESPsByName.find(plugin); + // Plugin is present? + if (iter != m_ESPsByName.end()) { + if (prio != m_ESPs[iter->second].priority) { + // Priority is wrong! Fix it! + int newPrio = prio; + setPluginPriority(iter->second, newPrio, true /* isForced */); + somethingChanged = true; + } + prio++; + } + } + + if (somethingChanged) { + writePluginsList(); + } +} + void PluginList::fixPriorities() { std::vector> espPrios; @@ -1423,7 +1454,7 @@ Qt::ItemFlags PluginList::flags(const QModelIndex &modelIndex) const return result; } -void PluginList::setPluginPriority(int row, int &newPriority) +void PluginList::setPluginPriority(int row, int &newPriority, bool isForced) { int newPriorityTemp = newPriority; @@ -1490,11 +1521,11 @@ void PluginList::changePluginPriority(std::vector rows, int newPriority) // don't try to move plugins before force-enabled plugins for (std::vector::const_iterator iter = m_ESPs.begin(); - iter != m_ESPs.end(); ++iter) { + iter != m_ESPs.end(); ++iter) { if (iter->forceEnabled) { - newPriority = std::max(newPriority, iter->priority+1); + newPriority = std::max(newPriority, iter->priority + 1); } - maxPriority = std::max(maxPriority, iter->priority+1); + maxPriority = std::max(maxPriority, iter->priority + 1); minPriority = std::min(minPriority, iter->priority); } diff --git a/src/pluginlist.h b/src/pluginlist.h index a4310d2a..a6efa71b 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -353,11 +353,12 @@ private: void writeLockedOrder(const QString &fileName) const; void readLockedOrderFrom(const QString &fileName); - void setPluginPriority(int row, int &newPriority); + void setPluginPriority(int row, int &newPriority, bool isForced=false); void changePluginPriority(std::vector rows, int newPriority); void testMasters(); + void fixPrimaryPlugins(); void fixPriorities(); int findPluginByPriority(int priority); -- cgit v1.3.1