/**
* A event recognizer created to recognize swipe movements from the edge of a container.
*/
Ext.define('Ext.event.gesture.EdgeSwipe', {
extend: 'Ext.event.gesture.Swipe',
priority: 500,
handledEvents: [
'edgeswipe',
'edgeswipestart',
'edgeswipeend',
'edgeswipecancel'
],
config: {
minDistance: 60
},
onTouchStart: function(e) {
var me = this,
ret = me.callParent([e]),
touch;
if (ret !== false) {
touch = e.changedTouches[0];
me.direction = null;
me.isHorizontal = true;
me.isVertical = true;
me.startX = touch.pageX;
me.startY = touch.pageY;
}
return ret;
},
onTouchMove: function(e) {
var me = this,
touch = e.changedTouches[0],
x = touch.pageX,
y = touch.pageY,
deltaX = x - me.startX,
deltaY = y - me.startY,
absDeltaY = Math.abs(y - me.startY),
absDeltaX = Math.abs(x - me.startX),
minDistance = me.getMinDistance(),
maxOffset = me.getMaxOffset(),
duration = e.time - me.startTime,
elementWidth = Ext.Viewport && Ext.Element.getViewportWidth(),
elementHeight = Ext.Viewport && Ext.Element.getViewportHeight(),
direction, distance;
// Check if the swipe is going off vertical
if (me.isVertical && absDeltaX > maxOffset) {
me.isVertical = false;
}
// Check if the swipe is going off horizontal
if (me.isHorizontal && absDeltaY > maxOffset) {
me.isHorizontal = false;
}
// If the swipe is both, determin which one it is from the maximum distance travelled
if (me.isVertical && me.isHorizontal) {
if (absDeltaY > absDeltaX) {
me.isHorizontal = false;
}
else {
me.isVertical = false;
}
}
// Get the direction of the swipe
if (me.isHorizontal) {
direction = (deltaX < 0) ? 'left' : 'right';
distance = deltaX;
}
else if (me.isVertical) {
direction = (deltaY < 0) ? 'up' : 'down';
distance = deltaY;
}
direction = me.direction || (me.direction = direction);
// Invert the distance if we are going up or left so the distance is a positive number
// FROM the side
if (direction === 'up') {
distance = deltaY * -1;
}
else if (direction === 'left') {
distance = deltaX * -1;
}
me.distance = distance;
if (!distance) {
return me.cancel(e);
}
if (!me.isStarted) {
if ((direction === 'right' && me.startX > minDistance) ||
(direction === 'down' && me.startY > minDistance) ||
(direction === 'left' && (elementWidth - me.startX) > minDistance) ||
(direction === 'up' && (elementHeight - me.startY) > minDistance)) {
return me.cancel(e);
}
me.isStarted = true;
me.startTime = e.time;
me.fire('edgeswipestart', e, {
touch: touch,
direction: direction,
distance: distance,
duration: duration
});
}
else {
me.fire('edgeswipe', e, {
touch: touch,
direction: direction,
distance: distance,
duration: duration
});
}
},
onTouchEnd: function(e) {
var me = this,
duration;
if (me.onTouchMove(e) !== false) {
duration = e.time - me.startTime;
me.fire('edgeswipeend', e, {
touch: e.changedTouches[0],
direction: me.direction,
distance: me.distance,
duration: duration
});
}
return this.reset();
},
onCancel: function(e) {
this.fire('edgeswipecancel', e, {
touch: e.changedTouches[0]
}, true);
},
reset: function() {
var me = this;
me.direction = me.isHorizontal = me.isVertical = me.startX = me.startY =
me.startTime = me.distance = null;
return me.callParent();
}
}, function(EdgeSwipe) {
var gestures = Ext.manifest.gestures;
EdgeSwipe.instance = new EdgeSwipe(gestures && gestures.edgeSwipe);
});