var keys = (function(){ var keys = {} var direction = [0,1] keys.bind = function(){ cursor_input.addEventListener('keydown', function(e){ // console.log("keycode:", e.keyCode) if (e.altKey) { document.body.classList.add("dropper") } switch (e.keyCode) { case 27: // esc if (!selection.hidden && current_canvas === canvas){ selection.hide() selection.show() } else if (focused){ focused.blur() } return } if (window.focused && focused.raw_key) { focused.raw_key(e) return } switch (e.keyCode) { case 219: // [ if (current_tool.name != "text") { e.preventDefault() brush.contract(1) brush.modified = false check_if_lost_focus() } break case 221: // ] if (current_tool.name != "text") { e.preventDefault() brush.expand(1) brush.modified = false } break case 8: e.preventDefault() current_canvas.focusLex(focused.y, focused.x - 1) focused.char = " " focused.build() return case 13: // return e.preventDefault() current_canvas.focusLex(focused.y, focused.x+1) return case 38: // up e.preventDefault() current_canvas.focusLex(focused.y - 1, focused.x + 0) break case 40: // down e.preventDefault() current_canvas.focusLex(focused.y + 1, focused.x + 0) break case 37: // left e.preventDefault() current_canvas.focusLex(focused.y + 0, focused.x - 1) break case 39: // right e.preventDefault() current_canvas.focusLex(focused.y + 0, focused.x + 1) break // default: // if (focused) { focused.key(undefined, e.keyCode) } } }) cursor_input.addEventListener('input', function(e){ /* if (! e.metaKey && ! e.ctrlKey && ! e.altKey) { e.preventDefault() } */ if (current_tool.name == "shader") { cursor_input.value = "" return } var char = cursor_input.value cursor_input.value = "" // console.log("input:", char) if (current_tool.name != "text") { brush.char = char if (char == " ") { brush.bg = brush.fg } else if (brush.bg != fillColor) { brush.fg = brush.bg brush.bg = fillColor } brush.rebuild() } if (focused && char) { var y = focused.y, x = focused.x var moving = focused.key(char, e.keyCode) if ( ! moving || ! ('y' in focused && 'x' in focused) ) { return } // console.log(y, direction[0], x, direction[1]) current_canvas.focusLex(y + direction[0], x + direction[1]) } }) cursor_input.addEventListener("keyup", function(e){ if (! e.altKey) { document.body.classList.remove("dropper") } }) } keys.int_key = function (f) { return function (key, keyCode) { var n = parseInt(key) ! isNaN(n) && f(n) } } keys.arrow_key = function (lex, canvas, prop, rebuild_prop, min, max) { return function (e){ switch (e.keyCode) { case 38: // up e.preventDefault() canvas[prop] = Math.min(canvas[prop]+1, max) lex.char = "" + canvas[prop] lex.build() canvas[rebuild_prop]() break case 40: // down e.preventDefault() canvas[prop] = Math.max(canvas[prop]-1, min) lex.char = "" + canvas[prop] lex.build() canvas[rebuild_prop]() break } } } keys.single_numeral_key = function (lex, canvas, prop, min, max) { return keys.int_key(function(n, keyCode){ if (n == 0) n = 10 lex.blur() lex.char = ""+n lex.build() canvas[prop] = n canvas.rebuild() }) } keys.multi_numeral_key = function (lex, digits){ return keys.int_key(function(n, keyCode){ lex.read() if (lex.char.length < digits) { n = parseInt(lex.char) * 10 + n } lex.char = ""+n lex.build() }) } keys.multi_numeral_blur = function (lex, canvas, prop, min, max){ return function(){ var current = parseInt(lex.char) var n = clamp(current, min, max) if (! n || isNaN(current)) return lex.char = n+"" lex.build() canvas[prop] = n canvas.resize(canvas.w, canvas.h) } } return keys })() function check_if_lost_focus() { if (! focused || ! focused.span) focused = canvas.aa[0][0] }