diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua index 33c5d9bba..2a7be8d34 100644 --- a/builtin/mainmenu/dlg_config_world.lua +++ b/builtin/mainmenu/dlg_config_world.lua @@ -24,159 +24,118 @@ local function modname_valid(name) end local function get_formspec(data) - local mod = data.list:get_list()[data.selected_mod] + local mod = data.list:get_list()[data.selected_mod] or {name = ""} local retval = "size[11.5,7.5,true]" .. "label[0.5,0;" .. fgettext("World:") .. "]" .. "label[1.75,0;" .. data.worldspec.name .. "]" - if mod == nil then - mod = {name=""} - end - local hard_deps, soft_deps = pkgmgr.get_dependencies(mod.path) retval = retval .. "label[0,0.7;" .. fgettext("Mod:") .. "]" .. "label[0.75,0.7;" .. mod.name .. "]" .. "label[0,1.25;" .. fgettext("Dependencies:") .. "]" .. - "textlist[0,1.75;5,2.125;world_config_depends;" .. - hard_deps .. ";0]" .. + "textlist[0,1.75;5,2.125;world_config_depends;" .. hard_deps .. ";0]" .. "label[0,3.875;" .. fgettext("Optional dependencies:") .. "]" .. "textlist[0,4.375;5,1.8;world_config_optdepends;" .. soft_deps .. ";0]" .. - "button[3.25,7;2.5,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" .. - "button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]" + "button[3.25,7;2.5,0.5;btn_config_world_save;" .. + fgettext("Save") .. "]" .. + "button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. + fgettext("Cancel") .. "]" - if mod and mod.name ~= "" and not mod.is_game_content then + if mod.name ~= "" and not mod.is_game_content then if mod.is_modpack then - local rawlist = data.list:get_raw_list() - local all_enabled = true - for j = 1, #rawlist, 1 do - if rawlist[j].modpack == mod.name and not rawlist[j].enabled then - all_enabled = false - break - end - end - - if all_enabled then - retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. + if pkgmgr.is_modpack_entirely_enabled(data, mod.name) then + retval = retval .. + "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. fgettext("Disable MP") .. "]" else - retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. + retval = retval .. + "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. fgettext("Enable MP") .. "]" end else - if mod.enabled then - retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. - fgettext("enabled") .. ";true]" - else - retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. - fgettext("enabled") .. ";false]" - end + retval = retval .. + "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. + ";" .. tostring(mod.enabled) .. "]" end end if enabled_all then retval = retval .. - "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" + "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. + fgettext("Disable all") .. "]" else retval = retval .. - "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" + "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. + fgettext("Enable all") .. "]" end - retval = retval .. + return retval .. "tablecolumns[color;tree;text]" .. - "table[5.5,0.75;5.75,6;world_config_modlist;" - retval = retval .. pkgmgr.render_packagelist(data.list) - retval = retval .. ";" .. data.selected_mod .."]" - - return retval + "table[5.5,0.75;5.75,6;world_config_modlist;" .. + pkgmgr.render_packagelist(data.list) .. ";" .. data.selected_mod .."]" end -local function enable_mod(this, toset) - local mod = this.data.list:get_list()[this.data.selected_mod] - - if mod.is_game_content then - -- game mods can't be enabled or disabled - elseif not mod.is_modpack then - if toset == nil then - mod.enabled = not mod.enabled - else - mod.enabled = toset - end - else - local list = this.data.list:get_raw_list() - for i=1,#list,1 do - if list[i].modpack == mod.name then - if toset == nil then - toset = not list[i].enabled - end - list[i].enabled = toset - end - end - end -end - - local function handle_buttons(this, fields) - if fields["world_config_modlist"] ~= nil then - local event = core.explode_table_event(fields["world_config_modlist"]) + if fields.world_config_modlist then + local event = core.explode_table_event(fields.world_config_modlist) this.data.selected_mod = event.row core.settings:set("world_config_selected_mod", event.row) if event.type == "DCL" then - enable_mod(this) + pkgmgr.enable_mod(this) end return true end - if fields["key_enter"] ~= nil then - enable_mod(this) + if fields.key_enter then + pkgmgr.enable_mod(this) return true end - if fields["cb_mod_enable"] ~= nil then - local toset = core.is_yes(fields["cb_mod_enable"]) - enable_mod(this,toset) + if fields.cb_mod_enable ~= nil then + pkgmgr.enable_mod(this, core.is_yes(fields.cb_mod_enable)) return true end - if fields["btn_mp_enable"] ~= nil or - fields["btn_mp_disable"] then - local toset = (fields["btn_mp_enable"] ~= nil) - enable_mod(this,toset) + if fields.btn_mp_enable ~= nil or + fields.btn_mp_disable then + pkgmgr.enable_mod(this, fields.btn_mp_enable ~= nil) return true end - if fields["btn_config_world_save"] then - local filename = this.data.worldspec.path .. - DIR_DELIM .. "world.mt" + if fields.btn_config_world_save then + local filename = this.data.worldspec.path .. DIR_DELIM .. "world.mt" local worldfile = Settings(filename) local mods = worldfile:to_table() local rawlist = this.data.list:get_raw_list() - local i,mod - for i,mod in ipairs(rawlist) do + for i = 1, #rawlist do + local mod = rawlist[i] if not mod.is_modpack and not mod.is_game_content then if modname_valid(mod.name) then - worldfile:set("load_mod_"..mod.name, tostring(mod.enabled)) - else - if mod.enabled then - gamedata.errormessage = fgettext_ne("Failed to enable mod \"$1\" as it contains disallowed characters. Only chararacters [a-z0-9_] are allowed.", mod.name) - end + worldfile:set("load_mod_" .. mod.name, + tostring(mod.enabled)) + elseif mod.enabled then + gamedata.errormessage = fgettext_ne("Failed to enable mo" .. + "d \"$1\" as it contains disallowed characters. " .. + "Only chararacters [a-z0-9_] are allowed.", + mod.name) end - mods["load_mod_"..mod.name] = nil + mods["load_mod_" .. mod.name] = nil end end -- Remove mods that are not present anymore - for key,value in pairs(mods) do - if key:sub(1,9) == "load_mod_" then + for key in pairs(mods) do + if key:sub(1, 9) == "load_mod_" then worldfile:remove(key) end end @@ -189,7 +148,7 @@ local function handle_buttons(this, fields) return true end - if fields["btn_config_world_cancel"] then + if fields.btn_config_world_cancel then this:delete() return true end @@ -224,62 +183,60 @@ local function handle_buttons(this, fields) end function create_configure_world_dlg(worldidx) - local dlg = dialog_create("sp_config_world", - get_formspec, - handle_buttons, - nil) + local dlg = dialog_create("sp_config_world", get_formspec, handle_buttons) - dlg.data.selected_mod = tonumber(core.settings:get("world_config_selected_mod")) - if dlg.data.selected_mod == nil then - dlg.data.selected_mod = 0 - end + dlg.data.selected_mod = tonumber( + core.settings:get("world_config_selected_mod")) or 0 dlg.data.worldspec = core.get_worlds()[worldidx] - if dlg.data.worldspec == nil then dlg:delete() return nil end + if not dlg.data.worldspec then + dlg:delete() + return + end dlg.data.worldconfig = pkgmgr.get_worldconfig(dlg.data.worldspec.path) - if dlg.data.worldconfig == nil or dlg.data.worldconfig.id == nil or + if not dlg.data.worldconfig or not dlg.data.worldconfig.id or dlg.data.worldconfig.id == "" then - dlg:delete() - return nil + return end dlg.data.list = filterlist.create( - pkgmgr.preparemodlist, --refresh - pkgmgr.comparemod, --compare - function(element,uid) --uid match - if element.name == uid then - return true - end - end, - function(element, criteria) - if criteria.hide_game and - element.is_game_content then - return false - end + pkgmgr.preparemodlist, + pkgmgr.comparemod, + function(element, uid) + if element.name == uid then + return true + end + end, + function(element, criteria) + if criteria.hide_game and + element.is_game_content then + return false + end - if criteria.hide_modpackcontents and - element.modpack ~= nil then - return false - end - return true - end, --filter - { worldpath= dlg.data.worldspec.path, - gameid = dlg.data.worldspec.gameid } - ) + if criteria.hide_modpackcontents and + element.modpack ~= nil then + return false + end + return true + end, + { + worldpath = dlg.data.worldspec.path, + gameid = dlg.data.worldspec.gameid + } + ) if dlg.data.selected_mod > dlg.data.list:size() then dlg.data.selected_mod = 0 end - dlg.data.list:set_filtercriteria( - { - hide_game=dlg.data.hide_gamemods, - hide_modpackcontents= dlg.data.hide_modpackcontents - }) + dlg.data.list:set_filtercriteria({ + hide_game = dlg.data.hide_gamemods, + hide_modpackcontents = dlg.data.hide_modpackcontents + }) dlg.data.list:add_sort_mechanism("alphabetic", sort_mod_list) dlg.data.list:set_sortmode("alphabetic") diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua index 2730612e9..49ab78c24 100644 --- a/builtin/mainmenu/pkgmgr.lua +++ b/builtin/mainmenu/pkgmgr.lua @@ -309,6 +309,48 @@ function pkgmgr.get_dependencies(path) return table.concat(info.depends or {}, ","), table.concat(info.optional_depends or {}, ",") end +----------- tests whether all of the mods in the modpack are enabled ----------- +function pkgmgr.is_modpack_entirely_enabled(data, name) + local rawlist = data.list:get_raw_list() + for j = 1, #rawlist do + if rawlist[j].modpack == name and not rawlist[j].enabled then + return false + end + end + return true +end + +---------- toggles or en/disables a mod or modpack ----------------------------- +function pkgmgr.enable_mod(this, toset) + local mod = this.data.list:get_list()[this.data.selected_mod] + + -- game mods can't be enabled or disabled + if mod.is_game_content then + return + end + + -- toggle or en/disable the mod + if not mod.is_modpack then + if toset == nil then + mod.enabled = not mod.enabled + else + mod.enabled = toset + end + return + end + + -- toggle or en/disable every mod in the modpack, interleaved unsupported + local list = this.data.list:get_raw_list() + for i = 1, #list do + if list[i].modpack == mod.name then + if toset == nil then + toset = not list[i].enabled + end + list[i].enabled = toset + end + end +end + -------------------------------------------------------------------------------- function pkgmgr.get_worldconfig(worldpath) local filename = worldpath ..