diff --git a/src/backend/metadata.cpp b/src/backend/metadata.cpp index 947f30bc..67985bbb 100644 --- a/src/backend/metadata.cpp +++ b/src/backend/metadata.cpp @@ -472,12 +472,7 @@ namespace loot { BOOST_LOG_TRIVIAL(trace) << "Calculating metadata difference for: " << name; Plugin p(*this); - p.Enabled(plugin.Enabled()); - if (priority != plugin.Priority()) { - p.Priority(plugin.Priority()); - p.SetPriorityExplicit(plugin.IsPriorityExplicit()); - } - else { + if (priority == plugin.Priority()) { p.Priority(0); p.SetPriorityExplicit(false); } @@ -485,17 +480,17 @@ namespace loot { //Compare this plugin against the given plugin. set files = plugin.LoadAfter(); set filesDiff; - set_symmetric_difference(files.begin(), files.end(), loadAfter.begin(), loadAfter.end(), inserter(filesDiff, filesDiff.begin())); + set_symmetric_difference(loadAfter.begin(), loadAfter.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin())); p.LoadAfter(filesDiff); filesDiff.clear(); files = plugin.Reqs(); - set_symmetric_difference(files.begin(), files.end(), requirements.begin(), requirements.end(), inserter(filesDiff, filesDiff.begin())); + set_symmetric_difference(requirements.begin(), requirements.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin())); p.Reqs(filesDiff); filesDiff.clear(); files = plugin.Incs(); - set_symmetric_difference(files.begin(), files.end(), incompatibilities.begin(), incompatibilities.end(), inserter(filesDiff, filesDiff.begin())); + set_symmetric_difference(incompatibilities.begin(), incompatibilities.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin())); p.Incs(filesDiff); list msgs1 = plugin.Messages(); @@ -503,17 +498,58 @@ namespace loot { msgs1.sort(); msgs2.sort(); list mDiff; - set_symmetric_difference(msgs1.begin(), msgs1.end(), msgs2.begin(), msgs2.end(), inserter(mDiff, mDiff.begin())); + set_symmetric_difference(msgs2.begin(), msgs2.end(), msgs1.begin(), msgs1.end(), inserter(mDiff, mDiff.begin())); p.Messages(mDiff); set bashTags = plugin.Tags(); set tagDiff; - set_symmetric_difference(bashTags.begin(), bashTags.end(), tags.begin(), tags.end(), inserter(tagDiff, tagDiff.begin())); + set_symmetric_difference(tags.begin(), tags.end(), bashTags.begin(), bashTags.end(), inserter(tagDiff, tagDiff.begin())); p.Tags(tagDiff); set dirtyInfo = plugin.DirtyInfo(); set dirtDiff; - set_symmetric_difference(dirtyInfo.begin(), dirtyInfo.end(), _dirtyInfo.begin(), _dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin())); + set_symmetric_difference(_dirtyInfo.begin(), _dirtyInfo.end(), dirtyInfo.begin(), dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin())); + p.DirtyInfo(dirtDiff); + + return p; + } + + Plugin Plugin::NewMetadata(const Plugin& plugin) const { + BOOST_LOG_TRIVIAL(trace) << "Comparing new metadata for: " << name; + Plugin p(*this); + + //Compare this plugin against the given plugin. + set files = plugin.LoadAfter(); + set filesDiff; + set_difference(loadAfter.begin(), loadAfter.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin())); + p.LoadAfter(filesDiff); + + filesDiff.clear(); + files = plugin.Reqs(); + set_difference(requirements.begin(), requirements.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin())); + p.Reqs(filesDiff); + + filesDiff.clear(); + files = plugin.Incs(); + set_difference(incompatibilities.begin(), incompatibilities.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin())); + p.Incs(filesDiff); + + list msgs1 = plugin.Messages(); + list msgs2 = messages; + msgs1.sort(); + msgs2.sort(); + list mDiff; + set_difference(msgs2.begin(), msgs2.end(), msgs1.begin(), msgs1.end(), inserter(mDiff, mDiff.begin())); + p.Messages(mDiff); + + set bashTags = plugin.Tags(); + set tagDiff; + set_difference(tags.begin(), tags.end(), bashTags.begin(), bashTags.end(), inserter(tagDiff, tagDiff.begin())); + p.Tags(tagDiff); + + set dirtyInfo = plugin.DirtyInfo(); + set dirtDiff; + set_difference(_dirtyInfo.begin(), _dirtyInfo.end(), dirtyInfo.begin(), dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin())); p.DirtyInfo(dirtDiff); return p; diff --git a/src/backend/metadata.h b/src/backend/metadata.h index 95de1d7f..00af7075 100644 --- a/src/backend/metadata.h +++ b/src/backend/metadata.h @@ -172,10 +172,15 @@ namespace loot { void MergeMetadata(const Plugin& plugin); //Returns the difference in metadata between the two plugins. - //For 'enabled', use the given plugin's value. - //For 'priority', use the given plugin's value, unless it is equal to this plugin's value, in which case return 0. + //For 'enabled', use this plugin's value. + //For 'priority', use 0 if the two plugin priorities are equal, and make it not explicit. Otherwise use this plugin's value. Plugin DiffMetadata(const Plugin& plugin) const; + // Returns metadata in this plugin not in the given plugin. + //For 'enabled', use this plugin's value. + //For 'priority', use 0 if the two plugin priorities are equal, and make it not explicit. Otherwise use this plugin's value. + Plugin NewMetadata(const Plugin& plugin) const; + std::string Name() const; bool Enabled() const; int Priority() const; diff --git a/src/gui/handler.cpp b/src/gui/handler.cpp index de229831..72237cfc 100644 --- a/src/gui/handler.cpp +++ b/src/gui/handler.cpp @@ -485,6 +485,16 @@ namespace loot { if (pluginMetadata["userlist"]["dirty"]) newUserlistEntry.DirtyInfo(pluginMetadata["userlist"]["dirty"].as>()); + // For cleanliness, only data that does not duplicate masterlist and plugin data should be retained, so diff that. + auto pluginIt = g_app_state.CurrentGame().plugins.find(boost::locale::to_lower(newUserlistEntry.Name())); + if (pluginIt != g_app_state.CurrentGame().plugins.end()) { + Plugin tempPlugin(pluginIt->second); + tempPlugin.MergeMetadata(g_app_state.CurrentGame().masterlist.FindPlugin(newUserlistEntry)); + newUserlistEntry = newUserlistEntry.NewMetadata(tempPlugin); + } + else + newUserlistEntry = newUserlistEntry.NewMetadata(g_app_state.CurrentGame().masterlist.FindPlugin(newUserlistEntry)); + // Now replace existing userlist entry with the new one. if (!ulistPlugin.HasNameOnly()) { BOOST_LOG_TRIVIAL(trace) << "Replacing existing userlist entry with new metadata.";