added config editor (closes #19)
parent
09005f89be
commit
74ba2ffc90
@ -0,0 +1,94 @@ |
|||||||
|
const config=require('config'); |
||||||
|
const assets=require('assets'); |
||||||
|
const Popup=require('popup'); |
||||||
|
|
||||||
|
let lastCEId=0; |
||||||
|
class ConfigEditor extends Popup { |
||||||
|
constructor() { |
||||||
|
super("Config editor", [], {ok: "OK"}); |
||||||
|
|
||||||
|
const metaConfig=assets.get('metaConfig'); |
||||||
|
|
||||||
|
this.watchers=[]; |
||||||
|
|
||||||
|
for(let key in metaConfig) { |
||||||
|
const level=Array.from(key).reduce((a, c) => a+c=='.', 0)+2; |
||||||
|
const data=metaConfig[key]; |
||||||
|
|
||||||
|
if(!data.type) { |
||||||
|
this.addHeading(data.name); |
||||||
|
} else { |
||||||
|
let span=document.createElement('span'); |
||||||
|
let id='cfgInput-'+(lastCEId++)+'-'+key.replace(/\./g, '-'); |
||||||
|
let label=span.appendChild(document.createElement('label')); |
||||||
|
label.innerText=data.name; |
||||||
|
label.title=key; |
||||||
|
|
||||||
|
let input; |
||||||
|
if(data.type=='boolean') { |
||||||
|
input=document.createElement('input'); |
||||||
|
input.type='checkbox'; |
||||||
|
input.checked=config.getB(key); |
||||||
|
input.addEventListener('change', () => config.set(key, input.checked)); |
||||||
|
} else if(data.type=='choice') { |
||||||
|
input=document.createElement('select'); |
||||||
|
data.bounds.choices.forEach(choice => { |
||||||
|
let option=document.createElement('option'); |
||||||
|
option.value=choice; |
||||||
|
option.innerText=choice; |
||||||
|
input.appendChild(option); |
||||||
|
}); |
||||||
|
input.value=config.getS(key); |
||||||
|
input.addEventListener('change', () => config.set(key, input.value)); |
||||||
|
} else if(data.type=='number') { |
||||||
|
input=document.createElement('input'); |
||||||
|
input.type='number'; |
||||||
|
if(data.bounds) { |
||||||
|
input.setAttribute('min', data.bounds.min); |
||||||
|
input.setAttribute('max', data.bounds.max); |
||||||
|
input.setAttribute('step', data.bounds.inc); |
||||||
|
} |
||||||
|
input.value=config.getN(key); |
||||||
|
input.addEventListener('change', () => config.set(key, input.value)); |
||||||
|
} |
||||||
|
|
||||||
|
input.setAttribute('id', id); |
||||||
|
span.appendChild(input); |
||||||
|
label.setAttribute('for', id); |
||||||
|
this.addContent(span); |
||||||
|
|
||||||
|
if(data.excludes) { |
||||||
|
const setEnabled=() => |
||||||
|
input.disabled= |
||||||
|
data.excludes |
||||||
|
.some(key => config.getB(key)) |
||||||
|
|
||||||
|
setEnabled(); |
||||||
|
data.excludes.forEach(key => { |
||||||
|
let c=config.watchB(key, setEnabled); |
||||||
|
this.watchers.push([key, c]); |
||||||
|
}); |
||||||
|
} |
||||||
|
if(data.parent) { |
||||||
|
input.disabled=!config.getB(data.parent); |
||||||
|
let c=config.watchB(data.parent, (k, v) => input.disabled=!v); |
||||||
|
this.watchers.push([data.parent, c]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
this.large=true; |
||||||
|
} |
||||||
|
|
||||||
|
discard() { |
||||||
|
this.watchers.forEach(([k, c]) => config.unwatch(k, c)); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return module.exports={ |
||||||
|
show: async () => { |
||||||
|
let editor=new ConfigEditor(); |
||||||
|
await editor.display(); |
||||||
|
editor.discard(); |
||||||
|
} |
||||||
|
}; |
Loading…
Reference in new issue