Parse
File Parse keyboard.js
This tree is parsed live from the source file.
Classes
-
{{ item.name }}
- {{ key }}
Not Classes
{{ getTree() }}
Comments
{{ getTreeComments() }}
Source
const KC = {
UP: ['ArrowUp', 'KeyW']
, LEFT: ['ArrowLeft', 'KeyA']
, RIGHT: ['ArrowRight', 'KeyD']
, DOWN: ['ArrowDown', 'KeyS']
}
const KEYS = new Proxy(KC, {
get(target, prop) {
let val = target[prop]
if(val == undefined) {
val = target[prop] = this.detectStore(target, prop)
}
return val
}
, detectStore(target, prop) {
if(prop.length == 1) {
return [`Key${prop.toUpperCase()}`]
}
// console.warn('Unknown KEY', prop)
return [prop.toUpperCase()]
}
});
class StageKeyboard {
autoListen = true
constructor(stage=undefined) {
this.stage = stage
this.data = { keydown: [], keyup: [] }
this.wake()
}
wake(){
let p = this.getEventParent()
p.addEventListener('keydown', this.stageKeydownHandler.bind(this))
p.addEventListener('keyup', this.stageKeyupHandler.bind(this))
}
stageKeydownHandler(ev) {
let p = this.stage
if(p.onKeydown) {
p.onKeydown(ev)
}
return this.genericHandler(ev)
}
genericHandler(ev) {
for(let item of this.data[ev.type]) {
if(this.matchCode(ev, item)) {
// console.log('YEY!')
item.handler(ev)
}
}
}
matchCode(ev, item) {
let code = ev.code.toLowerCase()
// console.log('Code', code)
if(item.codes == undefined) {
console.warn('Bad Key Load', item)
return
}
for (var i = item.codes.length - 1; i >= 0; i--) {
if(item.codes[i].toLowerCase() == code) {
return true
}
}
return false
}
stageKeyupHandler(ev) {
let p = this.stage
if(p.onKeyup) {
p.onKeyup(ev)
}
return this.genericHandler(ev)
}
getEventParent() {
return window //this.stage.canvas
}
receiverFunction(prop) {
/* Unknoen prop call. */
return (codes, func, props) => {
// console.log('prop', prop, handler)
return this.on(prop, func, props)
}
}
onKeydown(codes, handler) {
this.data['keydown'].push({codes, handler})
}
onKeyup(codes, handler) {
this.data['keyup'].push({codes, handler})
}
}
const keyboardHandler = function(parent) {
const unknownAttrProxyHandler = {
get(target, prop, receiver) {
if(target[prop] !== undefined) {
// return target[prop].apply(target, arguments)
return Reflect.get.apply(target,arguments);
}
console.log('Return receiver')
return target.receiverFunction(prop)
}
};
const target = new StageKeyboard(parent)
const eventNameHandlerProxy = new Proxy(target, unknownAttrProxyHandler);
return eventNameHandlerProxy;
}
Polypoint.head.install(StageKeyboard)
Polypoint.head.lazierProp('Stage', function keyboard(){
return keyboardHandler(this)
})
copy