mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
started leanup...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
ebb3fcdc39
commit
664743a975
@ -10,7 +10,8 @@
|
|||||||
var actions = require('lib/actions')
|
var actions = require('lib/actions')
|
||||||
var features = require('lib/features')
|
var features = require('lib/features')
|
||||||
var toggler = require('lib/toggler')
|
var toggler = require('lib/toggler')
|
||||||
var keyboard = require('lib/keyboard')
|
// XXX
|
||||||
|
var keyboard = require('lib/keyboard2')
|
||||||
|
|
||||||
var core = require('features/core')
|
var core = require('features/core')
|
||||||
var widgets = require('features/ui-widgets')
|
var widgets = require('features/ui-widgets')
|
||||||
@ -24,393 +25,7 @@ var drawer = require('lib/widget/drawer')
|
|||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
// helper...
|
|
||||||
function customScale(n){
|
|
||||||
return {
|
|
||||||
default: 'fitCustom: '+n+' -- Set cutom image size',
|
|
||||||
'alt': 'setCustomSize: '+n+' -- Set current image size as custom',
|
|
||||||
'ctrl+shift': 'setCustomSize: '+n+' null -- Clear custom image size',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// XXX might be a good idea to be able ignore actions rather than keys...
|
|
||||||
// XXX add this to the global doc...
|
|
||||||
var GLOBAL_KEYBOARD =
|
var GLOBAL_KEYBOARD =
|
||||||
window.GLOBAL_KEYBOARD =
|
|
||||||
module.GLOBAL_KEYBOARD = {
|
|
||||||
'Global': {
|
|
||||||
doc: 'Global bindings that take priority over other sections.',
|
|
||||||
pattern: '*',
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
'Slideshow': {
|
|
||||||
pattern: '.slideshow-running',
|
|
||||||
ignore: [
|
|
||||||
'Esc',
|
|
||||||
'Up', 'Down', 'Enter',
|
|
||||||
'R', 'L', 'G', 'T',
|
|
||||||
],
|
|
||||||
|
|
||||||
Esc: 'toggleSlideshow: "off" -- Exit slideshow',
|
|
||||||
Enter: 'slideshowDialog',
|
|
||||||
|
|
||||||
Left: 'resetSlideshowTimer',
|
|
||||||
Right: 'resetSlideshowTimer',
|
|
||||||
Home: 'resetSlideshowTimer',
|
|
||||||
End: 'resetSlideshowTimer',
|
|
||||||
|
|
||||||
T: 'slideshowIntervalDialog',
|
|
||||||
R: 'toggleSlideshowDirection',
|
|
||||||
L: 'toggleSlideshowLooping',
|
|
||||||
},
|
|
||||||
|
|
||||||
// XXX do we need to prevent up/down navigation here, it may get confusing?
|
|
||||||
// XXX do we need to disable fast sorting here???
|
|
||||||
'Single Image': {
|
|
||||||
pattern: '.single-image-mode',
|
|
||||||
ignore: [
|
|
||||||
'Esc',
|
|
||||||
|
|
||||||
// do not crop in single image mode...
|
|
||||||
'C', 'F2',
|
|
||||||
|
|
||||||
// zooming...
|
|
||||||
'#0', '#1', '#2', '#3', '#4', '#5', '#6', '#7', '#8', '#9',
|
|
||||||
],
|
|
||||||
|
|
||||||
|
|
||||||
// NOTE: these are here so as to enable handling via the next
|
|
||||||
// block, i.e. the Viewer
|
|
||||||
// ...if not given, then the ignore above will shadow the
|
|
||||||
// keys...
|
|
||||||
// NOTE: the 'nop' action does not exist, this it will get ignored
|
|
||||||
'(': 'nop',
|
|
||||||
')': 'nop',
|
|
||||||
|
|
||||||
// zooming...
|
|
||||||
'#1': 'fitScreen',
|
|
||||||
// XXX should these also be implemented in the same way as 4-9???
|
|
||||||
'#2': {
|
|
||||||
default: 'fitNormal',
|
|
||||||
'alt': 'setNormalScale -- Set current image size as normal',
|
|
||||||
'ctrl+shift': 'setNormalScale: null -- Reset normal image size to default',
|
|
||||||
},
|
|
||||||
'#3': {
|
|
||||||
default: 'fitSmall',
|
|
||||||
'alt': 'setSmallScale -- Set current image size as small',
|
|
||||||
'ctrl+shift': 'setSmallScale: null -- Reset small image size to default',
|
|
||||||
},
|
|
||||||
'#4': customScale(4),
|
|
||||||
'#5': customScale(5),
|
|
||||||
'#6': customScale(6),
|
|
||||||
'#7': customScale(7),
|
|
||||||
'#8': customScale(8),
|
|
||||||
'#9': customScale(9),
|
|
||||||
'#0': customScale(0),
|
|
||||||
|
|
||||||
|
|
||||||
Esc: 'toggleSingleImage: "off" -- Exit single image view',
|
|
||||||
|
|
||||||
// ignore sorting and reversing...
|
|
||||||
// XXX not sure about these yet, especially reversing...
|
|
||||||
R: {
|
|
||||||
shift: 'IGNORE',
|
|
||||||
},
|
|
||||||
S: {
|
|
||||||
shift: 'IGNORE',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
// XXX add "save as collection..."
|
|
||||||
'Cropped': {
|
|
||||||
pattern: '.crop-mode',
|
|
||||||
|
|
||||||
Esc: {
|
|
||||||
default: 'uncrop',
|
|
||||||
ctrl: 'uncropAll',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
'Range': {
|
|
||||||
doc: 'Range editing',
|
|
||||||
pattern: '.brace',
|
|
||||||
|
|
||||||
// XXX add:
|
|
||||||
// - range navigation
|
|
||||||
// - range manipulation
|
|
||||||
|
|
||||||
Esc: 'clearRange',
|
|
||||||
},
|
|
||||||
|
|
||||||
// XXX add "save as collection..." (???)
|
|
||||||
// XXX cleanup...
|
|
||||||
'Viewer': {
|
|
||||||
doc: 'NOTE: binding priority is the same as the order of sections '+
|
|
||||||
'on this page.',
|
|
||||||
pattern: '*',
|
|
||||||
|
|
||||||
X: {
|
|
||||||
alt: 'close',
|
|
||||||
},
|
|
||||||
|
|
||||||
F4: {
|
|
||||||
alt: 'close',
|
|
||||||
},
|
|
||||||
Q: {
|
|
||||||
meta: 'close',
|
|
||||||
},
|
|
||||||
// XXX
|
|
||||||
F5: keyboard.doc('Full reload viewer',
|
|
||||||
function(){
|
|
||||||
//a.stop()
|
|
||||||
/*
|
|
||||||
killAllWorkers()
|
|
||||||
.done(function(){
|
|
||||||
reload()
|
|
||||||
})
|
|
||||||
*/
|
|
||||||
location.reload()
|
|
||||||
return false
|
|
||||||
}),
|
|
||||||
F12: 'showDevTools',
|
|
||||||
// NOTE: these are for systems where F** keys are not available
|
|
||||||
// or do other stuff...
|
|
||||||
R: {
|
|
||||||
default: 'rotateCW',
|
|
||||||
shift: 'reverseImages',
|
|
||||||
ctrl: 'loadNewImages!',
|
|
||||||
alt: 'browseActions: "/Ribbon/" -- Open ribbon menu',
|
|
||||||
'ctrl+alt': 'reload!',
|
|
||||||
'ctrl+shift': 'F5',
|
|
||||||
},
|
|
||||||
L: 'rotateCCW',
|
|
||||||
H: {
|
|
||||||
default: 'flipHorizontal',
|
|
||||||
ctrl: 'listURLHistory',
|
|
||||||
'ctrl+shift': 'listSaveHistory',
|
|
||||||
alt: 'browseActions: "/History/" -- Open history menu',
|
|
||||||
},
|
|
||||||
V: 'flipVertical',
|
|
||||||
|
|
||||||
// tilt...
|
|
||||||
// XXX experimental, not sure if wee need this with a keyboard...
|
|
||||||
T: {
|
|
||||||
default: 'rotateRibbonCCW -- Tilt ribbons counter clock wise',
|
|
||||||
shift: 'rotateRibbonCW -- Tilt ribbons clock wise',
|
|
||||||
|
|
||||||
alt: 'resetRibbonRotation -- Reset ribbon tilt',
|
|
||||||
},
|
|
||||||
|
|
||||||
P: {
|
|
||||||
'ctrl+shift': 'F12',
|
|
||||||
},
|
|
||||||
|
|
||||||
// NOTE: this is handled by the wrapper at this point, so we do
|
|
||||||
// not have to do anything here...
|
|
||||||
F11: 'toggleFullScreen',
|
|
||||||
F: {
|
|
||||||
ctrl: 'F11',
|
|
||||||
meta: 'F11',
|
|
||||||
},
|
|
||||||
|
|
||||||
// XXX testing...
|
|
||||||
|
|
||||||
Enter: 'toggleSingleImage',
|
|
||||||
|
|
||||||
Home: {
|
|
||||||
default: 'firstImage',
|
|
||||||
ctrl: 'firstGlobalImage',
|
|
||||||
shift: 'firstRibbon',
|
|
||||||
},
|
|
||||||
End: {
|
|
||||||
default: 'lastImage',
|
|
||||||
ctrl: 'lastGlobalImage',
|
|
||||||
shift: 'lastRibbon',
|
|
||||||
},
|
|
||||||
Left: {
|
|
||||||
default: 'prevImage',
|
|
||||||
alt: 'shiftImageLeft!',
|
|
||||||
ctrl: 'prevScreen',
|
|
||||||
// XXX need to prevent default on mac + browser...
|
|
||||||
meta: 'prevScreen',
|
|
||||||
},
|
|
||||||
PgUp: 'prevScreen',
|
|
||||||
PgDown: 'nextScreen',
|
|
||||||
Right: {
|
|
||||||
default: 'nextImage',
|
|
||||||
alt: 'shiftImageRight!',
|
|
||||||
ctrl: 'nextScreen',
|
|
||||||
// XXX need to prevent default on mac + browser...
|
|
||||||
meta: 'nextScreen',
|
|
||||||
},
|
|
||||||
Space: 'Right',
|
|
||||||
Backspace: 'Left',
|
|
||||||
'(': 'prevImageInOrder',
|
|
||||||
')': 'nextImageInOrder',
|
|
||||||
',': 'prevMarked',
|
|
||||||
'.': 'nextMarked',
|
|
||||||
'[': {
|
|
||||||
default: 'prevBookmarked',
|
|
||||||
// XXX experimental
|
|
||||||
shift: 'openRange',
|
|
||||||
},
|
|
||||||
']': {
|
|
||||||
default: 'nextBookmarked',
|
|
||||||
// XXX experimental
|
|
||||||
shift: 'closeRange',
|
|
||||||
},
|
|
||||||
Up: {
|
|
||||||
default: 'prevRibbon',
|
|
||||||
shift: 'shiftImageUp',
|
|
||||||
'alt+shift': 'travelImageUp',
|
|
||||||
'ctrl+shift': 'shiftImageUpNewRibbon',
|
|
||||||
},
|
|
||||||
Down: {
|
|
||||||
default: 'nextRibbon',
|
|
||||||
shift: 'shiftImageDown',
|
|
||||||
'alt+shift': 'travelImageDown',
|
|
||||||
'ctrl+shift': 'shiftImageDownNewRibbon',
|
|
||||||
},
|
|
||||||
|
|
||||||
'#0': 'fitMax',
|
|
||||||
'#1': {
|
|
||||||
default: 'fitImage',
|
|
||||||
shift: 'fitRibbon',
|
|
||||||
ctrl: 'fitOrig!',
|
|
||||||
},
|
|
||||||
'#2': 'fitImage: 2 -- Fit 2 Images',
|
|
||||||
'#3': {
|
|
||||||
default: 'fitImage: 3 -- Fit 3 images',
|
|
||||||
shift: 'fitRibbon: 3.5 -- Fit 3.5 ribbons',
|
|
||||||
},
|
|
||||||
'#4': 'fitImage: 4 -- Fit 4 images',
|
|
||||||
'#5': {
|
|
||||||
default: 'fitImage: 5 -- Fit 5 images',
|
|
||||||
shift: 'fitRibbon: 5.5 -- Fit 5.5 ribbons',
|
|
||||||
},
|
|
||||||
'#6': 'fitImage: 6 -- Fit 6 images',
|
|
||||||
'#7': 'fitImage: 7 -- Fit 7 images',
|
|
||||||
'#8':'fitImage: 8 -- Fit 8 images',
|
|
||||||
'#9': 'fitImage: 9 -- Fit 9 images',
|
|
||||||
|
|
||||||
'+': {
|
|
||||||
default: 'zoomIn',
|
|
||||||
ctrl: 'lighterTheme!',
|
|
||||||
},
|
|
||||||
'=': '+',
|
|
||||||
'-': {
|
|
||||||
default: 'zoomOut',
|
|
||||||
ctrl: 'darkerTheme!',
|
|
||||||
},
|
|
||||||
|
|
||||||
F2: {
|
|
||||||
default: 'cropRibbon',
|
|
||||||
shift: 'cropRibbonAndAbove',
|
|
||||||
ctrl: 'cropMarked',
|
|
||||||
alt: 'cropBookmarked',
|
|
||||||
},
|
|
||||||
|
|
||||||
// marking...
|
|
||||||
M: {
|
|
||||||
default: 'toggleMark',
|
|
||||||
alt: 'browseActions: "/Mark/" -- Show mark menu',
|
|
||||||
},
|
|
||||||
A: {
|
|
||||||
alt: 'browseActions',
|
|
||||||
'alt+shift': 'listActions',
|
|
||||||
|
|
||||||
ctrl: 'toggleMark!: "ribbon" "on" -- Mark all images in ribbon',
|
|
||||||
},
|
|
||||||
D: {
|
|
||||||
ctrl: 'toggleMark!: "ribbon" "off" -- Unmark all images in ribbon',
|
|
||||||
},
|
|
||||||
I: {
|
|
||||||
default: 'showMetadata',
|
|
||||||
alt: 'browseActions: "/Image/" -- Show image menu',
|
|
||||||
shift: 'toggleStatusBar',
|
|
||||||
|
|
||||||
ctrl: 'toggleMark!: "ribbon" -- Invert marks in ribbon',
|
|
||||||
'ctrl+shift': 'showMetadata: "current" "full" -- Show full metadata',
|
|
||||||
|
|
||||||
'meta+alt': 'showDevTools',
|
|
||||||
},
|
|
||||||
// XXX experimental...
|
|
||||||
'*': 'setRangeBorder',
|
|
||||||
|
|
||||||
B: {
|
|
||||||
default: 'toggleBookmark',
|
|
||||||
ctrl: 'toggleTheme!',
|
|
||||||
'ctrl+shift': 'toggleTheme!: "prev"',
|
|
||||||
|
|
||||||
alt: 'browseActions: "/Bookmark/" -- Show bookmark menu',
|
|
||||||
|
|
||||||
// XXX not sure if this is the right way to go...
|
|
||||||
shift: 'setBaseRibbon',
|
|
||||||
},
|
|
||||||
E: {
|
|
||||||
default: 'openInExtenalEditor',
|
|
||||||
shift: 'openInExtenalEditor: 1 -- Open in alternative editor',
|
|
||||||
alt: 'listExtenalEditors',
|
|
||||||
},
|
|
||||||
C: {
|
|
||||||
default: 'browseActions: "/Crop/" -- Show crop menu',
|
|
||||||
// do the default copy thing...
|
|
||||||
// NOTE: this stops the default: handler from getting the ctrl:
|
|
||||||
// key case...
|
|
||||||
ctrl: '',
|
|
||||||
},
|
|
||||||
O: 'browsePath',
|
|
||||||
S: {
|
|
||||||
default: 'slideshowDialog',
|
|
||||||
//shift: 'sortImages: "Date" -- Sort images by date',
|
|
||||||
shift: 'sortImages -- Sort images',
|
|
||||||
//alt: 'browseActions: "/Sort/"',
|
|
||||||
alt: 'sortDialog',
|
|
||||||
// XXX need to make this save to base_path if it exists and
|
|
||||||
// ask the user if it does not... now it always asks.
|
|
||||||
ctrl: 'saveIndexHere',
|
|
||||||
'ctrl+shift': 'exportDialog',
|
|
||||||
},
|
|
||||||
|
|
||||||
// XXX still experimental...
|
|
||||||
U: {
|
|
||||||
default: 'undo',
|
|
||||||
shift: 'redo',
|
|
||||||
},
|
|
||||||
Z: {
|
|
||||||
ctrl: 'undo',
|
|
||||||
'ctrl+shift': 'redo',
|
|
||||||
},
|
|
||||||
|
|
||||||
G: {
|
|
||||||
default: 'editStatusBarIndex!',
|
|
||||||
shift: 'toggleStatusBarIndexMode!',
|
|
||||||
|
|
||||||
// XXX for debug...
|
|
||||||
//ctrl: function(){ $('.viewer').toggleClass('visible-gid') },
|
|
||||||
},
|
|
||||||
|
|
||||||
'?': 'showKeyboardBindings',
|
|
||||||
|
|
||||||
W: 'testAction',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
|
||||||
// + simpler to group bindings
|
|
||||||
// - harder to automate binding creation (e.g. via customScale(..))
|
|
||||||
|
|
||||||
var keyboard2 = require('lib/keyboard2')
|
|
||||||
|
|
||||||
|
|
||||||
// XXX do we want to add sub-sections to better organize keys for
|
|
||||||
// documentation???
|
|
||||||
var GLOBAL_KEYBOARD2 =
|
|
||||||
window.GLOBAL_KEYBOARD2 =
|
|
||||||
module.GLOBAL_KEYBOARD2 = {
|
module.GLOBAL_KEYBOARD2 = {
|
||||||
'Global': {
|
'Global': {
|
||||||
doc: 'Global bindings that take priority over other sections.',
|
doc: 'Global bindings that take priority over other sections.',
|
||||||
@ -770,10 +385,17 @@ module.GLOBAL_KEYBOARD2 = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
keyboard = keyboard2
|
//---------------------------------------------------------------------
|
||||||
GLOBAL_KEYBOARD = GLOBAL_KEYBOARD2
|
|
||||||
|
// XXX DEBUG: remove when done...
|
||||||
|
window.kb = keyboard.Keyboard(
|
||||||
|
GLOBAL_KEYBOARD,
|
||||||
|
function checkGlobalMode(mode, keyboard, context){
|
||||||
|
var pattern = keyboard[mode].pattern
|
||||||
|
return !pattern
|
||||||
|
|| pattern == '*'
|
||||||
|
|| $(keyboard[mode].pattern).length > 0 })
|
||||||
|
|
||||||
window.kb = keyboard2.Keyboard(GLOBAL_KEYBOARD2, keyboard2.checkGlobalMode)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -979,6 +601,7 @@ var KeyboardActions = actions.Actions({
|
|||||||
}],
|
}],
|
||||||
|
|
||||||
|
|
||||||
|
// XXX move to gen2
|
||||||
// XXX need to pre-process the docs...
|
// XXX need to pre-process the docs...
|
||||||
// - remove the path component...
|
// - remove the path component...
|
||||||
// - insert the action name where not doc present...
|
// - insert the action name where not doc present...
|
||||||
@ -1013,13 +636,6 @@ var KeyboardActions = actions.Actions({
|
|||||||
// <list of keys>
|
// <list of keys>
|
||||||
// new
|
// new
|
||||||
// XXX BUG sections with doc do not show up in title...
|
// XXX BUG sections with doc do not show up in title...
|
||||||
// XXX BUG:
|
|
||||||
// ig.bindKey('Global', 'X', 'editKeyboardBindings')
|
|
||||||
// ig.editKeyboardBindings()
|
|
||||||
// -> shows alt-X instead of X
|
|
||||||
// ig.bindKey('Global', 'X', 'editKeyboardBindings')
|
|
||||||
// ig.editKeyboardBindings()
|
|
||||||
// -> shows two keys ctrl-Z and ctrl-shift-Z instead of Z
|
|
||||||
// XXX sub-group by path (???)
|
// XXX sub-group by path (???)
|
||||||
browseKeyboardBindings: ['Interface/Keyboard bindings...',
|
browseKeyboardBindings: ['Interface/Keyboard bindings...',
|
||||||
widgets.makeUIDialog(function(path, edit){
|
widgets.makeUIDialog(function(path, edit){
|
||||||
|
|||||||
@ -125,7 +125,7 @@ function doc(text, func){
|
|||||||
// - non-nested arrays or objects
|
// - non-nested arrays or objects
|
||||||
//
|
//
|
||||||
// XXX should this be here???
|
// XXX should this be here???
|
||||||
// XXX add support for suffix to return false...
|
// XXX add support for suffix to return false / stop_propagation...
|
||||||
var parseActionCall =
|
var parseActionCall =
|
||||||
module.parseActionCall =
|
module.parseActionCall =
|
||||||
function parseActionCall(txt){
|
function parseActionCall(txt){
|
||||||
@ -151,7 +151,8 @@ function parseActionCall(txt){
|
|||||||
action: action,
|
action: action,
|
||||||
arguments: args,
|
arguments: args,
|
||||||
doc: doc,
|
doc: doc,
|
||||||
'no-default': no_default,
|
no_default: no_default,
|
||||||
|
stop_propagation: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,6 +161,7 @@ function parseActionCall(txt){
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Helpers...
|
// Helpers...
|
||||||
|
|
||||||
|
// Form standard key string from keyboard event...
|
||||||
var event2key =
|
var event2key =
|
||||||
module.event2key =
|
module.event2key =
|
||||||
function event2key(evt){
|
function event2key(evt){
|
||||||
@ -176,6 +178,7 @@ function event2key(evt){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Get key code from key name...
|
||||||
var key2code =
|
var key2code =
|
||||||
module.key2code =
|
module.key2code =
|
||||||
function key2code(key){
|
function key2code(key){
|
||||||
@ -184,6 +187,7 @@ function key2code(key){
|
|||||||
: key.charCodeAt(0) }
|
: key.charCodeAt(0) }
|
||||||
|
|
||||||
|
|
||||||
|
// Get key name from key code...
|
||||||
var code2key =
|
var code2key =
|
||||||
module.code2key =
|
module.code2key =
|
||||||
function code2key(code){
|
function code2key(code){
|
||||||
@ -193,6 +197,7 @@ function code2key(code){
|
|||||||
: null }
|
: null }
|
||||||
|
|
||||||
|
|
||||||
|
// Check if string is a standard key string...
|
||||||
var isKey =
|
var isKey =
|
||||||
module.isKey =
|
module.isKey =
|
||||||
function isKey(key){
|
function isKey(key){
|
||||||
@ -208,6 +213,11 @@ function isKey(key){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Split key...
|
||||||
|
//
|
||||||
|
// NOTE: if this gets an array, it will get returned as-is...
|
||||||
|
// NOTE: no checks are made on the key, use isKey(..) in conjunction
|
||||||
|
// with normalizeKey(..) for checking...
|
||||||
var splitKey =
|
var splitKey =
|
||||||
module.splitKey =
|
module.splitKey =
|
||||||
function splitKey(key){
|
function splitKey(key){
|
||||||
@ -222,7 +232,9 @@ function splitKey(key){
|
|||||||
.filter(function(c){ return c != '' }) }
|
.filter(function(c){ return c != '' }) }
|
||||||
|
|
||||||
|
|
||||||
// NOTE: this will not check if a key is a key...
|
// Normalize key string/array...
|
||||||
|
//
|
||||||
|
// NOTE: this will not check if a key is a key use isKey(..) for that.
|
||||||
var normalizeKey =
|
var normalizeKey =
|
||||||
module.normalizeKey =
|
module.normalizeKey =
|
||||||
function normalizeKey(key){
|
function normalizeKey(key){
|
||||||
@ -255,6 +267,11 @@ function normalizeKey(key){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Get shifted key if available...
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
// - '{' -> 'shift+['
|
||||||
|
// - ')' -> 'shift+#0'
|
||||||
var shifted =
|
var shifted =
|
||||||
module.shifted =
|
module.shifted =
|
||||||
function shifted(key){
|
function shifted(key){
|
||||||
@ -281,19 +298,6 @@ function shifted(key){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
|
||||||
|
|
||||||
var checkGlobalMode =
|
|
||||||
module.checkGlobalMode =
|
|
||||||
function checkGlobalMode(mode, keyboard, context){
|
|
||||||
var pattern = keyboard[mode].pattern
|
|
||||||
return !pattern
|
|
||||||
|| pattern == '*'
|
|
||||||
|| $(keyboard[mode].pattern).length > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
var KeyboardHandlerClassPrototype = {
|
var KeyboardHandlerClassPrototype = {
|
||||||
@ -328,6 +332,14 @@ var KeyboardHandlerPrototype = {
|
|||||||
// },
|
// },
|
||||||
// ...
|
// ...
|
||||||
// }
|
// }
|
||||||
|
//
|
||||||
|
// Reserved special handlers:
|
||||||
|
// - DROP - drop checking of key
|
||||||
|
// NOTE: this will prevent handling next sections
|
||||||
|
// for this key.
|
||||||
|
// - NEXT_SECTION - force check next section, this has priority
|
||||||
|
// over .drop
|
||||||
|
//
|
||||||
__keyboard: null,
|
__keyboard: null,
|
||||||
get keyboard(){
|
get keyboard(){
|
||||||
return this.__keyboard instanceof Function ?
|
return this.__keyboard instanceof Function ?
|
||||||
@ -337,7 +349,7 @@ var KeyboardHandlerPrototype = {
|
|||||||
this.__keyboard = value },
|
this.__keyboard = value },
|
||||||
|
|
||||||
// XXX is this needed???
|
// XXX is this needed???
|
||||||
context: null,
|
//context: null,
|
||||||
|
|
||||||
// utils...
|
// utils...
|
||||||
event2key: KeyboardHandlerClassPrototype.event2key,
|
event2key: KeyboardHandlerClassPrototype.event2key,
|
||||||
@ -382,11 +394,26 @@ var KeyboardHandlerPrototype = {
|
|||||||
//isModeApplicable: function(mode, keyboard, context){ return true },
|
//isModeApplicable: function(mode, keyboard, context){ return true },
|
||||||
//isModeApplicable: checkGlobalMode,
|
//isModeApplicable: checkGlobalMode,
|
||||||
|
|
||||||
// get keys for handler...
|
// Get keys for handler...
|
||||||
|
//
|
||||||
|
// List all handlers...
|
||||||
|
// .keys()
|
||||||
|
// .keys('*')
|
||||||
|
// -> keys
|
||||||
|
//
|
||||||
|
// List keys for handler...
|
||||||
|
// .keys(handler)
|
||||||
|
// -> keys
|
||||||
|
//
|
||||||
|
// List keys for given handlers...
|
||||||
|
// .keys(handler, ...)
|
||||||
|
// .keys([handler, ...])
|
||||||
|
// -> keys
|
||||||
|
//
|
||||||
|
// List keys for handlers that pass the func predicate...
|
||||||
|
// .keys(func)
|
||||||
|
// -> keys
|
||||||
//
|
//
|
||||||
// NOTE: this will also return non-key aliases...
|
|
||||||
// NOTE: to match several compatible handlers, pass a list of handlers,
|
|
||||||
// the result for each will be merged into one common list.
|
|
||||||
//
|
//
|
||||||
// Format:
|
// Format:
|
||||||
// {
|
// {
|
||||||
@ -397,17 +424,23 @@ var KeyboardHandlerPrototype = {
|
|||||||
// ...
|
// ...
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
//
|
||||||
|
// NOTE: this will also return non-key aliases...
|
||||||
|
// NOTE: to match several compatible handlers, pass a list of handlers,
|
||||||
|
// the result for each will be merged into one common list.
|
||||||
keys: function(handler){
|
keys: function(handler){
|
||||||
var that = this
|
var that = this
|
||||||
var res = {}
|
var res = {}
|
||||||
var keyboard = this.keyboard
|
var keyboard = this.keyboard
|
||||||
var key_separators = KEY_SEPARATORS
|
var key_separators = KEY_SEPARATORS
|
||||||
|
var service_fields = this.service_fields
|
||||||
|
|| this.constructor.service_fields
|
||||||
|
|
||||||
handler = arguments.length > 1 ? [].slice.call(arguments)
|
handler = arguments.length > 1 ? [].slice.call(arguments)
|
||||||
|
: handler == null ? '*'
|
||||||
: handler == '*' || handler instanceof Function ? handler
|
: handler == '*' || handler instanceof Function ? handler
|
||||||
: handler instanceof Array ? handler
|
: handler instanceof Array ? handler
|
||||||
: [handler]
|
: [handler]
|
||||||
var service_fields = this.service_fields
|
|
||||||
|| this.constructor.service_fields
|
|
||||||
|
|
||||||
var walkAliases = function(res, rev, bindings, key, mod){
|
var walkAliases = function(res, rev, bindings, key, mod){
|
||||||
mod = mod || []
|
mod = mod || []
|
||||||
@ -547,6 +580,13 @@ var KeyboardHandlerPrototype = {
|
|||||||
// -> this
|
// -> this
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
// Format:
|
||||||
|
// {
|
||||||
|
// <mode>: <handler>,
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
// Search order:
|
// Search order:
|
||||||
// - search for full key
|
// - search for full key
|
||||||
// - search for shifted key if applicable
|
// - search for shifted key if applicable
|
||||||
@ -613,7 +653,7 @@ var KeyboardHandlerPrototype = {
|
|||||||
var shift_key = this.shifted(key)
|
var shift_key = this.shifted(key)
|
||||||
|
|
||||||
// match candidates...
|
// match candidates...
|
||||||
var keys = genKeys(key, shift_key)
|
var keys = genKeys(key, shift_key).unique()
|
||||||
|
|
||||||
// get modes...
|
// get modes...
|
||||||
var modes = mode == '*' ? Object.keys(keyboard)
|
var modes = mode == '*' ? Object.keys(keyboard)
|
||||||
@ -629,12 +669,6 @@ var KeyboardHandlerPrototype = {
|
|||||||
|
|
||||||
var mod = genKeys(key.slice(0, -1).concat(''))
|
var mod = genKeys(key.slice(0, -1).concat(''))
|
||||||
|
|
||||||
// also test single key and code if everything else fails...
|
|
||||||
// XXX make this an option...
|
|
||||||
keys = keys
|
|
||||||
// .concat([k, c])
|
|
||||||
.unique()
|
|
||||||
|
|
||||||
var drop = mode == 'test' || mode == '?'
|
var drop = mode == 'test' || mode == '?'
|
||||||
for(var i=0; i < modes.length; i++){
|
for(var i=0; i < modes.length; i++){
|
||||||
var m = modes[i]
|
var m = modes[i]
|
||||||
@ -654,7 +688,7 @@ var KeyboardHandlerPrototype = {
|
|||||||
mod)
|
mod)
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle explicit DROP...
|
// explicit DROP -- ignore next sections...
|
||||||
if(drop && handler == 'DROP'){
|
if(drop && handler == 'DROP'){
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -690,11 +724,10 @@ var KeyboardHandlerPrototype = {
|
|||||||
var bindings = keyboard[m]
|
var bindings = keyboard[m]
|
||||||
|
|
||||||
// remove all matching keys...
|
// remove all matching keys...
|
||||||
keys
|
// NOTE: if key with modifiers, then this will remove only
|
||||||
.unique()
|
// the full matched keys and shifted matches but will
|
||||||
.forEach(function(k){
|
// leave the key without modifiers as-is...
|
||||||
delete bindings[k]
|
keys.forEach(function(k){ delete bindings[k] })
|
||||||
})
|
|
||||||
|
|
||||||
// set handler if given...
|
// set handler if given...
|
||||||
if(handler && handler != ''){
|
if(handler && handler != ''){
|
||||||
@ -719,6 +752,7 @@ var KeyboardHandlerPrototype = {
|
|||||||
context || that.context) })
|
context || that.context) })
|
||||||
: Object.keys(this.keyboard) },
|
: Object.keys(this.keyboard) },
|
||||||
|
|
||||||
|
|
||||||
__init__: function(keyboard, is_mode_applicable){
|
__init__: function(keyboard, is_mode_applicable){
|
||||||
this.keyboard = keyboard
|
this.keyboard = keyboard
|
||||||
|
|
||||||
@ -744,7 +778,8 @@ function makeKeyboardHandler(keyboard, unhandled, actions){
|
|||||||
|
|
||||||
var kb = keyboard instanceof Keyboard ?
|
var kb = keyboard instanceof Keyboard ?
|
||||||
keyboard
|
keyboard
|
||||||
: Keyboard(keyboard, checkGlobalMode)
|
//: Keyboard(keyboard, checkGlobalMode)
|
||||||
|
: Keyboard(keyboard)
|
||||||
|
|
||||||
return function(evt){
|
return function(evt){
|
||||||
var res = undefined
|
var res = undefined
|
||||||
@ -758,7 +793,15 @@ function makeKeyboardHandler(keyboard, unhandled, actions){
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var h = parseActionCall(handlers[mode])
|
var handler = handlers[mode]
|
||||||
|
|
||||||
|
// raw function handler...
|
||||||
|
if(handler instanceof Function){
|
||||||
|
res = handler.call(actions)
|
||||||
|
|
||||||
|
// action call syntax...
|
||||||
|
} else {
|
||||||
|
var h = parseActionCall(handler)
|
||||||
|
|
||||||
if(h && h.action in actions){
|
if(h && h.action in actions){
|
||||||
did_handling = true
|
did_handling = true
|
||||||
@ -768,6 +811,12 @@ function makeKeyboardHandler(keyboard, unhandled, actions){
|
|||||||
|
|
||||||
// call the handler...
|
// call the handler...
|
||||||
res = actions[h.action].apply(actions, h.args)
|
res = actions[h.action].apply(actions, h.args)
|
||||||
|
|
||||||
|
if(h.stop_propagation){
|
||||||
|
res = false
|
||||||
|
evt.stopPropagation()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user