added config manager (closes #18) and fixed crash at win
parent
a7e2d1c201
commit
d339dd0a06
@ -1,20 +1,20 @@ |
|||||||
{ |
{ |
||||||
"touchscreen": { |
"input.touchscreen.crosspad.enabled": true, |
||||||
"enabled": true, |
"input.touchscreen.crosspad.overlay": true, |
||||||
"mode": "crosspad", |
|
||||||
"deadzone": 50, |
"input.touchscreen.joystick.enabled": false, |
||||||
"buffer": false |
"input.touchscreen.joystick.overlay": true, |
||||||
}, |
"input.touchscreen.joystick.deadzone": 10, |
||||||
"keyboard": { |
|
||||||
"enabled": true, |
"input.touchscreen.swipe.enabled": false, |
||||||
"buffer": false |
"input.touchscreen.swipe.deadzone": 50, |
||||||
}, |
|
||||||
"gamepad": { |
"input.gamepad.enabled": true, |
||||||
"enabled": true, |
"input.gamepad.deadzone": 0.5, |
||||||
"deadzone": 0.5, |
|
||||||
"buffer": true |
"input.keyboard.enabled": true, |
||||||
}, |
|
||||||
"appearance": { |
"input.buffer": false, |
||||||
"grid": "none" |
|
||||||
} |
"appearance.grid": "none" |
||||||
} |
} |
||||||
|
@ -1,26 +1,121 @@ |
|||||||
{ |
{ |
||||||
"touchscreen": { |
"input": { |
||||||
"mode": [ |
"name": "Input settings" |
||||||
"crosspad", |
}, |
||||||
"joystick", |
|
||||||
"swipe" |
"input.touchscreen": { |
||||||
], |
"name": "Touchscreen settings" |
||||||
"deadzone": { |
}, |
||||||
|
|
||||||
|
"input.touchscreen.crosspad": { |
||||||
|
"name": "Crosspad mode" |
||||||
|
}, |
||||||
|
"input.touchscreen.crosspad.enabled": { |
||||||
|
"name": "Enable crosspad", |
||||||
|
"type": "boolean", |
||||||
|
"excludes": [ |
||||||
|
"input.touchscreen.joystick.enabled", |
||||||
|
"input.touchscreen.swipe.enabled" |
||||||
|
] |
||||||
|
}, |
||||||
|
"input.touchscreen.crosspad.overlay": { |
||||||
|
"name": "Show overlay", |
||||||
|
"type": "boolean", |
||||||
|
"parent": "input.touchscreen.crosspad.enabled" |
||||||
|
}, |
||||||
|
|
||||||
|
"input.touchscreen.joystick": { |
||||||
|
"name": "Joystick mode" |
||||||
|
}, |
||||||
|
"input.touchscreen.joystick.enabled": { |
||||||
|
"name": "Enable joystick", |
||||||
|
"type": "boolean", |
||||||
|
"excludes": [ |
||||||
|
"input.touchscreen.crosspad.enabled", |
||||||
|
"input.touchscreen.swipe.enabled" |
||||||
|
] |
||||||
|
}, |
||||||
|
"input.touchscreen.joystick.overlay": { |
||||||
|
"name": "Show overlay", |
||||||
|
"type": "boolean", |
||||||
|
"parent": "input.touchscreen.joystick.enabled" |
||||||
|
}, |
||||||
|
"input.touchscreen.joystick.deadzone": { |
||||||
|
"name": "Deadzone", |
||||||
|
"type": "number", |
||||||
|
"parent": "input.touchscreen.joystick.enabled", |
||||||
|
"bounds": { |
||||||
"min": 1, |
"min": 1, |
||||||
"max": 100 |
"max": 100, |
||||||
|
"inc": 1 |
||||||
} |
} |
||||||
}, |
}, |
||||||
"gamepad": { |
|
||||||
"deadzone": { |
"input.touchscreen.swipe": { |
||||||
|
"name": "Swipe mode" |
||||||
|
}, |
||||||
|
"input.touchscreen.swipe.enabled": { |
||||||
|
"name": "Enable swipe", |
||||||
|
"type": "boolean", |
||||||
|
"excludes": [ |
||||||
|
"input.touchscreen.crosspad.enabled", |
||||||
|
"input.touchscreen.joystick.enabled" |
||||||
|
] |
||||||
|
}, |
||||||
|
"input.touchscreen.swipe.deadzone": { |
||||||
|
"name": "Deadzone", |
||||||
|
"type": "number", |
||||||
|
"parent": "input.touchscreen.swipe.enabled", |
||||||
|
"bounds": { |
||||||
|
"min": 1, |
||||||
|
"max": 100, |
||||||
|
"inc": 1 |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
"input.gamepad": { |
||||||
|
"name": "Gamepad settings" |
||||||
|
}, |
||||||
|
"input.gamepad.enabled": { |
||||||
|
"name": "Enable gamepad", |
||||||
|
"type": "boolean" |
||||||
|
}, |
||||||
|
"input.gamepad.deadzone": { |
||||||
|
"name": "Deadzone", |
||||||
|
"type": "number", |
||||||
|
"parent": "input.gamepad.enabled", |
||||||
|
"bounds": { |
||||||
"min": 0, |
"min": 0, |
||||||
"max": 1 |
"max": 1, |
||||||
|
"inc": 0.1 |
||||||
} |
} |
||||||
}, |
}, |
||||||
|
|
||||||
|
"input.keyboard": { |
||||||
|
"name": "Keyboard settings" |
||||||
|
}, |
||||||
|
"input.keyboard.enabled": { |
||||||
|
"name": "Enable keyboard", |
||||||
|
"type": "boolean" |
||||||
|
}, |
||||||
|
|
||||||
|
"input.buffer": { |
||||||
|
"name": "Enable input buffering", |
||||||
|
"type": "boolean" |
||||||
|
}, |
||||||
|
|
||||||
"appearance": { |
"appearance": { |
||||||
"grid": [ |
"name": "Appearance" |
||||||
|
}, |
||||||
|
"appearance.grid": { |
||||||
|
"name": "Grid type", |
||||||
|
"type": "choice", |
||||||
|
"bounds": { |
||||||
|
"choices": [ |
||||||
|
"none", |
||||||
"grid", |
"grid", |
||||||
"checkerboard", |
"checkerboard" |
||||||
"none" |
|
||||||
] |
] |
||||||
} |
} |
||||||
} |
} |
||||||
|
} |
||||||
|
@ -0,0 +1,76 @@ |
|||||||
|
const assets=require('assets'); |
||||||
|
|
||||||
|
let watchers=Object.create(null); |
||||||
|
let lastWatchCode=1; |
||||||
|
|
||||||
|
const toBoolean=v => { |
||||||
|
if(v=='false' || v==false) return false; |
||||||
|
return true; |
||||||
|
}; |
||||||
|
|
||||||
|
const get=key => { |
||||||
|
let confVal=localStorage.getItem('config.'+key); |
||||||
|
if(confVal===null) return assets.get('config')[key]; |
||||||
|
return confVal; |
||||||
|
}; |
||||||
|
const getB=key => toBoolean(get(key)); |
||||||
|
const getN=key => +get(key); |
||||||
|
const getS=key => ''+get(key); |
||||||
|
|
||||||
|
const set=(key, value) => { |
||||||
|
localStorage.setItem('config.'+key, value); |
||||||
|
let interested=watchers[key]; |
||||||
|
if(interested) interested.forEach(watcher => watcher(key, value)); |
||||||
|
}; |
||||||
|
|
||||||
|
const remove=key => { |
||||||
|
localStorage.removeItem('config.'+key, value); |
||||||
|
let interested=watchers[key]; |
||||||
|
if(interested) interested.forEach(watcher => watcher(key, assets.get('config')[key])); |
||||||
|
}; |
||||||
|
const clear=() => |
||||||
|
Object |
||||||
|
.keys(assets.get('config')) |
||||||
|
.forEach(remove); |
||||||
|
|
||||||
|
const watch=(key, fn) => { |
||||||
|
if(!watchers[key]) watchers[key]=[]; |
||||||
|
const code='w'+lastWatchCode++; |
||||||
|
watchers[key][code]=fn; |
||||||
|
return code; |
||||||
|
}; |
||||||
|
const watchB=(key, fn) => watch(key, (k, v) => fn(k, toBoolean(v))); |
||||||
|
const watchN=(key, fn) => watch(key, (k, v) => fn(k, +v)); |
||||||
|
const watchS=(key, fn) => watch(key, (k, v) => fn(k, ''+v)); |
||||||
|
|
||||||
|
const unwatch=(key, code) => { |
||||||
|
if(!watchers[key]) return; |
||||||
|
delete watchers[key][code]; |
||||||
|
}; |
||||||
|
|
||||||
|
const list=() => |
||||||
|
Object |
||||||
|
.keys(assets.get('config')); |
||||||
|
const dict=() => { |
||||||
|
let dict=Object.create(null); |
||||||
|
Object |
||||||
|
.keys(assets.get('config')) |
||||||
|
.forEach( |
||||||
|
key => dict[key]={ |
||||||
|
raw: get(key), |
||||||
|
b: getB(key), |
||||||
|
n: getN(key), |
||||||
|
s: getS(key) |
||||||
|
} |
||||||
|
); |
||||||
|
return dict; |
||||||
|
}; |
||||||
|
|
||||||
|
return module.exports={ |
||||||
|
get, getB, getN, getS, |
||||||
|
set, |
||||||
|
remove, clear, |
||||||
|
watch, watchB, watchN, watchS, |
||||||
|
unwatch, |
||||||
|
list, dict |
||||||
|
}; |
Loading…
Reference in new issue