2018-10-24 11:14:46 -04:00
|
|
|
var keys = (function(){
|
|
|
|
|
|
|
|
var keys = {}
|
|
|
|
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: // backspace
|
|
|
|
e.preventDefault()
|
|
|
|
if (current_canvas === canvas)
|
|
|
|
undo.new()
|
|
|
|
current_canvas.focus_add(-1, 0)
|
|
|
|
if (current_canvas === canvas)
|
|
|
|
undo.save_focused_lex()
|
|
|
|
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.focus_add(0, -1)
|
|
|
|
break
|
|
|
|
case 40: // down
|
|
|
|
e.preventDefault()
|
|
|
|
current_canvas.focus_add(0, 1)
|
|
|
|
break
|
|
|
|
case 37: // left
|
|
|
|
e.preventDefault()
|
|
|
|
current_canvas.focus_add(-1, 0)
|
|
|
|
break
|
|
|
|
case 39: // right
|
|
|
|
e.preventDefault()
|
|
|
|
current_canvas.focus_add(1, 0)
|
|
|
|
break
|
|
|
|
// use typical windows and os x shortcuts
|
|
|
|
// undo: ctrl-z or cmd-z
|
|
|
|
// redo: ctrl-y or shift-cmd-z
|
|
|
|
case 89: // y
|
|
|
|
if (!e.ctrlKey && !e.metaKey) break;
|
|
|
|
e.preventDefault();
|
|
|
|
undo.redo();
|
|
|
|
break
|
|
|
|
case 90: // z
|
|
|
|
if (!e.ctrlKey && !e.metaKey) break;
|
|
|
|
e.preventDefault();
|
|
|
|
if (e.shiftKey)
|
|
|
|
undo.redo();
|
|
|
|
else
|
2018-11-24 02:49:02 -05:00
|
|
|
undo.undo();
|
2018-10-24 11:14:46 -04:00
|
|
|
break
|
|
|
|
// default:
|
|
|
|
// if (focused) { focused.key(undefined, e.keyCode) }
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
cursor_input.addEventListener('input', function(e){
|
|
|
|
/*
|
|
|
|
if (! e.metaKey && ! e.ctrlKey && ! e.altKey) {
|
|
|
|
e.preventDefault()
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
var char = cursor_input.value
|
|
|
|
cursor_input.value = ""
|
|
|
|
|
|
|
|
// console.log("input:", char)
|
2018-11-24 02:49:02 -05:00
|
|
|
|
2018-10-24 11:14:46 -04:00
|
|
|
if (current_tool.name != "text" && ! brush.modified) {
|
|
|
|
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
|
|
|
|
if (current_canvas === canvas){
|
|
|
|
undo.new()
|
|
|
|
undo.save_focused_lex()
|
|
|
|
}
|
|
|
|
var moving = focused.key(char, e.keyCode)
|
|
|
|
if ( ! moving || ! ('y' in focused && 'x' in focused) ) { return }
|
|
|
|
current_canvas.focus_add(1, 0)
|
|
|
|
}
|
|
|
|
})
|
2018-11-24 02:49:02 -05:00
|
|
|
|
2018-10-24 11:14:46 -04:00
|
|
|
cursor_input.addEventListener("keyup", function(e){
|
|
|
|
if (! e.altKey) {
|
|
|
|
document.body.classList.remove("dropper")
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2018-11-24 02:49:02 -05:00
|
|
|
|
2018-10-24 11:14:46 -04:00
|
|
|
keys.int_key = function (f) {
|
|
|
|
return function (key, keyCode) {
|
|
|
|
var n = parseInt(key)
|
|
|
|
! isNaN(n) && f(n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
keys.arrow_key = function (fn) {
|
|
|
|
return function (e){
|
|
|
|
switch (e.keyCode) {
|
|
|
|
case 38: // up
|
|
|
|
e.preventDefault()
|
|
|
|
fn(1)
|
|
|
|
break
|
|
|
|
case 40: // down
|
|
|
|
e.preventDefault()
|
|
|
|
fn(-1)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
keys.left_right_key = function (fn) {
|
|
|
|
return function (e){
|
|
|
|
switch (e.keyCode) {
|
|
|
|
case 39: // right
|
|
|
|
e.preventDefault()
|
|
|
|
fn(1)
|
|
|
|
break
|
|
|
|
case 38: // up
|
|
|
|
case 40: // down
|
|
|
|
e.preventDefault()
|
|
|
|
fn(0)
|
|
|
|
break
|
|
|
|
case 37: // left
|
|
|
|
e.preventDefault()
|
|
|
|
fn(-1)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
keys.single_numeral_key = function (lex, fn) {
|
|
|
|
return keys.int_key(function(n, keyCode){
|
|
|
|
if (n == 0) n = 10
|
|
|
|
lex.blur()
|
|
|
|
fn(n)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
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, fn){
|
|
|
|
return function(){
|
|
|
|
var n = parseInt(lex.char)
|
|
|
|
if (isNaN(n)) return
|
|
|
|
fn(n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return keys
|
|
|
|
})()
|
|
|
|
|
|
|
|
function check_if_lost_focus() {
|
|
|
|
if (! window.focused || ! window.focused.span)
|
|
|
|
window.focused = canvas.aa[0][0]
|
|
|
|
}
|