Sort mod Minecraft versions as version lists (#5705)

This commit is contained in:
Alexandru Ionut Tripon 2026-06-26 11:55:20 +00:00 committed by GitHub
commit 62f537dd8d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 40 additions and 5 deletions

View file

@ -40,6 +40,7 @@
#include <QDir>
#include <QRegularExpression>
#include <QString>
#include <algorithm>
#include "MTPixmapCache.h"
#include "MetadataHandler.h"
@ -49,6 +50,34 @@
#include "minecraft/mod/tasks/LocalModParseTask.h"
#include "modplatform/ModIndex.h"
namespace {
int compareVersionLists(const QStringList& leftVersions, const QStringList& rightVersions)
{
const qsizetype commonSize = std::min(leftVersions.size(), rightVersions.size());
for (qsizetype i = 0; i < commonSize; i++) {
const auto leftVersion = Version(leftVersions.at(i).trimmed());
const auto rightVersion = Version(rightVersions.at(i).trimmed());
if (leftVersion > rightVersion)
return 1;
if (leftVersion < rightVersion)
return -1;
}
if (leftVersions.size() > rightVersions.size())
return 1;
if (leftVersions.size() < rightVersions.size())
return -1;
return 0;
}
} // namespace
Mod::Mod(const QFileInfo& file) : Resource(file), m_local_details()
{
m_enabled = (file.suffix() != "disabled");
@ -88,7 +117,7 @@ int Mod::compare(const Resource& other, SortType type) const
break;
}
case SortType::McVersions: {
auto compare_result = QString::compare(mcVersions(), cast_other->mcVersions(), Qt::CaseInsensitive);
auto compare_result = compareVersionLists(mcVersions(), cast_other->mcVersions());
if (compare_result != 0)
return compare_result;
break;
@ -197,14 +226,19 @@ auto Mod::side() const -> QString
return ModPlatform::SideUtils::toString(ModPlatform::Side::UniversalSide);
}
auto Mod::mcVersions() const -> QString
auto Mod::mcVersions() const -> QStringList
{
if (metadata())
return metadata()->mcVersions.join(", ");
return metadata()->mcVersions;
return {};
}
auto Mod::mcVersionsString() const -> QString
{
return mcVersions().join(", ");
}
auto Mod::releaseType() const -> QString
{
if (metadata())

View file

@ -68,7 +68,8 @@ class Mod : public Resource {
auto issueTracker() const -> QString;
auto side() const -> QString;
auto loaders() const -> QString;
auto mcVersions() const -> QString;
auto mcVersions() const -> QStringList;
auto mcVersionsString() const -> QString;
auto releaseType() const -> QString;
QStringList dependencies() const;

View file

@ -110,7 +110,7 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const
return at(row).loaders();
}
case McVersionsColumn: {
return at(row).mcVersions();
return at(row).mcVersionsString();
}
case ReleaseTypeColumn: {
return at(row).releaseType();