diff --git a/binaries/data/mods/mod/gui/common/modern/sprites.xml b/binaries/data/mods/mod/gui/common/modern/sprites.xml index 40a5a76a5c..b8e05423ac 100644 --- a/binaries/data/mods/mod/gui/common/modern/sprites.xml +++ b/binaries/data/mods/mod/gui/common/modern/sprites.xml @@ -193,6 +193,21 @@ size = "0 1 100% 100%-1" /> + + + + + + + +value, + "configToValue": value => value, "valueToGui": (value, control) => { control.caption = value; }, - "guiToValue": control => +control.caption, + "guiToValue": control => control.caption, "guiSetter": "onTextEdit", - "sanitizeValue": (value, option) => - Math.min(option.max || Infinity, - Math.max(option.min || -Infinity, value)), + "sanitizeValue": (value, control, option) => { + let sanitized = + Math.min(option.max !== undefined ? option.max : +Infinity, + Math.max(option.min !== undefined ? option.min : -Infinity, + isNaN(+value) ? 0 : value)); + + control.sprite = sanitized == value ? "ModernDarkBoxWhite" : "ModernDarkBoxWhiteInvalid"; + + return sanitized; + }, "tooltip": (value, option) => sprintf( option.min !== undefined && option.max !== undefined ? @@ -225,15 +232,15 @@ function displayOptions() control[optionType.guiSetter] = function() {}; optionType.valueToGui(value, control); + if (optionType.sanitizeValue) + optionType.sanitizeValue(value, control, option); control[optionType.guiSetter] = function() { let value = optionType.guiToValue(control); + if (optionType.sanitizeValue) - { - value = optionType.sanitizeValue(value, option); - optionType.valueToGui(value, control); - } + optionType.sanitizeValue(value, control, option); control.tooltip = option.tooltip + (optionType.tooltip ? "\n" + optionType.tooltip(value, option) : ""); @@ -318,6 +325,38 @@ function revertChanges() } function saveChanges() +{ + for (let category in g_Options) + for (let i = 0; i < g_Options[category].options.length; ++i) + { + let option = g_Options[category].options[i]; + let optionType = g_OptionType[option.type]; + if (!optionType.sanitizeValue) + continue; + + let control = Engine.GetGUIObjectByName("option_control_" + option.type + "[" + i + "]"); + let value = optionType.guiToValue(control); + + if (value == optionType.sanitizeValue(value, control, option)) + continue; + + g_SelectedCategory = category; + displayOptions(); + + messageBox( + 500, 200, + translate("Some setting values are invalid! Are you sure to save them?"), + translate("Warning"), + [translate("No"), translate("Yes")], + [null, reallySaveChanges] + ); + return; + } + + reallySaveChanges() +} + +function reallySaveChanges() { Engine.ConfigDB_WriteFile("user", "config/user.cfg"); Engine.ConfigDB_SetChanges("user", false); diff --git a/binaries/data/mods/public/gui/options/options.xml b/binaries/data/mods/public/gui/options/options.xml index c432eea528..58ec54b041 100644 --- a/binaries/data/mods/public/gui/options/options.xml +++ b/binaries/data/mods/public/gui/options/options.xml @@ -18,7 +18,7 @@ -