rewritten the keyboard handler, now it is configurable in runtime...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2012-08-08 23:19:40 +04:00
parent 4b48da396c
commit d88cc717bd
4 changed files with 146 additions and 121 deletions

View File

@ -34,10 +34,13 @@ body {
<!-- XXX STUB -->
<script src="images.js"></script>
<script src="gallery-prototype.js"></script>
<script src="ui.js"></script>
<script src="markers.js"></script>
<!-- keep this after anything it uses -->
<script src="keybindings.js"></script>
<!--script src="gallery.js"></script-->
<script>

View File

@ -1,55 +1,6 @@
// XXX need a uniform way to address images (filename?)
/******************************************* Setup Data and Globals **/
// key configuration...
// XXX need to make this handle modifiers gracefully...
var keys = {
toggleHelp: [72], // ???
toggleSingleImageMode: [70, 13], // f, Enter
toggleSingleImageModeTransitions: [84], // t
toggleTransitions: [65], // a
toggleBackgroundModes: [66], // b
toggleControls: [9], // tab
close: [27, 88, 67], // ???
// zooming...
zoomIn: [187], // +
zoomOut: [189], // -
// zoom presets...
fitOne: [49], // 1
fitThree: [51], // 3
// XXX is this relivant?
zoomOriginal: [48], // 0
first: [36], // Home
last: [35], // End
previous: [37, 80, 188, 8], // Left, BkSp, p, <
next: [39, 78, 190, 32], // Right, Space, n, >
// these work with ctrl and shift modifiers...
down: [40], // Down
up: [38], // Up
// these work with ctrl modifier...
promote: [45], // ???
demote: [46], // ???
// XXX should these be s-up, s-down, ... ??
moveViewUp: [75], // k
moveViewDown: [74], // j
moveViewLeft: [72], // h
moveViewRight: [76], // l
centerCurrentImage: [79], // o
toggleMarkers: [77], // m
// keys to be ignored...
ignore: [16, 17, 18], // ???, ???, ???
// print unhandled keys...
helpShowOnUnknownKey: true
}
// the list of style modes...
// these are swithched through in order by toggleBackgroundModes()
var BACKGROUND_MODES = [
@ -243,7 +194,8 @@ function setupEvents(){
})
// keyboard...
$(document)
.keydown(handleKeys)
.keydown(makeKeyboardHandler(keybindings, function(k){alert(k)}))
//.keydown(handleKeys)
// swipe...
$('.viewer')
.swipe({
@ -353,77 +305,67 @@ function alignRibbons(){
// XXX revise...
function handleKeys(event){
var code = event.keyCode, fn = $.inArray;
var _ = (fn(code, keys.close) >= 0) ? function(){}()
: (fn(code, keys.first) >= 0) ? firstImage()
: (fn(code, keys.next) >= 0) ? nextImage()
: (fn(code, keys.previous) >= 0) ? prevImage()
: (fn(code, keys.last) >= 0) ? lastImage()
: (fn(code, keys.promote) >= 0) ? function(){
if(event.ctrlKey){
createRibbon('next')
// XXX we essentially need three things:
// - keycodes, including modifier keys
// - function
// - meta information...
/*
* Basic key format:
* <key-code> : <callback>,
* <key-code> : {
* default: [<callback>, <doc>],
* // a modifier can be any single modifier, like shift or a
* // combination of modifers like 'ctrl+shift', given in order
* // of priority.
* // supported modifiers are (in order of priority):
* // - ctrl
* // - alt
* // - shift
* <modifer>: [...]
* },
* // alias...
* <key-code-a> : <key-code-b>,
*/
function makeKeyboardHandler(keybindings, unhandled){
if(unhandled == null){
unhandled = function(){return false}
}
console.log(keybindings)
return function(evt){
var key = evt.keyCode
// XXX ugly...
var modifers = evt.ctrlKey ? 'ctrl' : ''
modifers += evt.altKey ? (modifers != '' ? '+alt' : 'alt') : ''
modifers += evt.shiftKey ? (modifers != '' ? '+shift' : 'shift') : ''
var handler = keybindings[key]
// alias...
while (typeof(handler) == typeof(123)) {
handler = keybindings[handler]
}
// no handler...
if(handler == null){
return unhandled(key)
}
// complex handler...
if(typeof(handler) == typeof({})){
var callback = handler[modifers]
if(callback == null){
callback = handler['default']
}
shiftImageDown()
}()
: (fn(code, keys.demote) >= 0) ? function(){
if(event.ctrlKey){
createRibbon('prev')
if(callback != null){
callback()
return false
}
shiftImageUp()
}()
: (fn(code, keys.down) >= 0) ? function(){
if(event.shiftKey){
if(event.ctrlKey){
createRibbon('next')
}
shiftImageDown()
} else {
focusBelowRibbon()
}
}()
: (fn(code, keys.up) >= 0) ? function(){
if(event.shiftKey){
if(event.ctrlKey){
createRibbon('prev')
}
shiftImageUp()
} else {
focusAboveRibbon()
}
}()
// zooming...
: (fn(code, keys.zoomIn) >= 0) ? scaleContainerBy(ZOOM_FACTOR)
: (fn(code, keys.zoomOut) >= 0) ? scaleContainerBy(1/ZOOM_FACTOR)
// zoom presets...
: (fn(code, keys.zoomOriginal) >= 0) ? setContainerScale(1)
: (fn(code, keys.fitOne) >= 0) ? fitImage()
: (fn(code, keys.fitThree) >= 0) ? fitThreeImages()
// moving view...
: (fn(code, keys.moveViewUp) >= 0) ? moveViewUp()
: (fn(code, keys.moveViewDown) >= 0) ? moveViewDown()
: (fn(code, keys.moveViewLeft) >= 0) ? moveViewLeft()
: (fn(code, keys.moveViewRight) >= 0) ? moveViewRight()
: (fn(code, keys.centerCurrentImage) >= 0) ? centerCurrentImage()
: (fn(code, keys.toggleSingleImageMode) >= 0) ? toggleSingleImageMode()
: (fn(code, keys.toggleSingleImageModeTransitions) >= 0) ? toggleSingleImageModeTransitions()
: (fn(code, keys.toggleTransitions) >= 0) ? toggleTransitions()
: (fn(code, keys.toggleBackgroundModes) >= 0) ? toggleBackgroundModes()
: (fn(code, keys.toggleControls) >= 0) ? toggleControls()
// debug...
: (fn(code, keys.toggleMarkers) >= 0) ? toggleMarkers()
: (fn(code, keys.ignore) >= 0) ? false
: (keys.helpShowOnUnknownKey) ? function(){alert(code)}()
: false;
return false;
} else {
// callback...
handler()
return false
}
return unhandled(key)
}
}
@ -444,6 +386,7 @@ var ORIGINAL_FIELD_SCALE = 1
var NORMAL_MODE_BG = null
var SINGLE_IMAGE_MODE_BG = BACKGROUND_MODES[BACKGROUND_MODES.length-1]
var toggleSingleImageMode = createCSSClassToggler('.viewer', 'single-image-mode',
// pre...
function(action){

View File

@ -31,10 +31,12 @@ body {
<!-- XXX STUB -->
<script src="images.js"></script>
<script src="gallery-prototype.js"></script>
<script src="ui.js"></script>
<script src="markers.js"></script>
<!-- keep this after anything it uses -->
<script src="keybindings.js"></script>
<!--script src="gallery.js"></script-->
<script>

77
ui/keybindings.js Executable file
View File

@ -0,0 +1,77 @@
var keybindings = {
//72: toggleHelp, // ???
70: toggleSingleImageMode, // f
13: 70, // Enter
84: toggleSingleImageModeTransitions, // t
65: toggleTransitions, // a
66: toggleBackgroundModes, // b
9: toggleControls, // tab
77: toggleMarkers, // m
// zooming...
187: function(){scaleContainerBy(ZOOM_FACTOR)}, // +
189: function(){scaleContainerBy(1/ZOOM_FACTOR)}, // -
// zoom presets...
48: {
'default': fitImage, // 0
'ctrl': function(){setContainerScale(1)}, // ctrl+0
},
51: fitThreeImages, // 3
36: firstImage, // Home
35: lastImage, // End
37: prevImage, // Left
80: 37, // BkSp
188: 37, // p
8: 37, // <
39: nextImage, // Right
32: 39, // Space
190: 39, // m
78: 39, // >
// these work with ctrl and shift modifiers...
40: {
'default': focusBelowRibbon, // Down
'shift': shiftImageDown, // shift-Down
'ctrl+shift': function(){ // ctrl-shift-Down
createRibbon('next')
shiftImageDown()
}
}, // Down
38: {
'default': focusAboveRibbon, // Up
'shift': shiftImageUp, // shift-Up
'ctrl+shift': function(){ // ctrl-shift-Up
createRibbon('prev')
shiftImageUp()
}
},
// XXX should these be s-up, s-down, ... ??
75: moveViewUp, // k
74: moveViewDown, // j
72: moveViewLeft, // h
76: moveViewRight, // l
79: centerCurrentImage, // o
// ignore the modifiers...
16: function(){},
17: 16,
18: 16,
}
/*
close: [27, 88, 67], // ???
// these work with ctrl modifier...
promote: [45], // ???
demote: [46], // ???
// print unhandled keys...
helpShowOnUnknownKey: true
*/
// vim:set ts=4 sw=4 nowrap :