devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
337 lines (296 loc) • 9.6 kB
JavaScript
var mathUtils = require("../core/utils/math"),
iteratorUtils = require("../core/utils/iterator"),
errors = require("../core/errors"),
eventUtils = require("./utils"),
Emitter = require("./core/emitter"),
registerEmitter = require("./core/emitter_registrator");
var DX_PREFIX = "dx",
TRANSFORM = "transform",
TRANSLATE = "translate",
ZOOM = "zoom",
PINCH = "pinch",
ROTATE = "rotate",
START_POSTFIX = "start",
UPDATE_POSTFIX = "",
END_POSTFIX = "end";
var eventAliases = [];
var addAlias = function addAlias(eventName, eventArgs) {
eventAliases.push({
name: eventName,
args: eventArgs
});
};
addAlias(TRANSFORM, {
scale: true,
deltaScale: true,
rotation: true,
deltaRotation: true,
translation: true,
deltaTranslation: true
});
addAlias(TRANSLATE, {
translation: true,
deltaTranslation: true
});
addAlias(ZOOM, {
scale: true,
deltaScale: true
});
addAlias(PINCH, {
scale: true,
deltaScale: true
});
addAlias(ROTATE, {
rotation: true,
deltaRotation: true
});
var getVector = function getVector(first, second) {
return {
x: second.pageX - first.pageX,
y: -second.pageY + first.pageY,
centerX: (second.pageX + first.pageX) * 0.5,
centerY: (second.pageY + first.pageY) * 0.5
};
};
var getEventVector = function getEventVector(e) {
var pointers = e.pointers;
return getVector(pointers[0], pointers[1]);
};
var getDistance = function getDistance(vector) {
return Math.sqrt(vector.x * vector.x + vector.y * vector.y);
};
var getScale = function getScale(firstVector, secondVector) {
return getDistance(firstVector) / getDistance(secondVector);
};
var getRotation = function getRotation(firstVector, secondVector) {
var scalarProduct = firstVector.x * secondVector.x + firstVector.y * secondVector.y;
var distanceProduct = getDistance(firstVector) * getDistance(secondVector);
if (distanceProduct === 0) {
return 0;
}
var sign = mathUtils.sign(firstVector.x * secondVector.y - secondVector.x * firstVector.y);
var angle = Math.acos(mathUtils.fitIntoRange(scalarProduct / distanceProduct, -1, 1));
return sign * angle;
};
var getTranslation = function getTranslation(firstVector, secondVector) {
return {
x: firstVector.centerX - secondVector.centerX,
y: firstVector.centerY - secondVector.centerY
};
};
var TransformEmitter = Emitter.inherit({
configure: function configure(data, eventName) {
if (eventName.indexOf(ZOOM) > -1) {
errors.log("W0005", eventName, "15.1", "Use '" + eventName.replace(ZOOM, PINCH) + "' event instead");
}
this.callBase(data);
},
validatePointers: function validatePointers(e) {
return eventUtils.hasTouches(e) > 1;
},
start: function start(e) {
this._accept(e);
var startVector = getEventVector(e);
this._startVector = startVector;
this._prevVector = startVector;
this._fireEventAliases(START_POSTFIX, e);
},
move: function move(e) {
var currentVector = getEventVector(e),
eventArgs = this._getEventArgs(currentVector);
this._fireEventAliases(UPDATE_POSTFIX, e, eventArgs);
this._prevVector = currentVector;
},
end: function end(e) {
var eventArgs = this._getEventArgs(this._prevVector);
this._fireEventAliases(END_POSTFIX, e, eventArgs);
},
_getEventArgs: function _getEventArgs(vector) {
return {
scale: getScale(vector, this._startVector),
deltaScale: getScale(vector, this._prevVector),
rotation: getRotation(vector, this._startVector),
deltaRotation: getRotation(vector, this._prevVector),
translation: getTranslation(vector, this._startVector),
deltaTranslation: getTranslation(vector, this._prevVector)
};
},
_fireEventAliases: function _fireEventAliases(eventPostfix, originalEvent, eventArgs) {
eventArgs = eventArgs || {};
iteratorUtils.each(eventAliases, function (_, eventAlias) {
var args = {};
iteratorUtils.each(eventAlias.args, function (name) {
if (name in eventArgs) {
args[name] = eventArgs[name];
}
});
this._fireEvent(DX_PREFIX + eventAlias.name + eventPostfix, originalEvent, args);
}.bind(this));
}
});
/**
* @name ui events.dxtransformstart
* @publicName dxtransformstart
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxtransform
* @publicName dxtransform
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 scale:number
* @type_function_param1_field2 deltaScale:number
* @type_function_param1_field3 rotation:number
* @type_function_param1_field4 deltaRotation:number
* @type_function_param1_field5 translation:object
* @type_function_param1_field6 deltaTranslation:object
* @type_function_param1_field7 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxtransformend
* @publicName dxtransformend
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 scale:number
* @type_function_param1_field2 deltaScale:number
* @type_function_param1_field3 rotation:number
* @type_function_param1_field4 deltaRotation:number
* @type_function_param1_field5 translation:object
* @type_function_param1_field6 deltaTranslation:object
* @type_function_param1_field7 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxtranslatestart
* @publicName dxtranslatestart
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxtranslate
* @publicName dxtranslate
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 translation:object
* @type_function_param1_field2 deltaTranslation:object
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxtranslateend
* @publicName dxtranslateend
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 translation:object
* @type_function_param1_field2 deltaTranslation:object
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxzoomstart
* @publicName dxzoomstart
* @type eventType
* @deprecated ui events.dxpinchstart
* @type_function_param1 event:event
* @type_function_param1_field1 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxzoom
* @publicName dxzoom
* @type eventType
* @deprecated ui events.dxpinch
* @type_function_param1 event:event
* @type_function_param1_field1 scale:number
* @type_function_param1_field2 deltaScale:number
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxzoomend
* @publicName dxzoomend
* @type eventType
* @deprecated ui events.dxpinchend
* @type_function_param1 event:event
* @type_function_param1_field1 scale:number
* @type_function_param1_field2 deltaScale:number
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxpinchstart
* @publicName dxpinchstart
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxpinch
* @publicName dxpinch
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 scale:number
* @type_function_param1_field2 deltaScale:number
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxpinchend
* @publicName dxpinchend
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 scale:number
* @type_function_param1_field2 deltaScale:number
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxrotatestart
* @publicName dxrotatestart
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxrotate
* @publicName dxrotate
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 rotation:number
* @type_function_param1_field2 deltaRotation:number
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
/**
* @name ui events.dxrotateend
* @publicName dxrotateend
* @type eventType
* @type_function_param1 event:event
* @type_function_param1_field1 rotation:number
* @type_function_param1_field2 deltaRotation:number
* @type_function_param1_field3 cancel:boolean
* @module events/transform
*/
var eventNames = iteratorUtils.map(eventAliases, function (eventAlias) {
var eventNames = [];
iteratorUtils.each([START_POSTFIX, UPDATE_POSTFIX, END_POSTFIX], function (_, eventPostfix) {
eventNames.push(DX_PREFIX + eventAlias.name + eventPostfix);
});
return eventNames;
});
registerEmitter({
emitter: TransformEmitter,
events: eventNames
});
iteratorUtils.each(eventNames, function (_, eventName) {
exports[eventName.substring(DX_PREFIX.length)] = eventName;
});
;