diff --git a/builtin/filterlist.lua b/builtin/filterlist.lua index 906c339d..fd337ae9 100644 --- a/builtin/filterlist.lua +++ b/builtin/filterlist.lua @@ -246,3 +246,36 @@ function sort_worlds_alphabetic(this) return a.name:lower() < b.name:lower() end) end + +-------------------------------------------------------------------------------- +function sort_mod_list(this) + + table.sort(this.m_processed_list, function(a, b) + -- Show game mods at bottom + if a.typ ~= b.typ then + return b.typ == "game_mod" + end + -- If in same or no modpack, sort by name + if a.modpack == b.modpack then + if a.name:lower() == b.name:lower() then + return a.name < b.name + end + return a.name:lower() < b.name:lower() + -- Else compare name to modpack name + else + -- Always show modpack pseudo-mod on top of modpack mod list + if a.name == b.modpack then + return true + elseif b.name == a.modpack then + return false + end + + local name_a = a.modpack or a.name + local name_b = b.modpack or b.name + if name_a:lower() == name_b:lower() then + return name_a < name_b + end + return name_a:lower() < name_b:lower() + end + end) +end diff --git a/builtin/modmgr.lua b/builtin/modmgr.lua index 58ffb153..2f134373 100644 --- a/builtin/modmgr.lua +++ b/builtin/modmgr.lua @@ -972,6 +972,8 @@ function modmgr.init_worldconfig() hide_game=modmgr.hide_gamemods, hide_modpackcontents= modmgr.hide_modpackcontents }) + filterlist.add_sort_mechanism(modmgr.modlist, "alphabetic", sort_mod_list) + filterlist.set_sortmode(modmgr.modlist, "alphabetic") return true end @@ -1068,6 +1070,8 @@ function modmgr.refresh_globals() nil, --filter {} ) + filterlist.add_sort_mechanism(modmgr.global_mods, "alphabetic", sort_mod_list) + filterlist.set_sortmode(modmgr.global_mods, "alphabetic") end --------------------------------------------------------------------------------