added config editor (closes #19)
	
		
	
				
					
				
			
							parent
							
								
									65b33afa05
								
							
						
					
					
						commit
						0923ad56dd
					
				| @ -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