Implemented range settings
This commit is contained in:
parent
b2980178d1
commit
74bb057314
|
@ -240,20 +240,141 @@ const buildOptionsDiv = (game, settings) => {
|
||||||
|
|
||||||
optionTable.appendChild(tbody);
|
optionTable.appendChild(tbody);
|
||||||
settingWrapper.appendChild(optionTable);
|
settingWrapper.appendChild(optionTable);
|
||||||
optionsWrapper.appendChild(settingWrapper);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'range':
|
case 'range':
|
||||||
const settingDescription = document.createElement('p');
|
const hintText = document.createElement('p');
|
||||||
settingDescription.classList.add('setting-description');
|
hintText.classList.add('hint-text');
|
||||||
settingDescription.innerText = setting.description.replace(/(\n)/g, ' ');
|
hintText.innerHTML = 'This is a range option. You may enter valid numerical values in the text box below, ' +
|
||||||
settingWrapper.appendChild(settingDescription);
|
`then press the "Add" button to add a weight for it.<br />Minimum value: ${setting.min}<br />` +
|
||||||
|
`Maximum value: ${setting.max}`;
|
||||||
|
settingWrapper.appendChild(hintText);
|
||||||
|
|
||||||
|
const addOptionDiv = document.createElement('div');
|
||||||
|
addOptionDiv.classList.add('add-option-div');
|
||||||
|
const optionInput = document.createElement('input');
|
||||||
|
optionInput.setAttribute('id', `${game}-${settingName}-option`);
|
||||||
|
optionInput.setAttribute('placeholder', `${setting.min} - ${setting.max}`);
|
||||||
|
addOptionDiv.appendChild(optionInput);
|
||||||
|
const addOptionButton = document.createElement('button');
|
||||||
|
addOptionButton.innerText = 'Add';
|
||||||
|
addOptionDiv.appendChild(addOptionButton);
|
||||||
|
settingWrapper.appendChild(addOptionDiv);
|
||||||
|
optionInput.addEventListener('keydown', (evt) => {
|
||||||
|
if (evt.key === 'Enter') { addOptionButton.dispatchEvent(new Event('click')); }
|
||||||
|
});
|
||||||
|
|
||||||
|
const rangeTable = document.createElement('table');
|
||||||
|
const rangeTbody = document.createElement('tbody');
|
||||||
|
|
||||||
|
Object.keys(currentSettings[game][settingName]).forEach((option) => {
|
||||||
|
if (currentSettings[game][settingName][option] > 0) {
|
||||||
|
const tr = document.createElement('tr');
|
||||||
|
const tdLeft = document.createElement('td');
|
||||||
|
tdLeft.classList.add('td-left');
|
||||||
|
tdLeft.innerText = option;
|
||||||
|
tr.appendChild(tdLeft);
|
||||||
|
|
||||||
|
const tdMiddle = document.createElement('td');
|
||||||
|
tdMiddle.classList.add('td-middle');
|
||||||
|
const range = document.createElement('input');
|
||||||
|
range.setAttribute('type', 'range');
|
||||||
|
range.setAttribute('id', `${game}-${settingName}-${option}-range`);
|
||||||
|
range.setAttribute('data-game', game);
|
||||||
|
range.setAttribute('data-setting', settingName);
|
||||||
|
range.setAttribute('data-option', option);
|
||||||
|
range.setAttribute('min', 0);
|
||||||
|
range.setAttribute('max', 50);
|
||||||
|
range.addEventListener('change', updateGameSetting);
|
||||||
|
range.value = currentSettings[game][settingName][parseInt(option, 10)];
|
||||||
|
tdMiddle.appendChild(range);
|
||||||
|
tr.appendChild(tdMiddle);
|
||||||
|
|
||||||
|
const tdRight = document.createElement('td');
|
||||||
|
tdRight.setAttribute('id', `${game}-${settingName}-${option}`)
|
||||||
|
tdRight.classList.add('td-right');
|
||||||
|
tdRight.innerText = range.value;
|
||||||
|
tr.appendChild(tdRight);
|
||||||
|
|
||||||
|
const tdDelete = document.createElement('td');
|
||||||
|
tdDelete.classList.add('td-delete');
|
||||||
|
const deleteButton = document.createElement('span');
|
||||||
|
deleteButton.classList.add('range-option-delete');
|
||||||
|
deleteButton.innerText = '❌';
|
||||||
|
deleteButton.addEventListener('click', () => {
|
||||||
|
range.value = 0;
|
||||||
|
range.dispatchEvent(new Event('change'));
|
||||||
|
rangeTbody.removeChild(tr);
|
||||||
|
});
|
||||||
|
tdDelete.appendChild(deleteButton);
|
||||||
|
tr.appendChild(tdDelete);
|
||||||
|
|
||||||
|
rangeTbody.appendChild(tr);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
rangeTable.appendChild(rangeTbody);
|
||||||
|
settingWrapper.appendChild(rangeTable);
|
||||||
|
|
||||||
|
addOptionButton.addEventListener('click', () => {
|
||||||
|
const optionInput = document.getElementById(`${game}-${settingName}-option`);
|
||||||
|
let option = optionInput.value;
|
||||||
|
if (!option || !option.trim()) { return; }
|
||||||
|
option = parseInt(option, 10);
|
||||||
|
if ((option < setting.min) || (option > setting.max)) { return; }
|
||||||
|
optionInput.value = '';
|
||||||
|
if (document.getElementById(`${game}-${settingName}-${option}-range`)) { return; }
|
||||||
|
|
||||||
|
const tr = document.createElement('tr');
|
||||||
|
const tdLeft = document.createElement('td');
|
||||||
|
tdLeft.classList.add('td-left');
|
||||||
|
tdLeft.innerText = option;
|
||||||
|
tr.appendChild(tdLeft);
|
||||||
|
|
||||||
|
const tdMiddle = document.createElement('td');
|
||||||
|
tdMiddle.classList.add('td-middle');
|
||||||
|
const range = document.createElement('input');
|
||||||
|
range.setAttribute('type', 'range');
|
||||||
|
range.setAttribute('id', `${game}-${settingName}-${option}-range`);
|
||||||
|
range.setAttribute('data-game', game);
|
||||||
|
range.setAttribute('data-setting', settingName);
|
||||||
|
range.setAttribute('data-option', option);
|
||||||
|
range.setAttribute('min', 0);
|
||||||
|
range.setAttribute('max', 50);
|
||||||
|
range.addEventListener('change', updateGameSetting);
|
||||||
|
range.value = currentSettings[game][settingName][parseInt(option, 10)];
|
||||||
|
tdMiddle.appendChild(range);
|
||||||
|
tr.appendChild(tdMiddle);
|
||||||
|
|
||||||
|
const tdRight = document.createElement('td');
|
||||||
|
tdRight.setAttribute('id', `${game}-${settingName}-${option}`)
|
||||||
|
tdRight.classList.add('td-right');
|
||||||
|
tdRight.innerText = range.value;
|
||||||
|
tr.appendChild(tdRight);
|
||||||
|
|
||||||
|
const tdDelete = document.createElement('td');
|
||||||
|
tdDelete.classList.add('td-delete');
|
||||||
|
const deleteButton = document.createElement('span');
|
||||||
|
deleteButton.classList.add('range-option-delete');
|
||||||
|
deleteButton.innerText = '❌';
|
||||||
|
deleteButton.addEventListener('click', () => {
|
||||||
|
range.value = 0;
|
||||||
|
range.dispatchEvent(new Event('change'));
|
||||||
|
rangeTbody.removeChild(tr);
|
||||||
|
});
|
||||||
|
tdDelete.appendChild(deleteButton);
|
||||||
|
tr.appendChild(tdDelete);
|
||||||
|
|
||||||
|
rangeTbody.appendChild(tr);
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.error(`Unknown setting type for ${game} setting ${setting}: ${settings[setting].type}`);
|
console.error(`Unknown setting type for ${game} setting ${setting}: ${settings[setting].type}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optionsWrapper.appendChild(settingWrapper);
|
||||||
});
|
});
|
||||||
|
|
||||||
return optionsWrapper;
|
return optionsWrapper;
|
||||||
|
|
|
@ -24,6 +24,26 @@ html{
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#weighted-settings .setting-wrapper .add-option-div{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#weighted-settings .setting-wrapper .add-option-div button{
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
margin: 0 0 0 0.15rem;
|
||||||
|
padding: 0 0.25rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
#weighted-settings .setting-wrapper .add-option-div button:active{
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
#weighted-settings p.setting-description{
|
#weighted-settings p.setting-description{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin: 0 0 1rem;
|
margin: 0 0 1rem;
|
||||||
|
@ -46,6 +66,7 @@ html{
|
||||||
|
|
||||||
#weighted-settings table .td-left{
|
#weighted-settings table .td-left{
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
|
width: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#weighted-settings table .td-middle{
|
#weighted-settings table .td-middle{
|
||||||
|
@ -55,6 +76,20 @@ html{
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#weighted-settings table .td-right{
|
||||||
|
width: 4rem;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#weighted-settings table .td-delete{
|
||||||
|
width: 50px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#weighted-settings table .range-option-delete{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
#weighted-settings #weighted-settings-button-row{
|
#weighted-settings #weighted-settings-button-row{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
|
Loading…
Reference in New Issue