Skip to content

Commit

Permalink
fix(gestures): custom recognizers should not inherit twice.
Browse files Browse the repository at this point in the history
* HammerJS does not allow custom recognizers to use a default recognizer twice globally.
  This means that we can't create a `drag` and `slide` recognizer, which depends for all on one default recognizers.
  • Loading branch information
devversion committed Jul 22, 2016
1 parent 14805fe commit b4c073f
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/core/gestures/MdGestureConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,30 +35,32 @@ export class MdGestureConfig extends HammerGestureConfig {
buildHammer(element: HTMLElement) {
var mc = new Hammer(element);

// Create custom gesture recognizers
let drag = this._createRecognizer(Hammer.Pan, {event: 'drag', threshold: 6}, Hammer.Swipe);
let slide = this._createRecognizer(Hammer.Pan, {event: 'slide', threshold: 0}, Hammer.Swipe);
let longpress = this._createRecognizer(Hammer.Press, {event: 'longpress', time: 500});

// Default Hammer Recognizers.
let pan = new Hammer.Pan();
let swipe = new Hammer.Swipe();
let press = new Hammer.Press();

// Overwrite the default `pan` event to use the swipe event.
pan.recognizeWith(swipe);

// Notice that a HammerJS recognizer can only depend on one other recognizer once.
// Otherwise the previous `recognizeWith` will be dropped.
let slide = this._createRecognizer(pan, {event: 'slide', threshold: 0});
let drag = this._createRecognizer(slide, {event: 'drag', threshold: 6});
let longpress = this._createRecognizer(press, {event: 'longpress', time: 500});

// Add customized gestures to Hammer manager
mc.add([drag, slide, pan, longpress]);
mc.add([swipe, press, pan, drag, slide, longpress]);

return mc;
}

/** Creates a new recognizer, without affecting the default recognizers of HammerJS */
private _createRecognizer(type: RecognizerStatic, options: any, ...extra: RecognizerStatic[]) {
let recognizer = new type(options);
private _createRecognizer(base: Recognizer, options: any, ...inheritances: Recognizer[]) {
let recognizer = new (<RecognizerStatic> base.constructor)(options);

// Add the default recognizer to the new custom recognizer.
extra.push(type);
extra.forEach(entry => recognizer.recognizeWith(new entry()));
inheritances.push(base);
inheritances.forEach((item) => recognizer.recognizeWith(item));

return recognizer;
}
Expand Down

0 comments on commit b4c073f

Please sign in to comment.