/**
* A event recognizer which knows when you tap and hold for more than 1 second.
*/
Ext.define('Ext.event.gesture.LongPress', {
extend: 'Ext.event.gesture.SingleTouch',
priority: 400,
config: {
moveDistance: 8,
minDuration: 1000
},
handledEvents: ['longpress', 'taphold'],
/**
* @member Ext.dom.Element
* @event longpress
* Fires when you touch and hold still for more than 1 second.
* @param {Ext.event.Event} event The {@link Ext.event.Event} event encapsulating the DOM event.
* @param {HTMLElement} node The target of the event.
* @param {Object} options The options object passed to Ext.mixin.Observable.addListener.
*/
/**
* @member Ext.dom.Element
* @event taphold
* @inheritdoc Ext.dom.Element#longpress
*/
onTouchStart: function(e) {
var me = this,
ret = me.callParent([e]);
if (ret !== false) {
me.startPoint = e.changedTouches[0].point;
me.setLongPressTimer(e);
}
return ret;
},
setLongPressTimer: function(e) {
var me = this;
Ext.undefer(me.timer);
me.timer = Ext.defer(me.fireLongPress, me.getMinDuration(), me, [e]);
},
onTouchMove: function(e) {
var me = this,
point = e.changedTouches[0].point,
scale = Ext.Element.getViewportScale(),
// account for scale so that move distance is actual screen pixels, not page pixels
distance = Math.round(Math.abs(point.getDistanceTo(me.startPoint) * scale));
if (distance >= me.getMoveDistance()) {
return me.cancel(e);
}
},
reset: function() {
var me = this;
me.timer = me.startPoint = Ext.undefer(me.timer);
return me.callParent();
},
fireLongPress: function(e) {
var me = this,
info = {
touch: e.changedTouches[0],
duration: me.getMinDuration(),
startDrag: me.startDrag
};
this.fire('taphold', e, info);
this.fire('longpress', e, info);
this.reset();
},
/**
* @member Ext.event.Event
* @method startDrag
*
* Initiates a drag gesture in response to this event
*
* Only available when `type` is `'longpress'`. When invoked a dragstart event
* will be immediately fired at the coordinates of the longpress event. Thereafter
* drag events will fire in response to movement on the screen without regard
* to the distance moved.
*/
startDrag: function() {
// the longpress event object is decorated with this function, the scope object
// here is the event object, not the recognizer
var dragRecognizer = Ext.event.gesture.Drag.instance,
touchStartEvent = this.parentEvent;
dragRecognizer.doDragStart(touchStartEvent, true);
Ext.event.publisher.Gesture.instance.claimRecognizer(dragRecognizer, touchStartEvent);
}
}, function(LongPress) {
var gestures = Ext.manifest.gestures;
LongPress.instance = new LongPress(gestures && gestures.longPress);
});