From 4c3080dfb51d73e30efe1e001d82ea3874566c23 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Thu, 20 Jun 2013 17:27:55 +0100 Subject: [PATCH] This might fix issue #26. Thinking about sorting does my head in though. --- src/backend/metadata.cpp | 27 +++++++++++++-------------- src/backend/metadata.h | 1 + src/gui/main.cpp | 13 ++++++++++++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/backend/metadata.cpp b/src/backend/metadata.cpp index 906c7570..ab58f19c 100644 --- a/src/backend/metadata.cpp +++ b/src/backend/metadata.cpp @@ -533,6 +533,15 @@ namespace boss { return overlap; } + + std::set Plugin::OverrideFormIDs() const { + set fidSubset; + for (set::const_iterator it = formIDs.begin(), endIt=formIDs.end(); it != endIt; ++it) { + if (!boost::iequals(it->Plugin(), name)) + fidSubset.insert(*it); + } + return fidSubset; + } std::vector Plugin::Masters() const { return masters; @@ -660,17 +669,8 @@ namespace boss { } bool load_order_sort(const Plugin& lhs, const Plugin& rhs) { - if (lhs.IsMaster() && !rhs.IsMaster()) - return true; - - if (!lhs.IsMaster() && rhs.IsMaster()) - return false; - - if (rhs.MustLoadAfter(lhs)) - return true; - if (lhs.MustLoadAfter(rhs)) - return false; + return false; if (lhs.Priority() < rhs.Priority()) return true; @@ -678,11 +678,10 @@ namespace boss { if (lhs.Priority() > rhs.Priority()) return false; - if (!lhs.OverlapFormIDs(rhs).empty() && lhs.FormIDs().size() != rhs.FormIDs().size()) - return lhs.FormIDs().size() > rhs.FormIDs().size(); + if (!lhs.OverlapFormIDs(rhs).empty() && lhs.OverrideFormIDs().size() != rhs.OverrideFormIDs().size()) + return lhs.OverrideFormIDs().size() > rhs.OverrideFormIDs().size(); - // return boost::ilexicographical_compare(lhs.Name(), rhs.Name()); - return false; + return boost::ilexicographical_compare(lhs.Name(), rhs.Name()); } bool IsPlugin(const std::string& file) { diff --git a/src/backend/metadata.h b/src/backend/metadata.h index d514495a..3db4c6a3 100644 --- a/src/backend/metadata.h +++ b/src/backend/metadata.h @@ -174,6 +174,7 @@ namespace boss { //Load ordering functions. std::set OverlapFormIDs(const Plugin& plugin) const; + std::set OverrideFormIDs() const; bool MustLoadAfter(const Plugin& plugin) const; //Checks masters, reqs and loadAfter. //Validity checks. diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 82ecfc8e..c1bcb393 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -497,13 +497,22 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { out << "Sorting for: " << it->Name() << endl; + /* vector masters = it->Masters(); + if (!masters.empty()) { + out << "\t" << "Masters:" << endl; + for (size_t i=0, max=masters.size(); i < max; ++i) + out << "\t\t" << masters[i] << endl; + }*/ + list moved; while (jt != plugins.end()) { /* if (it->MustLoadAfter(*jt) || jt->Priority() < it->Priority()) { || (!jt->OverlapFormIDs(*it).empty() && jt->FormIDs().size() != it->FormIDs().size() && jt->FormIDs().size() > it->FormIDs().size())) { */ - if (load_order_sort(*jt, *it)) { + // if (load_order_sort(*jt, *it)) { + if (it->MustLoadAfter(*jt)) { + out << jt->Name() << " should load before " << it->Name() << endl; moved.push_back(*jt); jt = plugins.erase(jt); } else @@ -519,6 +528,8 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { progDia->Pulse(); } + + plugins.sort(boss::load_order_sort); end = time(NULL); out << "Time taken to sort plugins: " << (end - start) << " seconds." << endl;