diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index d9e9e901a..f0cdfaff6 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #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()) diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index 0d24409bf..27768ae2c 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -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; diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 7ce61e9b8..a03410fd3 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -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();