Skip to content

Commit 33159ee

Browse files
authored
Merge pull request #1487 from ong-yinggao98/modmanager-dupe
`gui/mod-manager`: Hide other versions of loaded mods
2 parents 3cec9d6 + 1239912 commit 33159ee

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Template for new versions:
3232
- `gui/mod-manager`: now supports arena mode
3333

3434
## Fixes
35+
- `gui/mod-manager`: hide other versions of loaded mods and unhides them when unloaded
3536
- `gui/mod-manager`: gracefully handle vanilla mods with different versions from the user's preset
3637

3738
## Misc Improvements

gui/mod-manager.lua

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ function get_modlist_fields(kind, viewscreen)
7272
end
7373
end
7474

75-
---@return boolean # true if the mod entry was moved; false if the mod or mod version was not found.
75+
---@return boolean # true if the mod entry was copied over; false if the mod or mod version was not found.
7676
---@return string|nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
77-
local function move_mod_entry(viewscreen, to, from, mod_id, mod_version)
77+
local function copy_mod_entry(viewscreen, to, from, mod_id, mod_version)
7878
local to_fields = get_modlist_fields(to, viewscreen)
7979
local from_fields = get_modlist_fields(from, viewscreen)
8080

@@ -106,23 +106,49 @@ local function move_mod_entry(viewscreen, to, from, mod_id, mod_version)
106106
end
107107
end
108108

109-
for _, v in pairs(from_fields) do
110-
v:erase(mod_index)
111-
end
112-
113109
return true, loaded_version
114110
end
115111

116-
---@return boolean # true if the mod entry was moved; false if the mod or mod version was not found.
112+
---@return boolean # true if the mod entry was copied over; false if the mod or mod version was not found.
117113
---@return string|nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
118114
local function enable_mod(viewscreen, mod_id, mod_version)
119-
return move_mod_entry(viewscreen, "object_load_order", "available", mod_id, mod_version)
115+
return copy_mod_entry(viewscreen, "object_load_order", "base_available", mod_id, mod_version)
120116
end
121117

122-
---@return boolean # true if the mod entry was moved; false if the mod or mod version was not found.
118+
---@return boolean # true if the mod entry was copied over; false if the mod or mod version was not found.
123119
---@return string|nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
124-
local function disable_mod(viewscreen, mod_id, mod_version)
125-
return move_mod_entry(viewscreen, "available", "object_load_order", mod_id, mod_version)
120+
local function make_available_mod(viewscreen, mod_id, mod_version)
121+
return copy_mod_entry(viewscreen, "available", "base_available", mod_id, mod_version)
122+
end
123+
124+
local function clear_mods(viewscreen)
125+
local active_modlist = get_modlist_fields('object_load_order', viewscreen)
126+
local avail_modlist = get_modlist_fields('available', viewscreen)
127+
for _, modlist in ipairs({active_modlist, avail_modlist}) do
128+
for _, v in pairs(modlist) do
129+
for i = #v - 1, 0, -1 do
130+
v:erase(i)
131+
end
132+
end
133+
end
134+
end
135+
136+
local function set_available_mods(viewscreen, loaded)
137+
local base_avail = get_modlist_fields('base_available', viewscreen)
138+
local unused = {}
139+
for i, id in ipairs(base_avail.id) do
140+
if not loaded[id.value] then
141+
local version = base_avail.numeric_version[i]
142+
table.insert(unused, { id= id.value, version= version })
143+
end
144+
end
145+
146+
for _, v in ipairs(unused) do
147+
local success, _ = make_available_mod(viewscreen, v.id, v.version)
148+
if not success then
149+
dfhack.printerr('failed to show '..v.id..' in available list')
150+
end
151+
end
126152
end
127153

128154
local function get_active_modlist(viewscreen)
@@ -138,21 +164,24 @@ end
138164
--- @return string[]
139165
--- @return { id: string, new: string }[]
140166
local function swap_modlist(viewscreen, modlist)
141-
local current = get_active_modlist(viewscreen)
142-
for _, v in ipairs(current) do
143-
disable_mod(viewscreen, v.id, v.version)
144-
end
167+
clear_mods(viewscreen)
145168

146169
local failures = {}
147170
local changed = {}
171+
local loaded = {}
148172
for _, v in ipairs(modlist) do
149173
local success, version = enable_mod(viewscreen, v.id, v.version)
150174
if not success then
151175
table.insert(failures, v.id)
152-
elseif version then
153-
table.insert(changed, { id= v.id, new= version })
176+
else
177+
if version then
178+
table.insert(changed, { id= v.id, new= version })
179+
end
180+
loaded[v.id] = true
154181
end
155182
end
183+
184+
set_available_mods(viewscreen, loaded)
156185
return failures, changed
157186
end
158187

0 commit comments

Comments
 (0)