diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 8fabc3c368bfb78a3614dd084aa9095be640584d..b9fc196c8527abfcd9cae5ba5313149ffdff2c09 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -12,7 +12,7 @@ App.UI.OptionsGroup = (function() { * @property {Function} [callback] */ - const Option = class { + class Option { /** * @param {string} description can be SC markup * @param {string} property @@ -161,7 +161,139 @@ App.UI.OptionsGroup = (function() { this.valuePairs.last().neutral = true; return this; } - }; + + /** + * @param {HTMLDivElement} container + */ + render(container) { + /* left side */ + const desc = document.createElement("div"); + desc.className = "description"; + $(desc).wiki(this.description); + container.append(desc); + + /* right side */ + const currentValue = this.object[this.property]; + let anySelected = false; + + const buttonGroup = document.createElement("div"); + buttonGroup.classList.add("button-group"); + if (this.valuePairs.length < 6) { + for (const value of this.valuePairs) { + if (value.mode === "plain") { + /* insert custom SC markup and go to next element */ + $(buttonGroup).wiki(value.value); + continue; + } + const button = document.createElement("button"); + button.append(value.name); + if (value.on) { + button.classList.add("on"); + } else if (value.off) { + button.classList.add("off"); + } else if (value.neutral) { + button.classList.add("neutral"); + } + if (value.mode === "custom") { + button.onclick = () => { + value.callback(); + if (value.value) { + Engine.play(value.value); + } else { + App.UI.reload(); + } + }; + } else { + if (value.mode === "=" && currentValue === value.value) { + button.classList.add("selected", "disabled"); + anySelected = true; + if (value.descAppend !== undefined) { + desc.append(" "); + $(desc).wiki(value.descAppend); + } + } else if (!anySelected && inRange(value.mode, value.compareValue, currentValue)) { + button.classList.add("selected"); + // disable the button if clicking it won't change the variable value + if (currentValue === value.value) { + button.classList.add("disabled"); + } + anySelected = true; + if (value.descAppend !== undefined) { + desc.append(" "); + $(desc).wiki(value.descAppend); + } + } + button.onclick = () => { + this.object[this.property] = value.value; + if (value.callback) { + value.callback(); + } + App.UI.reload(); + }; + } + buttonGroup.append(button); + } + } else { + let select = document.createElement("select"); + select.classList.add("rajs-list"); + + for (const value of this.valuePairs) { + let el = document.createElement("option"); + el.textContent = value.name; + el.value = value.value; + if (this.object[this.property] === value.value) { + el.selected = true; + } + select.appendChild(el); + } + select.onchange = () => { + const O = select.options[select.selectedIndex]; + if (isNaN(Number(O.value))) { + this.object[this.property] = O.value; + } else { + this.object[this.property] = Number(O.value); + } + App.UI.reload(); + }; + buttonGroup.append(select); + } + + if (this.textbox) { + const isNumber = typeof currentValue === "number"; + const textbox = App.UI.DOM.makeTextBox(currentValue, input => { + this.object[this.property] = input; + App.UI.reload(); + }, isNumber); + if (isNumber) { + textbox.classList.add("number"); + } + buttonGroup.append(textbox); + if (this.unit) { + buttonGroup.append(" ", this.unit); + } + } + if (this.comment) { + const comment = document.createElement("span"); + comment.classList.add("comment"); + $(comment).wiki(this.comment); + buttonGroup.append(comment); + } + container.append(buttonGroup); + + function inRange(mode, compareValue, value) { + if (mode === "<") { + return value < compareValue; + } else if (mode === "<=") { + return value <= compareValue; + } else if (mode === ">") { + return value > compareValue; + } else if (mode === ">=") { + return value >= compareValue; + } + return false; + } + } + } return class { constructor() { @@ -198,135 +330,10 @@ App.UI.OptionsGroup = (function() { container.classList.add("double"); } for (/** @type {Option} */ const option of this.options) { - /* left side */ - const desc = document.createElement("div"); - desc.className = "description"; - $(desc).wiki(option.description); - container.append(desc); - - /* right side */ - const currentValue = option.object[option.property]; - let anySelected = false; - - const buttonGroup = document.createElement("div"); - buttonGroup.classList.add("button-group"); - if (option.valuePairs.length < 6) { - for (const value of option.valuePairs) { - if (value.mode === "plain") { - /* insert custom SC markup and go to next element */ - $(buttonGroup).wiki(value.value); - continue; - } - const button = document.createElement("button"); - button.append(value.name); - if (value.on) { - button.classList.add("on"); - } else if (value.off) { - button.classList.add("off"); - } else if (value.neutral) { - button.classList.add("neutral"); - } - if (value.mode === "custom") { - button.onclick = () => { - value.callback(); - if (value.value) { - Engine.play(value.value); - } else { - App.UI.reload(); - } - }; - } else { - if (value.mode === "=" && currentValue === value.value) { - button.classList.add("selected", "disabled"); - anySelected = true; - if (value.descAppend !== undefined) { - desc.append(" "); - $(desc).wiki(value.descAppend); - } - } else if (!anySelected && inRange(value.mode, value.compareValue, currentValue)) { - button.classList.add("selected"); - // disable the button if clicking it won't change the variable value - if (currentValue === value.value) { - button.classList.add("disabled"); - } - anySelected = true; - if (value.descAppend !== undefined) { - desc.append(" "); - $(desc).wiki(value.descAppend); - } - } - button.onclick = () => { - option.object[option.property] = value.value; - if (value.callback) { - value.callback(); - } - App.UI.reload(); - }; - } - buttonGroup.append(button); - } - } else { - let select = document.createElement("select"); - select.classList.add("rajs-list"); - - for (const value of option.valuePairs) { - let el = document.createElement("option"); - el.textContent = value.name; - el.value = value.value; - if (option.object[option.property] === value.value) { - el.selected = true; - } - select.appendChild(el); - } - select.onchange = () => { - const O = select.options[select.selectedIndex]; - if (isNaN(Number(O.value))) { - option.object[option.property] = O.value; - } else { - option.object[option.property] = Number(O.value); - } - App.UI.reload(); - }; - buttonGroup.append(select); - } - - if (option.textbox) { - const isNumber = typeof currentValue === "number"; - const textbox = App.UI.DOM.makeTextBox(currentValue, input => { - option.object[option.property] = input; - App.UI.reload(); - }, isNumber); - if (isNumber) { - textbox.classList.add("number"); - } - buttonGroup.append(textbox); - if (option.unit) { - buttonGroup.append(" ", option.unit); - } - } - if (option.comment) { - const comment = document.createElement("span"); - comment.classList.add("comment"); - $(comment).wiki(option.comment); - buttonGroup.append(comment); - } - container.append(buttonGroup); + option.render(container); } return container; - - function inRange(mode, compareValue, value) { - if (mode === "<") { - return value < compareValue; - } else if (mode === "<=") { - return value <= compareValue; - } else if (mode === ">") { - return value > compareValue; - } else if (mode === ">=") { - return value >= compareValue; - } - return false; - } } }; })();