]> git.lizzy.rs Git - minetest.git/blobdiff - builtin/mainmenu/dlg_settings_advanced.lua
All settings: Fix missing flags checkbox caused by 'possible flags' order (#8997)
[minetest.git] / builtin / mainmenu / dlg_settings_advanced.lua
index 4a6fcfba7cef84d303efb0435c85dc41d1207e51..24b71d957870bcf66ad54e704cb8b19641e576d3 100644 (file)
@@ -148,9 +148,9 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
                local values = {}
                local ti = 1
                local index = 1
-               for line in default:gmatch("[+-]?[%d.-e]+") do -- All numeric characters
-                       index = default:find("[+-]?[%d.-e]+", index) + line:len()
-                       table.insert(values, line)
+               for match in default:gmatch("[+-]?[%d.-e]+") do -- All numeric characters
+                       index = default:find("[+-]?[%d.-e]+", index) + match:len()
+                       table.insert(values, match)
                        ti = ti + 1
                        if ti > 9 then
                                break
@@ -322,17 +322,20 @@ end
 -- read_all: whether to ignore certain setting types for GUI or not
 -- parse_mods: whether to parse settingtypes.txt in mods and games
 local function parse_config_file(read_all, parse_mods)
-       local builtin_path = core.get_builtin_path() .. FILENAME
-       local file = io.open(builtin_path, "r")
        local settings = {}
-       if not file then
-               core.log("error", "Can't load " .. FILENAME)
-               return settings
-       end
 
-       parse_single_file(file, builtin_path, read_all, settings, 0, true)
+       do
+               local builtin_path = core.get_builtin_path() .. FILENAME
+               local file = io.open(builtin_path, "r")
+               if not file then
+                       core.log("error", "Can't load " .. FILENAME)
+                       return settings
+               end
 
-       file:close()
+               parse_single_file(file, builtin_path, read_all, settings, 0, true)
+
+               file:close()
+       end
 
        if parse_mods then
                -- Parse games
@@ -344,7 +347,7 @@ local function parse_config_file(read_all, parse_mods)
                        local file = io.open(path, "r")
                        if file then
                                if not games_category_initialized then
-                                       local translation = fgettext_ne("Games"), -- not used, but needed for xgettext
+                                       fgettext_ne("Games") -- not used, but needed for xgettext
                                        table.insert(settings, {
                                                name = "Games",
                                                level = 0,
@@ -377,7 +380,7 @@ local function parse_config_file(read_all, parse_mods)
                        local file = io.open(path, "r")
                        if file then
                                if not mods_category_initialized then
-                                       local translation = fgettext_ne("Mods"), -- not used, but needed for xgettext
+                                       fgettext_ne("Mods") -- not used, but needed for xgettext
                                        table.insert(settings, {
                                                name = "Mods",
                                                level = 0,
@@ -522,8 +525,10 @@ local function get_current_np_group_as_string(setting)
                        value.seed .. ", " ..
                        value.octaves .. ", " ..
                        value.persistence .. ", " ..
-                       value.lacunarity .. ", " ..
-                       value.flags
+                       value.lacunarity
+               if value.flags ~= "" then
+                       t = t .. ", " .. value.flags
+               end
        end
        return t
 end
@@ -597,25 +602,26 @@ local function create_change_setting_formspec(dialogdata)
                end
                -- First row
                height = height + 0.3
-               add_field(0.3, "te_offset", "Offset", t[1])
-               add_field(3.6, "te_scale",  "Scale",  t[2])
-               add_field(6.9, "te_seed",   "Seed",   t[6])
+               add_field(0.3, "te_offset", fgettext("Offset"), t[1])
+               add_field(3.6, "te_scale",  fgettext("Scale"),  t[2])
+               add_field(6.9, "te_seed",   fgettext("Seed"),   t[6])
                height = height + 1.1
 
                -- Second row
-               add_field(0.3, "te_spreadx", "X spread", t[3])
+               add_field(0.3, "te_spreadx", fgettext("X spread"), t[3])
                if dimension == 3 then
-                       add_field(3.6, "te_spready", "Y spread", t[4])
+                       add_field(3.6, "te_spready", fgettext("Y spread"), t[4])
                else
-                       fields[#fields + 1] = "label[4," .. height - 0.2 .. ";2D Noise]"
+                       fields[#fields + 1] = "label[4," .. height - 0.2 .. ";" ..
+                                       fgettext("2D Noise") .. "]"
                end
-               add_field(6.9, "te_spreadz", "Z spread", t[5])
+               add_field(6.9, "te_spreadz", fgettext("Z spread"), t[5])
                height = height + 1.1
 
                -- Third row
-               add_field(0.3, "te_octaves", "Octaves",     t[7])
-               add_field(3.6, "te_persist", "Persistance", t[8])
-               add_field(6.9, "te_lacun",   "Lacunarity",  t[9])
+               add_field(0.3, "te_octaves", fgettext("Octaves"),     t[7])
+               add_field(3.6, "te_persist", fgettext("Persistance"), t[8])
+               add_field(6.9, "te_lacun",   fgettext("Lacunarity"),  t[9])
                height = height + 1.1
 
 
@@ -632,11 +638,14 @@ local function create_change_setting_formspec(dialogdata)
                end
                -- Flags
                formspec = table.concat(fields)
-                               .. "checkbox[0.5," .. height - 0.6 .. ";cb_defaults;defaults;" -- defaults
+                               .. "checkbox[0.5," .. height - 0.6 .. ";cb_defaults;"
+                               .. fgettext("defaults") .. ";" -- defaults
                                .. tostring(flags["defaults"] == true) .. "]" -- to get false if nil
-                               .. "checkbox[5," .. height - 0.6 .. ";cb_eased;eased;" -- eased
+                               .. "checkbox[5," .. height - 0.6 .. ";cb_eased;"
+                               .. fgettext("eased") .. ";" -- eased
                                .. tostring(flags["eased"] == true) .. "]"
-                               .. "checkbox[5," .. height - 0.15 .. ";cb_absvalue;absvalue;" -- absvalue
+                               .. "checkbox[5," .. height - 0.15 .. ";cb_absvalue;"
+                               .. fgettext("absvalue") .. ";" -- absvalue
                                .. tostring(flags["absvalue"] == true) .. "]"
                height = height + 1
 
@@ -649,43 +658,54 @@ local function create_change_setting_formspec(dialogdata)
 
                height = height + 0.3
                formspec = formspec
-                               .. "field[0.3," .. height .. ";3.3,1;te_x;X;" -- X
+                               .. "field[0.3," .. height .. ";3.3,1;te_x;"
+                               .. fgettext("X") .. ";" -- X
                                .. core.formspec_escape(v3f[1] or "") .. "]"
-                               .. "field[3.6," .. height .. ";3.3,1;te_y;Y;" -- Y
+                               .. "field[3.6," .. height .. ";3.3,1;te_y;"
+                               .. fgettext("Y") .. ";" -- Y
                                .. core.formspec_escape(v3f[2] or "") .. "]"
-                               .. "field[6.9," .. height .. ";3.3,1;te_z;Z;" -- Z
+                               .. "field[6.9," .. height .. ";3.3,1;te_z;"
+                               .. fgettext("Z") .. ";" -- Z
                                .. core.formspec_escape(v3f[3] or "") .. "]"
                height = height + 1.1
 
        elseif setting.type == "flags" then
-               local enabled_flags = flags_to_table(get_current_value(setting))
+               local current_flags = flags_to_table(get_current_value(setting))
                local flags = {}
-               for _, name in ipairs(enabled_flags) do
+               for _, name in ipairs(current_flags) do
                        -- Index by name, to avoid iterating over all enabled_flags for every possible flag.
-                       flags[name] = true
+                       if name:sub(1, 2) == "no" then
+                               flags[name:sub(3)] = false
+                       else
+                               flags[name] = true
+                       end
                end
-               local flags_count = #setting.possible
-               local max_height = flags_count / 4
+               local flags_count = #setting.possible / 2
+               local max_height = math.ceil(flags_count / 2) / 2
 
                -- More space for flags
                description_height = description_height - 1
                height = height - 1
 
                local fields = {} -- To build formspec
-               for i, name in ipairs(setting.possible) do
-                       local x = 0.5
-                       local y = height + i / 2 - 0.75
-                       if i - 1 >= flags_count / 2 then -- 2nd column
-                               x = 5
-                               y = y - max_height
+               local j = 1
+               for _, name in ipairs(setting.possible) do
+                       if name:sub(1, 2) ~= "no" then
+                               local x = 0.5
+                               local y = height + j / 2 - 0.75
+                               if j - 1 >= flags_count / 2 then -- 2nd column
+                                       x = 5
+                                       y = y - max_height
+                               end
+                               j = j + 1;
+                               local checkbox_name = "cb_" .. name
+                               local is_enabled = flags[name] == true -- to get false if nil
+                               checkboxes[checkbox_name] = is_enabled
+
+                               fields[#fields + 1] = ("checkbox[%f,%f;%s;%s;%s]"):format(
+                                       x, y, checkbox_name, name, tostring(is_enabled)
+                               )
                        end
-                       local checkbox_name = "cb_" .. name
-                       local is_enabled = flags[name] == true -- to get false if nil
-                       checkboxes[checkbox_name] = is_enabled
-
-                       fields[#fields + 1] = ("checkbox[%f,%f;%s;%s;%s]"):format(
-                               x, y, checkbox_name, name, tostring(is_enabled)
-                       )
                end
                formspec = table.concat(fields)
                height = height + max_height + 0.25
@@ -744,7 +764,7 @@ local function create_change_setting_formspec(dialogdata)
                        " (" .. setting.name .. ")"
        end
 
-       local comment_text = ""
+       local comment_text
        if setting.comment == "" then
                comment_text = fgettext_ne("(No description of setting given)")
        else
@@ -821,8 +841,12 @@ local function handle_change_setting_buttons(this, fields)
                elseif setting.type == "flags" then
                        local values = {}
                        for _, name in ipairs(setting.possible) do
-                               if checkboxes["cb_" .. name] then
-                                       table.insert(values, name)
+                               if name:sub(1, 2) ~= "no" then
+                                       if checkboxes["cb_" .. name] then
+                                               table.insert(values, name)
+                                       else
+                                               table.insert(values, "no" .. name)
+                                       end
                                end
                        end
 
@@ -909,7 +933,7 @@ local function handle_change_setting_buttons(this, fields)
        return false
 end
 
-local function create_settings_formspec(tabview, name, tabdata)
+local function create_settings_formspec(tabview, _, tabdata)
        local formspec = "size[12,5.4;true]" ..
                        "tablecolumns[color;tree;text,width=28;text]" ..
                        "tableoptions[background=#00000000;border=false]" ..
@@ -941,7 +965,7 @@ local function create_settings_formspec(tabview, name, tabdata)
                        formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. ","
                                        .. value .. ","
 
-               elseif entry.type == "key" then
+               elseif entry.type == "key" then --luacheck: ignore
                        -- ignore key settings, since we have a special dialog for them
 
                elseif entry.type == "noise_params_2d" or entry.type == "noise_params_3d" then
@@ -1020,8 +1044,8 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
        if fields["btn_edit"] or list_enter then
                local setting = settings[selected_setting]
                if setting and setting.type ~= "category" then
-                       local edit_dialog = dialog_create("change_setting", create_change_setting_formspec,
-                                       handle_change_setting_buttons)
+                       local edit_dialog = dialog_create("change_setting",
+                                       create_change_setting_formspec, handle_change_setting_buttons)
                        edit_dialog:set_parent(this)
                        this:hide()
                        edit_dialog:show()
@@ -1063,7 +1087,9 @@ function create_adv_settings_dlg()
                                return dlg
 end
 
--- Uncomment to generate minetest.conf.example and settings_translation_file.cpp
--- For RUN_IN_PLACE the generated files may appear in the bin folder
+-- Uncomment to generate 'minetest.conf.example' and 'settings_translation_file.cpp'.
+-- For RUN_IN_PLACE the generated files may appear in the 'bin' folder.
+-- See comment and alternative line at the end of 'generate_from_settingtypes.lua'.
 
---assert(loadfile(core.get_builtin_path().."mainmenu"..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false))
+--assert(loadfile(core.get_builtin_path().."mainmenu"..DIR_DELIM..
+--             "generate_from_settingtypes.lua"))(parse_config_file(true, false))