sid/js/shortcut-manager.js

127 lines
3.6 KiB
JavaScript
Executable File

/**************/
/* PRÉ-REQUIS */
/**************/
/* Retourne le keyCode correspondant à la chaîne donnée
*
* @param str enchaînement de touches sous forme de string
*
*
* return keyCode le code de la touche correspondante
*/
function strToKeyCode(keyString){
// on enregistre le keyCode du premier caractère
var keyCode = keyString.toUpperCase().charCodeAt(0);
// s'il s'agit d'un caractère uniquement (entre "a" et "z" ou entre "0" et "9")
if( keyString.length == 1 && ((keyCode >= 65 && keyCode <= 90) || (keyCode >= 49 && keyCode <= 57)) )
return keyCode; // on retourne le keyCode associé
else
switch( keyString ){ // sinon, on récupère l'ascii spécifiquement
case 'ctrl': return 17; break;
case 'maj': return 16; break;
case 'alt': return 18; break;
case 'tab': return 9; break;
case 'left': return 37; break;
case 'top': return 38; break;
case 'right': return 39; break;
case 'down': return 40; break;
}
return null;
}
/**********/
/* CLASSE */
/**********/
function ShortcutManager(){};
ShortcutManager.prototype = {
shortcuts: [], // contiendra tous les raccourcis
progress: [], // contiendra l'avancée des raccourcis
handlers: [], // contiendra tous les handlers (fonctions à éxécuter)
/* tmp */
lastKeyCode: [], // contiendra des "reminder" pour les évènements
/* ajout d'un nouveau raccourcis clavier */
append: function(keyRow, handler){
/* [1] On découpe la chaîne (en minuscule) par "+"
=======================================================*/
var keyStore = keyRow.toLowerCase().split('+');
/* [2] On récupère les keyCodes correspondant aux codes/lettres
=======================================================*/
for( var i = 0 ; i < keyStore.length ; i++ ){
keyStore[i] = strToKeyCode( keyStore[i] );
// si on a une erreur, on retourne NULL
if( keyStore[i] == null ) return null;
}
/* [3] On enregistre dans l'objet (shortcuts, progress, handler)
=======================================================*/
var index = this.shortcuts.push( keyStore ) - 1;
this.progress[index] = 0; // le progrès est l'index d'avancement
this.handlers[index] = handler; // handler (function qui s'éxécutera lors de l'activation)
this.lastKeyCode[index] = null; //
},
/* remet à zéro tous les progrès */
resetProgress: function(keyCode){
for( var i = 0 ; i < this.progress.length ; i++ )
if( this.lastKeyCode[i] != keyCode )
this.progress[i] = 0;
},
/* démarre l'écoute (active les évènements) */
listen: function(){
/* [1] On créé l'évènement d'appui de touche pour chaque élément
=======================================================*/
var pointer = this;
// on initialise/créer l'évènement
window.addEventListener('keydown', function(e){
for( var i = 0 ; i < pointer.shortcuts.length ; i++ ){
// si on a la bonne touche, on incrémente l'avancement / sinon si on c'est une touche différente, on remet à 0
if( e.keyCode == pointer.shortcuts[i][pointer.progress[i]] )
pointer.progress[i] += 1;
else if( e.keyCode != pointer.lastKeyCode[i] )
pointer.progress[i] = 0;
pointer.lastKeyCode[i] == e.keyCode;
// si on a terminé la combinaison de touches, on remet le compteur à 0 + on exécute le handler
if( pointer.progress[i] == pointer.shortcuts[i].length ){
pointer.progress[i] = 0;
pointer.handlers[i](e);
}
}
}, false);
// si on lâche une touche, on remet à zéro
window.addEventListener('keyup', function(e){
pointer.resetProgress( e.keyCode );
}, false);
}
};