Skip to content

Instantly share code, notes, and snippets.

@cburgdorf
Created December 16, 2011 11:42
Show Gist options
  • Save cburgdorf/1485758 to your computer and use it in GitHub Desktop.
Save cburgdorf/1485758 to your computer and use it in GitHub Desktop.
How to listen for STRG + UP / STRG + DOWN the Rx way
var keys = {
UP: 38,
DOWN: 40,
CTRL: 17
}
var selectKeyCode = function(event){ return event.keyCode; };
var selectDown = function(){ return "down";};
var selectUp = function() { return "up" };
var areBothKeysDown = function(x, y) { return x === "down" && y === "down" };
var matchesKey = function(key){
return function(x){
return x === key;
};
};
var observableKeyDowns = $(window).toObservable('keydown').Select(selectKeyCode);
var observableKeyUps = $(window).toObservable('keyup').Select(selectKeyCode);
var observableCtrlKeyDowns = observableKeyDowns.Where(matchesKey(keys['CTRL'])).Select(selectDown);
var observableCtrlKeyUps = observableKeyUps.Where(matchesKey(keys['CTRL'])).Select(selectUp);
var observableCtrlKeyState = Rx.Observable.Merge([observableCtrlKeyDowns, observableCtrlKeyUps])
var observableUpKeyDowns = observableKeyDowns.Where(matchesKey(keys['UP'])).Select(selectDown);
var observableUpKeyUps = observableKeyUps.Where(matchesKey(keys['UP'])).Select(selectUp);
var observableUpKeyState = Rx.Observable.Merge([observableUpKeyDowns, observableUpKeyUps]);
var observableDownKeyDowns = observableKeyDowns.Where(matchesKey(keys['DOWN'])).Select(selectDown);
var observableDownKeyUps = observableKeyUps.Where(matchesKey(keys['DOWN'])).Select(selectUp);
var observableDownKeyState = Rx.Observable.Merge([observableDownKeyDowns, observableDownKeyUps]);
var observableCtrlAndUp = observableCtrlKeyState
.CombineLatest(observableUpKeyState, areBothKeysDown)
.Where(function(x){ return x === true;})
.Select(function(){ return "CtrlAndUp"; });
var observableCtrlAndDown = observableCtrlKeyState
.CombineLatest(observableDownKeyState, areBothKeysDown)
.Where(function(x){ return x === true;})
.Select(function(){ return "CtrlAndDown"; });
var observableShortcuts = Rx.Observable.Merge([observableCtrlAndUp, observableCtrlAndDown]);
observableShortcuts.Subscribe(function(shortcut) { console.log(shortcut); });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment