X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=builtin%2Fmainmenu%2Ftab_settings.lua;h=700b7390fa226ded3bba94c90c340be38f958095;hb=a27362de6a66692b191f8db0eea13f8d9302cef6;hp=99138a091b86ae45cdded639e965f098cdaeebe1;hpb=487ab593d031bf310bd76b3edfe2ad42c1e248b5;p=minetest.git diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 99138a091..700b7390f 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -1,5 +1,5 @@ --Minetest ---Copyright (C) 2015 PilzAdam +--Copyright (C) 2013 sapier -- --This program is free software; you can redistribute it and/or modify --it under the terms of the GNU Lesser General Public License as published by @@ -15,739 +15,378 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -local FILENAME = "settingtypes.txt" - -local CHAR_CLASSES = { - SPACE = "[%s]", - VARIABLE = "[%w_%-%.]", - INTEGER = "[+-]?[%d]", - FLOAT = "[+-]?[%d%.]", - FLAGS = "[%w_%-%.,]", +-------------------------------------------------------------------------------- + +local labels = { + leaves = { + fgettext("Opaque Leaves"), + fgettext("Simple Leaves"), + fgettext("Fancy Leaves") + }, + node_highlighting = { + fgettext("Node Outlining"), + fgettext("Node Highlighting"), + fgettext("None") + }, + filters = { + fgettext("No Filter"), + fgettext("Bilinear Filter"), + fgettext("Trilinear Filter") + }, + mipmap = { + fgettext("No Mipmap"), + fgettext("Mipmap"), + fgettext("Mipmap + Aniso. Filter") + }, + antialiasing = { + fgettext("None"), + fgettext("2x"), + fgettext("4x"), + fgettext("8x") + }, + shadow_levels = { + fgettext("Disabled"), + fgettext("Very Low"), + fgettext("Low"), + fgettext("Medium"), + fgettext("High"), + fgettext("Ultra High") + } } --- returns error message, or nil -local function parse_setting_line(settings, line, read_all, base_level, allow_secure) - -- comment - local comment = line:match("^#" .. CHAR_CLASSES.SPACE .. "*(.*)$") - if comment then - if settings.current_comment == "" then - settings.current_comment = comment - else - settings.current_comment = settings.current_comment .. "\n" .. comment - end - return - end - - -- clear current_comment so only comments directly above a setting are bound to it - -- but keep a local reference to it for variables in the current line - local current_comment = settings.current_comment - settings.current_comment = "" - - -- empty lines - if line:match("^" .. CHAR_CLASSES.SPACE .. "*$") then - return - end - - -- category - local stars, category = line:match("^%[([%*]*)([^%]]+)%]$") - if category then - table.insert(settings, { - name = category, - level = stars:len() + base_level, - type = "category", - }) - return - end - - -- settings - local first_part, name, readable_name, setting_type = line:match("^" - -- this first capture group matches the whole first part, - -- so we can later strip it from the rest of the line - .. "(" - .. "([" .. CHAR_CLASSES.VARIABLE .. "+)" -- variable name - .. CHAR_CLASSES.SPACE .. "*" - .. "%(([^%)]*)%)" -- readable name - .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.VARIABLE .. "+)" -- type - .. CHAR_CLASSES.SPACE .. "*" - .. ")") - - if not first_part then - return "Invalid line" - end - - if name:match("secure%.[.]*") and not allow_secure then - return "Tried to add \"secure.\" setting" - end - - if readable_name == "" then - readable_name = nil - end - local remaining_line = line:sub(first_part:len() + 1) - - if setting_type == "int" then - local default, min, max = remaining_line:match("^" - -- first int is required, the last 2 are optional - .. "(" .. CHAR_CLASSES.INTEGER .. "+)" .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.INTEGER .. "*)" .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.INTEGER .. "*)" - .. "$") - - if not default or not tonumber(default) then - return "Invalid integer setting" - end - - min = tonumber(min) - max = tonumber(max) - table.insert(settings, { - name = name, - readable_name = readable_name, - type = "int", - default = default, - min = min, - max = max, - comment = current_comment, - }) - return - end - - if setting_type == "string" or setting_type == "noise_params" - or setting_type == "key" or setting_type == "v3f" then - local default = remaining_line:match("^(.*)$") - - if not default then - return "Invalid string setting" - end - if setting_type == "key" and not read_all then - -- ignore key type if read_all is false - return - end - - table.insert(settings, { - name = name, - readable_name = readable_name, - type = setting_type, - default = default, - comment = current_comment, - }) - return - end - - if setting_type == "bool" then - if remaining_line ~= "false" and remaining_line ~= "true" then - return "Invalid boolean setting" - end - - table.insert(settings, { - name = name, - readable_name = readable_name, - type = "bool", - default = remaining_line, - comment = current_comment, - }) - return - end - - if setting_type == "float" then - local default, min, max = remaining_line:match("^" - -- first float is required, the last 2 are optional - .. "(" .. CHAR_CLASSES.FLOAT .. "+)" .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.FLOAT .. "*)" .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.FLOAT .. "*)" - .."$") +local dd_options = { + leaves = { + table.concat(labels.leaves, ","), + {"opaque", "simple", "fancy"} + }, + node_highlighting = { + table.concat(labels.node_highlighting, ","), + {"box", "halo", "none"} + }, + filters = { + table.concat(labels.filters, ","), + {"", "bilinear_filter", "trilinear_filter"} + }, + mipmap = { + table.concat(labels.mipmap, ","), + {"", "mip_map", "anisotropic_filter"} + }, + antialiasing = { + table.concat(labels.antialiasing, ","), + {"0", "2", "4", "8"} + }, + shadow_levels = { + table.concat(labels.shadow_levels, ","), + { "0", "1", "2", "3", "4", "5" } + } +} - if not default or not tonumber(default) then - return "Invalid float setting" +local getSettingIndex = { + Leaves = function() + local style = core.settings:get("leaves_style") + for idx, name in pairs(dd_options.leaves[2]) do + if style == name then return idx end end - - min = tonumber(min) - max = tonumber(max) - table.insert(settings, { - name = name, - readable_name = readable_name, - type = "float", - default = default, - min = min, - max = max, - comment = current_comment, - }) - return - end - - if setting_type == "enum" then - local default, values = remaining_line:match("^" - -- first value (default) may be empty (i.e. is optional) - .. "(" .. CHAR_CLASSES.VARIABLE .. "*)" .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.FLAGS .. "+)" - .. "$") - - if not default or values == "" then - return "Invalid enum setting" + return 1 + end, + NodeHighlighting = function() + local style = core.settings:get("node_highlighting") + for idx, name in pairs(dd_options.node_highlighting[2]) do + if style == name then return idx end end - - table.insert(settings, { - name = name, - readable_name = readable_name, - type = "enum", - default = default, - values = values:split(",", true), - comment = current_comment, - }) - return - end - - if setting_type == "path" then - local default = remaining_line:match("^(.*)$") - - if not default then - return "Invalid path setting" + return 1 + end, + Filter = function() + if core.settings:get(dd_options.filters[2][3]) == "true" then + return 3 + elseif core.settings:get(dd_options.filters[2][3]) == "false" and + core.settings:get(dd_options.filters[2][2]) == "true" then + return 2 end - - table.insert(settings, { - name = name, - readable_name = readable_name, - type = "path", - default = default, - comment = current_comment, - }) - return - end - - if setting_type == "flags" then - local default, possible = remaining_line:match("^" - -- first value (default) may be empty (i.e. is optional) - -- this is implemented by making the last value optional, and - -- swapping them around if it turns out empty. - .. "(" .. CHAR_CLASSES.FLAGS .. "+)" .. CHAR_CLASSES.SPACE .. "*" - .. "(" .. CHAR_CLASSES.FLAGS .. "*)" - .. "$") - - if not default or not possible then - return "Invalid flags setting" + return 1 + end, + Mipmap = function() + if core.settings:get(dd_options.mipmap[2][3]) == "true" then + return 3 + elseif core.settings:get(dd_options.mipmap[2][3]) == "false" and + core.settings:get(dd_options.mipmap[2][2]) == "true" then + return 2 end - - if possible == "" then - possible = default - default = "" - end - - table.insert(settings, { - name = name, - readable_name = readable_name, - type = "flags", - default = default, - possible = possible, - comment = current_comment, - }) - return - end - - return "Invalid setting type \"" .. setting_type .. "\"" -end - -local function parse_single_file(file, filepath, read_all, result, base_level, allow_secure) - -- store this helper variable in the table so it's easier to pass to parse_setting_line() - result.current_comment = "" - - local line = file:read("*line") - while line do - local error_msg = parse_setting_line(result, line, read_all, base_level, allow_secure) - if error_msg then - core.log("error", error_msg .. " in " .. filepath .. " \"" .. line .. "\"") - end - line = file:read("*line") - end - - result.current_comment = nil -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() .. DIR_DELIM .. 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) - - file:close() - - if parse_mods then - -- Parse games - local games_category_initialized = false - local index = 1 - local game = gamemgr.get_game(index) - while game do - local path = game.path .. DIR_DELIM .. FILENAME - 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 - table.insert(settings, { - name = "Games", - level = 0, - type = "category", - }) - games_category_initialized = true - end - - table.insert(settings, { - name = game.name, - level = 1, - type = "category", - }) - - parse_single_file(file, path, read_all, settings, 2, false) - - file:close() + return 1 + end, + Antialiasing = function() + local antialiasing_setting = core.settings:get("fsaa") + for i = 1, #dd_options.antialiasing[2] do + if antialiasing_setting == dd_options.antialiasing[2][i] then + return i end - - index = index + 1 - game = gamemgr.get_game(index) end - - -- Parse mods - local mods_category_initialized = false - local mods = {} - get_mods(core.get_modpath(), mods) - for _, mod in ipairs(mods) do - local path = mod.path .. DIR_DELIM .. FILENAME - 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 - table.insert(settings, { - name = "Mods", - level = 0, - type = "category", - }) - mods_category_initialized = true - end - - table.insert(settings, { - name = mod.name, - level = 1, - type = "category", - }) - - parse_single_file(file, path, read_all, settings, 2, false) - - file:close() + return 1 + end, + ShadowMapping = function() + local shadow_setting = core.settings:get("shadow_levels") + for i = 1, #dd_options.shadow_levels[2] do + if shadow_setting == dd_options.shadow_levels[2][i] then + return i end end + return 1 end +} - return settings -end - -local settings = parse_config_file(false, true) -local selected_setting = 1 - -local function get_current_value(setting) - local value = core.setting_get(setting.name) - if value == nil then - value = setting.default +local function antialiasing_fname_to_name(fname) + for i = 1, #labels.antialiasing do + if fname == labels.antialiasing[i] then + return dd_options.antialiasing[2][i] + end end - return value + return 0 end -local function create_change_setting_formspec(dialogdata) - local setting = settings[selected_setting] - local formspec = "size[10,5.2,true]" .. - "button[5,4.5;2,1;btn_done;" .. fgettext("Save") .. "]" .. - "button[3,4.5;2,1;btn_cancel;" .. fgettext("Cancel") .. "]" .. - "tablecolumns[color;text]" .. - "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. - "table[0,0;10,3;info;" - - if setting.readable_name then - formspec = formspec .. "#FFFF00," .. fgettext(setting.readable_name) - .. " (" .. core.formspec_escape(setting.name) .. ")," +local function formspec(tabview, name, tabdata) + local tab_string = + "box[0,0;3.75,4.5;#999999]" .. + "checkbox[0.25,0;cb_smooth_lighting;" .. fgettext("Smooth Lighting") .. ";" + .. dump(core.settings:get_bool("smooth_lighting")) .. "]" .. + "checkbox[0.25,0.5;cb_particles;" .. fgettext("Particles") .. ";" + .. dump(core.settings:get_bool("enable_particles")) .. "]" .. + "checkbox[0.25,1;cb_3d_clouds;" .. fgettext("3D Clouds") .. ";" + .. dump(core.settings:get_bool("enable_3d_clouds")) .. "]" .. + "checkbox[0.25,1.5;cb_opaque_water;" .. fgettext("Opaque Water") .. ";" + .. dump(core.settings:get_bool("opaque_water")) .. "]" .. + "checkbox[0.25,2.0;cb_connected_glass;" .. fgettext("Connected Glass") .. ";" + .. dump(core.settings:get_bool("connected_glass")) .. "]" .. + "dropdown[0.25,2.8;3.5;dd_node_highlighting;" .. dd_options.node_highlighting[1] .. ";" + .. getSettingIndex.NodeHighlighting() .. "]" .. + "dropdown[0.25,3.6;3.5;dd_leaves_style;" .. dd_options.leaves[1] .. ";" + .. getSettingIndex.Leaves() .. "]" .. + "box[4,0;3.75,4.5;#999999]" .. + "label[4.25,0.1;" .. fgettext("Texturing:") .. "]" .. + "dropdown[4.25,0.55;3.5;dd_filters;" .. dd_options.filters[1] .. ";" + .. getSettingIndex.Filter() .. "]" .. + "dropdown[4.25,1.35;3.5;dd_mipmap;" .. dd_options.mipmap[1] .. ";" + .. getSettingIndex.Mipmap() .. "]" .. + "label[4.25,2.15;" .. fgettext("Antialiasing:") .. "]" .. + "dropdown[4.25,2.6;3.5;dd_antialiasing;" .. dd_options.antialiasing[1] .. ";" + .. getSettingIndex.Antialiasing() .. "]" .. + "label[4.25,3.45;" .. fgettext("Screen:") .. "]" .. + "checkbox[4.25,3.6;cb_autosave_screensize;" .. fgettext("Autosave Screen Size") .. ";" + .. dump(core.settings:get_bool("autosave_screensize")) .. "]" .. + "box[8,0;3.75,4.5;#999999]" + + local video_driver = core.settings:get("video_driver") + local shaders_enabled = core.settings:get_bool("enable_shaders") + if video_driver == "opengl" then + tab_string = tab_string .. + "checkbox[8.25,0;cb_shaders;" .. fgettext("Shaders") .. ";" + .. tostring(shaders_enabled) .. "]" + elseif video_driver == "ogles2" then + tab_string = tab_string .. + "checkbox[8.25,0;cb_shaders;" .. fgettext("Shaders (experimental)") .. ";" + .. tostring(shaders_enabled) .. "]" else - formspec = formspec .. "#FFFF00," .. core.formspec_escape(setting.name) .. "," - end - - formspec = formspec .. ",," - - local comment_text = "" - - if setting.comment == "" then - comment_text = fgettext_ne("(No description of setting given)") - else - comment_text = fgettext_ne(setting.comment) - end - for _, comment_line in ipairs(comment_text:split("\n", true)) do - formspec = formspec .. "," .. core.formspec_escape(comment_line) .. "," - end - - if setting.type == "flags" then - formspec = formspec .. ",," - .. "," .. fgettext("Please enter a comma seperated list of flags.") .. "," - .. "," .. fgettext("Possible values are: ") - .. core.formspec_escape(setting.possible:gsub(",", ", ")) .. "," - elseif setting.type == "noise_params" then - formspec = formspec .. ",," - .. "," .. fgettext("Format: , , (, , ), , , ") .. "," - .. "," .. fgettext("Optionally the lacunarity can be appended with a leading comma.") .. "," - elseif setting.type == "v3f" then - formspec = formspec .. ",," - .. "," .. fgettext_ne("Format is 3 numbers separated by commas and inside brackets.") .. "," - end - - formspec = formspec:sub(1, -2) -- remove trailing comma - - formspec = formspec .. ";1]" - - if setting.type == "bool" then - local selected_index - if core.is_yes(get_current_value(setting)) then - selected_index = 2 - else - selected_index = 1 - end - formspec = formspec .. "dropdown[0.5,3.5;3,1;dd_setting_value;" - .. fgettext("Disabled") .. "," .. fgettext("Enabled") .. ";" - .. selected_index .. "]" - - elseif setting.type == "enum" then - local selected_index = 0 - formspec = formspec .. "dropdown[0.5,3.5;3,1;dd_setting_value;" - for index, value in ipairs(setting.values) do - -- translating value is not possible, since it's the value - -- that we set the setting to - formspec = formspec .. core.formspec_escape(value) .. "," - if get_current_value(setting) == value then - selected_index = index - end - end - if #setting.values > 0 then - formspec = formspec:sub(1, -2) -- remove trailing comma - end - formspec = formspec .. ";" .. selected_index .. "]" - - elseif setting.type == "path" then - local current_value = dialogdata.selected_path - if not current_value then - current_value = get_current_value(setting) - end - formspec = formspec .. "field[0.5,4;7.5,1;te_setting_value;;" - .. core.formspec_escape(current_value) .. "]" - .. "button[8,3.75;2,1;btn_browser_path;" .. fgettext("Browse") .. "]" - + core.settings:set_bool("enable_shaders", false) + shaders_enabled = false + tab_string = tab_string .. + "label[8.38,0.2;" .. core.colorize("#888888", + fgettext("Shaders (unavailable)")) .. "]" + end + + tab_string = tab_string .. + "button[8,4.75;3.95,1;btn_change_keys;" + .. fgettext("Change Keys") .. "]" + + tab_string = tab_string .. + "button[0,4.75;3.95,1;btn_advanced_settings;" + .. fgettext("All Settings") .. "]" + + + if core.settings:get("touchscreen_threshold") ~= nil then + tab_string = tab_string .. + "label[4.3,4.2;" .. fgettext("Touchthreshold: (px)") .. "]" .. + "dropdown[4.25,4.65;3.5;dd_touchthreshold;0,10,20,30,40,50;" .. + ((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) .. + "]box[4.0,4.5;3.75,1.0;#999999]" + end + + if shaders_enabled then + tab_string = tab_string .. + "checkbox[8.25,0.5;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" + .. dump(core.settings:get_bool("tone_mapping")) .. "]" .. + "checkbox[8.25,1;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" + .. dump(core.settings:get_bool("enable_waving_water")) .. "]" .. + "checkbox[8.25,1.5;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" + .. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" .. + "checkbox[8.25,2;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" + .. dump(core.settings:get_bool("enable_waving_plants")) .. "]" + --"label[8.25,3.0;" .. fgettext("Dynamic shadows: ") .. "]" .. + --"dropdown[8.25,3.5;3.5;dd_shadows;" .. dd_options.shadow_levels[1] .. ";" + -- .. getSettingIndex.ShadowMapping() .. "]" else - -- TODO: fancy input for float, int, flags, noise_params, v3f - local width = 10 - local text = get_current_value(setting) - if dialogdata.error_message then - formspec = formspec .. "tablecolumns[color;text]" .. - "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. - "table[5,3.9;5,0.6;error_message;#FF0000," - .. core.formspec_escape(dialogdata.error_message) .. ";0]" - width = 5 - if dialogdata.entered_text then - text = dialogdata.entered_text - end - end - formspec = formspec .. "field[0.5,4;" .. width .. ",1;te_setting_value;;" - .. core.formspec_escape(text) .. "]" - end - return formspec + tab_string = tab_string .. + "label[8.38,0.7;" .. core.colorize("#888888", + fgettext("Tone Mapping")) .. "]" .. + "label[8.38,1.2;" .. core.colorize("#888888", + fgettext("Waving Liquids")) .. "]" .. + "label[8.38,1.7;" .. core.colorize("#888888", + fgettext("Waving Leaves")) .. "]" .. + "label[8.38,2.2;" .. core.colorize("#888888", + fgettext("Waving Plants")) .. "]" + --"label[8.38,2.7;" .. core.colorize("#888888", + -- fgettext("Dynamic shadows")) .. "]" + end + + return tab_string end -local function handle_change_setting_buttons(this, fields) - if fields["btn_done"] or fields["key_enter"] then - local setting = settings[selected_setting] - if setting.type == "bool" then - local new_value = fields["dd_setting_value"] - -- Note: new_value is the actual (translated) value shown in the dropdown - core.setting_setbool(setting.name, new_value == fgettext("Enabled")) - - elseif setting.type == "enum" then - local new_value = fields["dd_setting_value"] - core.setting_set(setting.name, new_value) - - elseif setting.type == "int" then - local new_value = tonumber(fields["te_setting_value"]) - if not new_value or math.floor(new_value) ~= new_value then - this.data.error_message = fgettext_ne("Please enter a valid integer.") - this.data.entered_text = fields["te_setting_value"] - core.update_formspec(this:get_formspec()) - return true - end - if setting.min and new_value < setting.min then - this.data.error_message = fgettext_ne("The value must be greater than $1.", setting.min) - this.data.entered_text = fields["te_setting_value"] - core.update_formspec(this:get_formspec()) - return true - end - if setting.max and new_value > setting.max then - this.data.error_message = fgettext_ne("The value must be lower than $1.", setting.max) - this.data.entered_text = fields["te_setting_value"] - core.update_formspec(this:get_formspec()) - return true - end - core.setting_set(setting.name, new_value) - - elseif setting.type == "float" then - local new_value = tonumber(fields["te_setting_value"]) - if not new_value then - this.data.error_message = fgettext_ne("Please enter a valid number.") - this.data.entered_text = fields["te_setting_value"] - core.update_formspec(this:get_formspec()) - return true - end - core.setting_set(setting.name, new_value) - - elseif setting.type == "flags" then - local new_value = fields["te_setting_value"] - for _,value in ipairs(new_value:split(",", true)) do - value = value:trim() - local possible = "," .. setting.possible .. "," - if not possible:find("," .. value .. ",", 0, true) then - this.data.error_message = fgettext_ne("\"$1\" is not a valid flag.", value) - this.data.entered_text = fields["te_setting_value"] - core.update_formspec(this:get_formspec()) - return true - end - end - core.setting_set(setting.name, new_value) +-------------------------------------------------------------------------------- +local function handle_settings_buttons(this, fields, tabname, tabdata) - else - local new_value = fields["te_setting_value"] - core.setting_set(setting.name, new_value) - end - core.setting_save() - this:delete() + if fields["btn_advanced_settings"] ~= nil then + local adv_settings_dlg = create_adv_settings_dlg() + adv_settings_dlg:set_parent(this) + this:hide() + adv_settings_dlg:show() + --mm_game_theme.update("singleplayer", current_game()) return true end - - if fields["btn_cancel"] then - this:delete() + if fields["cb_smooth_lighting"] then + core.settings:set("smooth_lighting", fields["cb_smooth_lighting"]) return true end - - if fields["btn_browser_path"] then - core.show_file_open_dialog("dlg_browse_path", fgettext_ne("Select path")) + if fields["cb_particles"] then + core.settings:set("enable_particles", fields["cb_particles"]) + return true end - - if fields["dlg_browse_path_accepted"] then - this.data.selected_path = fields["dlg_browse_path_accepted"] - core.update_formspec(this:get_formspec()) + if fields["cb_3d_clouds"] then + core.settings:set("enable_3d_clouds", fields["cb_3d_clouds"]) + return true end - - return false -end - -local function create_settings_formspec(tabview, name, tabdata) - local formspec = "tablecolumns[color;tree;text;text]" .. - "tableoptions[background=#00000000;border=false]" .. - "table[0,0;12,4.5;list_settings;" - - local current_level = 0 - for _, entry in ipairs(settings) do - local name - if not core.setting_getbool("main_menu_technical_settings") and entry.readable_name then - name = fgettext_ne(entry.readable_name) - else - name = entry.name - end - - if entry.type == "category" then - current_level = entry.level - formspec = formspec .. "#FFFF00," .. current_level .. "," .. fgettext(name) .. ",," - - elseif entry.type == "bool" then - local value = get_current_value(entry) - if core.is_yes(value) then - value = fgettext("Enabled") - else - value = fgettext("Disabled") - end - formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. "," - .. value .. "," - - elseif entry.type == "key" then - -- ignore key settings, since we have a special dialog for them - - else - formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. "," - .. core.formspec_escape(get_current_value(entry)) .. "," - end + if fields["cb_opaque_water"] then + core.settings:set("opaque_water", fields["cb_opaque_water"]) + return true end - - if #settings > 0 then - formspec = formspec:sub(1, -2) -- remove trailing comma + if fields["cb_connected_glass"] then + core.settings:set("connected_glass", fields["cb_connected_glass"]) + return true end - formspec = formspec .. ";" .. selected_setting .. "]" .. - "button[4,4.5;3,1;btn_change_keys;".. fgettext("Change keys") .. "]" .. - "button[10,4.5;2,1;btn_edit;" .. fgettext("Edit") .. "]" .. - "button[7,4.5;3,1;btn_restore;" .. fgettext("Restore Default") .. "]" .. - "checkbox[0,4.5;cb_tech_settings;" .. fgettext("Show technical names") .. ";" - .. dump(core.setting_getbool("main_menu_technical_settings")) .. "]" - - return formspec -end - -local function handle_settings_buttons(this, fields, tabname, tabdata) - local list_enter = false - if fields["list_settings"] then - selected_setting = core.get_table_index("list_settings") - if core.explode_table_event(fields["list_settings"]).type == "DCL" then - -- Directly toggle booleans - local setting = settings[selected_setting] - if setting.type == "bool" then - local current_value = get_current_value(setting) - core.setting_setbool(setting.name, not core.is_yes(current_value)) - core.setting_save() - return true - else - list_enter = true - end - else - return true - end + if fields["cb_autosave_screensize"] then + core.settings:set("autosave_screensize", fields["cb_autosave_screensize"]) + return true end - - if fields["btn_edit"] or list_enter then - local setting = settings[selected_setting] - if setting.type ~= "category" then - 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() - end + if fields["cb_shaders"] then + core.settings:set("enable_shaders", fields["cb_shaders"]) return true end - - if fields["btn_restore"] then - local setting = settings[selected_setting] - if setting.type ~= "category" then - core.setting_set(setting.name, setting.default) - core.setting_save() - core.update_formspec(this:get_formspec()) - end + if fields["cb_tonemapping"] then + core.settings:set("tone_mapping", fields["cb_tonemapping"]) + return true + end + if fields["cb_waving_water"] then + core.settings:set("enable_waving_water", fields["cb_waving_water"]) + return true + end + if fields["cb_waving_leaves"] then + core.settings:set("enable_waving_leaves", fields["cb_waving_leaves"]) + end + if fields["cb_waving_plants"] then + core.settings:set("enable_waving_plants", fields["cb_waving_plants"]) return true end - if fields["btn_change_keys"] then core.show_keys_menu() return true end - - if fields["cb_tech_settings"] then - core.setting_set("main_menu_technical_settings", fields["cb_tech_settings"]) - core.setting_save() - core.update_formspec(this:get_formspec()) + if fields["cb_touchscreen_target"] then + core.settings:set("touchtarget", fields["cb_touchscreen_target"]) return true end - return false -end + --Note dropdowns have to be handled LAST! + local ddhandled = false -tab_settings = { - name = "settings", - caption = fgettext("Settings"), - cbf_formspec = create_settings_formspec, - cbf_button_handler = handle_settings_buttons, -} - -local function create_minetest_conf_example() - local result = "# This file contains a list of all available settings and their default value for minetest.conf\n" .. - "\n" .. - "# By default, all the settings are commented and not functional.\n" .. - "# Uncomment settings by removing the preceding #.\n" .. - "\n" .. - "# minetest.conf is read by default from:\n" .. - "# ../minetest.conf\n" .. - "# ../../minetest.conf\n" .. - "# Any other path can be chosen by passing the path as a parameter\n" .. - "# to the program, eg. \"minetest.exe --config ../minetest.conf.example\".\n" .. - "\n" .. - "# Further documentation:\n" .. - "# http://wiki.minetest.net/\n" .. - "\n" - - local settings = parse_config_file(true, false) - for _, entry in ipairs(settings) do - if entry.type == "category" then - if entry.level == 0 then - result = result .. "#\n# " .. entry.name .. "\n#\n\n" - else - for i = 1, entry.level do - result = result .. "#" - end - result = result .. "# " .. entry.name .. "\n\n" - end - else - if entry.comment ~= "" then - for _, comment_line in ipairs(entry.comment:split("\n", true)) do - result = result .."# " .. comment_line .. "\n" - end - end - result = result .. "# type: " .. entry.type - if entry.min then - result = result .. " min: " .. entry.min - end - if entry.max then - result = result .. " max: " .. entry.max - end - if entry.values then - result = result .. " values: " .. table.concat(entry.values, ", ") - end - if entry.possible then - result = result .. " possible values: " .. entry.possible:gsub(",", ", ") - end - result = result .. "\n" - result = result .. "# " .. entry.name .. " = ".. entry.default .. "\n\n" + for i = 1, #labels.leaves do + if fields["dd_leaves_style"] == labels.leaves[i] then + core.settings:set("leaves_style", dd_options.leaves[2][i]) + ddhandled = true end end - return result -end - -local function create_translation_file() - local result = "// This file is automatically generated\n" .. - "// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files\n" .. - "// To update it, refer to the bottom of builtin/mainmenu/tab_settings.lua\n\n" .. - "fake_function() {\n" - - local settings = parse_config_file(true, false) - for _, entry in ipairs(settings) do - if entry.type == "category" then - local name_escaped = entry.name:gsub("\"", "\\\"") - result = result .. "\tgettext(\"" .. name_escaped .. "\");\n" - else - if entry.readable_name then - local readable_name_escaped = entry.readable_name:gsub("\"", "\\\"") - result = result .. "\tgettext(\"" .. readable_name_escaped .. "\");\n" - end - if entry.comment ~= "" then - local comment_escaped = entry.comment:gsub("\n", "\\n") - comment_escaped = comment_escaped:gsub("\"", "\\\"") - result = result .. "\tgettext(\"" .. comment_escaped .. "\");\n" - end + for i = 1, #labels.node_highlighting do + if fields["dd_node_highlighting"] == labels.node_highlighting[i] then + core.settings:set("node_highlighting", dd_options.node_highlighting[2][i]) + ddhandled = true end end - result = result .. "}\n" - return result -end - -if false then - local file = io.open("minetest.conf.example", "w") - if file then - file:write(create_minetest_conf_example()) - file:close() + if fields["dd_filters"] == labels.filters[1] then + core.settings:set("bilinear_filter", "false") + core.settings:set("trilinear_filter", "false") + ddhandled = true + elseif fields["dd_filters"] == labels.filters[2] then + core.settings:set("bilinear_filter", "true") + core.settings:set("trilinear_filter", "false") + ddhandled = true + elseif fields["dd_filters"] == labels.filters[3] then + core.settings:set("bilinear_filter", "false") + core.settings:set("trilinear_filter", "true") + ddhandled = true + end + if fields["dd_mipmap"] == labels.mipmap[1] then + core.settings:set("mip_map", "false") + core.settings:set("anisotropic_filter", "false") + ddhandled = true + elseif fields["dd_mipmap"] == labels.mipmap[2] then + core.settings:set("mip_map", "true") + core.settings:set("anisotropic_filter", "false") + ddhandled = true + elseif fields["dd_mipmap"] == labels.mipmap[3] then + core.settings:set("mip_map", "true") + core.settings:set("anisotropic_filter", "true") + ddhandled = true + end + if fields["dd_antialiasing"] then + core.settings:set("fsaa", + antialiasing_fname_to_name(fields["dd_antialiasing"])) + ddhandled = true + end + if fields["dd_touchthreshold"] then + core.settings:set("touchscreen_threshold", fields["dd_touchthreshold"]) + ddhandled = true + end + + for i = 1, #labels.shadow_levels do + if fields["dd_shadows"] == labels.shadow_levels[i] then + core.settings:set("shadow_levels", dd_options.shadow_levels[2][i]) + ddhandled = true + end end -end -if false then - local file = io.open("src/settings_translation_file.cpp", "w") - if file then - file:write(create_translation_file()) - file:close() + if fields["dd_shadows"] == labels.shadow_levels[1] then + core.settings:set("enable_dynamic_shadows", "false") + else + local shadow_presets = { + [2] = { 80, 512, "true", 0, "false" }, + [3] = { 120, 1024, "true", 1, "false" }, + [4] = { 350, 2048, "true", 1, "false" }, + [5] = { 350, 2048, "true", 2, "true" }, + [6] = { 450, 4096, "true", 2, "true" }, + } + local s = shadow_presets[table.indexof(labels.shadow_levels, fields["dd_shadows"])] + if s then + core.settings:set("enable_dynamic_shadows", "true") + core.settings:set("shadow_map_max_distance", s[1]) + core.settings:set("shadow_map_texture_size", s[2]) + core.settings:set("shadow_map_texture_32bit", s[3]) + core.settings:set("shadow_filters", s[4]) + core.settings:set("shadow_map_color", s[5]) + end end + + return ddhandled end + +return { + name = "settings", + caption = fgettext("Settings"), + cbf_formspec = formspec, + cbf_button_handler = handle_settings_buttons +}