3 angular.module('angular-gestures', []);
6 * Inspired by AngularJS' implementation of "click dblclick mousedown..."
8 * This ties in the Hammer 2 events to attributes like:
10 * hm-tap="add_something()" hm-swipe="remove_something()"
12 * and also has support for Hammer options with:
14 * hm-tap-opts="{hold: false}"
16 * or any other of the "hm-event" listed underneath.
19 hmDoubleTap: 'doubletap',
20 hmDragstart: 'panstart', // will bedeprecated soon, us Pan*
21 hmDrag: 'pan', // will bedeprecated soon, us Pan*
22 hmDragUp: 'panup', // will bedeprecated soon, us Pan*
23 hmDragDown: 'pandown', // will bedeprecated soon, us Pan*
24 hmDragLeft: 'panleft', // will bedeprecated soon, us Pan*
25 hmDragRight: 'panright', // will bedeprecated soon, us Pan*
26 hmDragend: 'panend', // will bedeprecated soon, us Pan*
27 hmPanstart: 'panstart',
32 hmPanRight: 'panright',
37 hmPinchOut: 'pinchout',
43 hmSwipeDown: 'swipedown',
44 hmSwipeLeft: 'swipeleft',
45 hmSwipeRight: 'swiperight',
48 hmTransformstart: 'transformstart',
49 hmTransform: 'transform',
50 hmTransformend: 'transformend'
54 hmDoubleTap: [Hammer.Tap, 'Hammer.Tap'],
55 hmDragstart: [Hammer.Pan, 'Hammer.Pan'],
56 hmDrag: [Hammer.Pan, 'Hammer.Pan'],
57 hmDragUp: [Hammer.Pan, 'Hammer.Pan'],
58 hmDragDown: [Hammer.Pan, 'Hammer.Pan'],
59 hmDragLeft: [Hammer.Pan, 'Hammer.Pan'],
60 hmDragRight: [Hammer.Pan, 'Hammer.Pan'],
61 hmDragend: [Hammer.Pan, 'Hammer.Pan'],
62 hmPanstart: [Hammer.Pan, 'Hammer.Pan'],
63 hmPan: [Hammer.Pan, 'Hammer.Pan'],
64 hmPanUp: [Hammer.Pan, 'Hammer.Pan'],
65 hmPanDown: [Hammer.Pan, 'Hammer.Pan'],
66 hmPanLeft: [Hammer.Pan, 'Hammer.Pan'],
67 hmPanRight: [Hammer.Pan, 'Hammer.Pan'],
68 hmPanend: [Hammer.Pan, 'Hammer.Pan'],
69 hmHold: [Hammer.Press, 'Hammer.Press'],
70 hmPinch: [Hammer.Pinch, 'Hammer.Pinch'],
71 hmPinchIn: [Hammer.Pinch, 'Hammer.Pinch'],
72 hmPinchOut: [Hammer.Pinch, 'Hammer.Pinch'],
73 hmPress: [Hammer.Press, 'Hammer.Press'],
74 hmRotate: [Hammer.Rotate, 'Hammer.Rotate'],
75 hmSwipe: [Hammer.Swipe, 'Hammer.Swipe'],
76 hmSwipeUp: [Hammer.Swipe, 'Hammer.Swipe'],
77 hmSwipeDown: [Hammer.Swipe, 'Hammer.Swipe'],
78 hmSwipeLeft: [Hammer.Swipe, 'Hammer.Swipe'],
79 hmSwipeRight: [Hammer.Swipe, 'Hammer.Swipe'],
80 hmTap: [Hammer.Tap, 'Hammer.Tap']
85 angular.forEach(HGESTURES, function(eventName, directiveName) {
86 angular.module('angular-gestures').directive(directiveName, ['$parse', '$log', '$timeout', 'hammerDefaultOpts', function($parse, $log, $timeout, hammerDefaultOpts) {
87 return function(scope, element, attr) {
89 attr.$observe(directiveName, function(value) {
90 var callback = $parse(value);
91 var opts = $parse(attr[directiveName + 'Opts'])(scope, {});
92 var defaultOpts = angular.copy(hammerDefaultOpts);
94 angular.extend(defaultOpts, opts);
96 if (angular.isUndefined(element.hammertime)) {
98 // validate that needed recognizer is enabled
99 var recognizers = angular.isDefined(defaultOpts.recognizers) ? defaultOpts.recognizers : [];
100 var recognizer = HRECOGNIZERS[directiveName];
101 if(angular.isDefined(recognizer)) {
103 angular.forEach(recognizers, function(r) {
104 if (recognizer[0] === r[0]) {
105 if (angular.isUndefined(r[1].enable) || r[1].enable === true) {
111 throw new Error('Directive ' + directiveName + ' requires gesture recognizer [' + recognizer[1] + '] to be enabled');
115 element.hammer = new Hammer.Manager(element[0], defaultOpts);
116 scope.$on('$destroy', function() {
117 element.hammer.off(eventName);
118 element.hammer.destroy();
122 handler = function(event) {
124 $log.debug('angular-gestures: ', eventName, event);
126 var callbackHandler = function () {
127 var cb = callback(scope, { $event : event});
128 if (typeof cb === 'function') {
129 cb.call(scope, event);
133 if (scope.$root.$$phase === '$apply' ||
134 scope.$root.$$phase === '$digest') {
137 scope.$apply(callbackHandler);
141 // register actual event
142 element.hammer.on(eventName, handler);
148 angular.module('angular-gestures').provider('hammerDefaultOpts', function HammerDefaultOptsProvider() {
151 this.set = function(value) {
155 this.$get = function() {