1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-14 16:11:33 +00:00

Force alphabetical order per data dir

This commit is contained in:
Evil Eye 2021-11-09 16:47:42 +01:00
parent a3e039d862
commit 099cd8a20c

View file

@ -1,8 +1,8 @@
#include "contentmodel.hpp" #include "contentmodel.hpp"
#include "esmfile.hpp" #include "esmfile.hpp"
#include <algorithm>
#include <stdexcept> #include <stdexcept>
#include <unordered_set>
#include <QDir> #include <QDir>
#include <QTextCodec> #include <QTextCodec>
@ -421,6 +421,7 @@ void ContentSelectorModel::ContentModel::addFiles(const QString &path)
if (mShowOMWScripts) if (mShowOMWScripts)
filters << "*.omwscripts"; filters << "*.omwscripts";
dir.setNameFilters(filters); dir.setNameFilters(filters);
dir.setSorting(QDir::Name);
for (const QString &path2 : dir.entryList()) for (const QString &path2 : dir.entryList())
{ {
@ -504,28 +505,34 @@ QStringList ContentSelectorModel::ContentModel::gameFiles() const
void ContentSelectorModel::ContentModel::sortFiles() void ContentSelectorModel::ContentModel::sortFiles()
{ {
emit layoutAboutToBeChanged(); emit layoutAboutToBeChanged();
std::sort(mFiles.begin(), mFiles.end(), [](const EsmFile* a, const EsmFile* b)
{
return a->fileName().compare(b->fileName(), Qt::CaseInsensitive) > 0;
});
//Dependency sort //Dependency sort
int sorted = 1; std::unordered_set<const EsmFile*> moved;
//iterate each file, obtaining a reference to its gamefiles list for(int i = mFiles.size() - 1; i > 0;)
for(int i = sorted; i < mFiles.size(); ++i)
{ {
const QStringList& gameFiles = mFiles.at(i)->gameFiles(); const auto file = mFiles.at(i);
int j = sorted; if(moved.find(file) == moved.end())
for(;j > 0; --j)
{ {
const auto file = mFiles.at(j - 1); int index = -1;
for(int j = 0; j < i; ++j)
{
const QStringList& gameFiles = mFiles.at(j)->gameFiles();
if(gameFiles.contains(file->fileName(), Qt::CaseInsensitive) if(gameFiles.contains(file->fileName(), Qt::CaseInsensitive)
|| (!mFiles.at(i)->isGameFile() && gameFiles.isEmpty() || (!mFiles.at(j)->isGameFile() && gameFiles.isEmpty()
&& file->fileName().compare("Morrowind.esm", Qt::CaseInsensitive) == 0)) // Hack: implicit dependency on Morrowind.esm for dependency-less files && file->fileName().compare("Morrowind.esm", Qt::CaseInsensitive) == 0)) // Hack: implicit dependency on Morrowind.esm for dependency-less files
{
index = j;
break; break;
} }
if(i != j) }
mFiles.move(i, j); if(index >= 0)
++sorted; {
mFiles.move(i, index);
moved.insert(file);
continue;
}
}
--i;
moved.clear();
} }
emit layoutChanged(); emit layoutChanged();
} }