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 @@