You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 line
14 KiB

{"ast":null,"code":"import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nimport { EventTypes } from \"../interfaces\";\nvar RotationGestureDetector = function () {\n function RotationGestureDetector(callbacks) {\n _classCallCheck(this, RotationGestureDetector);\n _defineProperty(this, \"onRotationBegin\", void 0);\n _defineProperty(this, \"onRotation\", void 0);\n _defineProperty(this, \"onRotationEnd\", void 0);\n _defineProperty(this, \"currentTime\", 0);\n _defineProperty(this, \"previousTime\", 0);\n _defineProperty(this, \"previousAngle\", 0);\n _defineProperty(this, \"rotation\", 0);\n _defineProperty(this, \"anchorX\", 0);\n _defineProperty(this, \"anchorY\", 0);\n _defineProperty(this, \"isInProgress\", false);\n _defineProperty(this, \"keyPointers\", [NaN, NaN]);\n this.onRotationBegin = callbacks.onRotationBegin;\n this.onRotation = callbacks.onRotation;\n this.onRotationEnd = callbacks.onRotationEnd;\n }\n _createClass(RotationGestureDetector, [{\n key: \"updateCurrent\",\n value: function updateCurrent(event, tracker) {\n this.previousTime = this.currentTime;\n this.currentTime = event.time;\n var _this$keyPointers = _slicedToArray(this.keyPointers, 2),\n firstPointerID = _this$keyPointers[0],\n secondPointerID = _this$keyPointers[1];\n var firstPointerX = tracker.getLastX(firstPointerID);\n var firstPointerY = tracker.getLastY(firstPointerID);\n var secondPointerX = tracker.getLastX(secondPointerID);\n var secondPointerY = tracker.getLastY(secondPointerID);\n var vectorX = secondPointerX - firstPointerX;\n var vectorY = secondPointerY - firstPointerY;\n this.anchorX = (firstPointerX + secondPointerX) / 2;\n this.anchorY = (firstPointerY + secondPointerY) / 2;\n var angle = -Math.atan2(vectorY, vectorX);\n this.rotation = Number.isNaN(this.previousAngle) ? 0 : this.previousAngle - angle;\n this.previousAngle = angle;\n if (this.rotation > Math.PI) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI) {\n this.rotation += Math.PI;\n }\n if (this.rotation > Math.PI / 2) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI / 2) {\n this.rotation += Math.PI;\n }\n }\n }, {\n key: \"finish\",\n value: function finish() {\n if (!this.isInProgress) {\n return;\n }\n this.isInProgress = false;\n this.keyPointers = [NaN, NaN];\n this.onRotationEnd(this);\n }\n }, {\n key: \"setKeyPointers\",\n value: function setKeyPointers(tracker) {\n if (this.keyPointers[0] && this.keyPointers[1]) {\n return;\n }\n var pointerIDs = tracker.getData().keys();\n this.keyPointers[0] = pointerIDs.next().value;\n this.keyPointers[1] = pointerIDs.next().value;\n }\n }, {\n key: \"onTouchEvent\",\n value: function onTouchEvent(event, tracker) {\n switch (event.eventType) {\n case EventTypes.DOWN:\n this.isInProgress = false;\n break;\n case EventTypes.ADDITIONAL_POINTER_DOWN:\n if (this.isInProgress) {\n break;\n }\n this.isInProgress = true;\n this.previousTime = event.time;\n this.previousAngle = NaN;\n this.setKeyPointers(tracker);\n this.updateCurrent(event, tracker);\n this.onRotationBegin(this);\n break;\n case EventTypes.MOVE:\n if (!this.isInProgress) {\n break;\n }\n this.updateCurrent(event, tracker);\n this.onRotation(this);\n break;\n case EventTypes.ADDITIONAL_POINTER_UP:\n if (!this.isInProgress) {\n break;\n }\n if (this.keyPointers.indexOf(event.pointerId) >= 0) {\n this.finish();\n }\n break;\n case EventTypes.UP:\n if (this.isInProgress) {\n this.finish();\n }\n break;\n }\n return true;\n }\n }, {\n key: \"getTimeDelta\",\n value: function getTimeDelta() {\n return this.currentTime + this.previousTime;\n }\n }, {\n key: \"getAnchorX\",\n value: function getAnchorX() {\n return this.anchorX;\n }\n }, {\n key: \"getAnchorY\",\n value: function getAnchorY() {\n return this.anchorY;\n }\n }, {\n key: \"getRotation\",\n value: function getRotation() {\n return this.rotation;\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.keyPointers = [NaN, NaN];\n this.isInProgress = false;\n }\n }]);\n return RotationGestureDetector;\n}();\nexport { RotationGestureDetector as default };","map":{"version":3,"sources":["RotationGestureDetector.ts"],"names":["EventTypes","RotationGestureDetector","NaN","constructor","callbacks","onRotationBegin","onRotation","onRotationEnd","updateCurrent","event","tracker","previousTime","currentTime","time","firstPointerID","secondPointerID","keyPointers","firstPointerX","getLastX","firstPointerY","getLastY","secondPointerX","secondPointerY","vectorX","vectorY","anchorX","anchorY","angle","Math","atan2","rotation","Number","isNaN","previousAngle","PI","finish","isInProgress","setKeyPointers","pointerIDs","getData","keys","next","value","onTouchEvent","eventType","DOWN","ADDITIONAL_POINTER_DOWN","MOVE","ADDITIONAL_POINTER_UP","indexOf","pointerId","UP","getTimeDelta","getAnchorX","getAnchorY","getRotation","reset"],"mappings":"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","sourcesContent":["import { AdaptedEvent, EventTypes } from '../interfaces';\nimport PointerTracker from '../tools/PointerTracker';\n\nexport interface RotationGestureListener {\n onRotationBegin: (detector: RotationGestureDetector) => boolean;\n onRotation: (detector: RotationGestureDetector) => boolean;\n onRotationEnd: (detector: RotationGestureDetector) => void;\n}\n\nexport default class RotationGestureDetector\n implements RotationGestureListener\n{\n onRotationBegin: (detector: RotationGestureDetector) => boolean;\n onRotation: (detector: RotationGestureDetector) => boolean;\n onRotationEnd: (detector: RotationGestureDetector) => void;\n\n private currentTime = 0;\n private previousTime = 0;\n\n private previousAngle = 0;\n private rotation = 0;\n\n private anchorX = 0;\n private anchorY = 0;\n\n private isInProgress = false;\n\n private keyPointers: number[] = [NaN, NaN];\n\n constructor(callbacks: RotationGestureListener) {\n this.onRotationBegin = callbacks.onRotationBegin;\n this.onRotation = callbacks.onRotation;\n this.onRotationEnd = callbacks.onRotationEnd;\n }\n\n private updateCurrent(event: AdaptedEvent, tracker: PointerTracker): void {\n this.previousTime = this.currentTime;\n this.currentTime = event.time;\n\n const [firstPointerID, secondPointerID] = this.keyPointers;\n\n const firstPointerX: number = tracker.getLastX(firstPointerID);\n const firstPointerY: number = tracker.getLastY(firstPointerID);\n const secondPointerX: number = tracker.getLastX(secondPointerID);\n const secondPointerY: number = tracker.getLastY(secondPointerID);\n\n const vectorX: number = secondPointerX - firstPointerX;\n const vectorY: number = secondPointerY - firstPointerY;\n\n this.anchorX = (firstPointerX + secondPointerX) / 2;\n this.anchorY = (firstPointerY + secondPointerY) / 2;\n\n //Angle diff should be positive when rotating in clockwise direction\n const angle: number = -Math.atan2(vectorY, vectorX);\n\n this.rotation = Number.isNaN(this.previousAngle)\n ? 0\n : this.previousAngle - angle;\n\n this.previousAngle = angle;\n\n if (this.rotation > Math.PI) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI) {\n this.rotation += Math.PI;\n }\n\n if (this.rotation > Math.PI / 2) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI / 2) {\n this.rotation += Math.PI;\n }\n }\n\n private finish(): void {\n if (!this.isInProgress) {\n return;\n }\n\n this.isInProgress = false;\n this.keyPointers = [NaN, NaN];\n this.onRotationEnd(this);\n }\n\n private setKeyPointers(tracker: PointerTracker): void {\n if (this.keyPointers[0] && this.keyPointers[1]) {\n return;\n }\n\n const pointerIDs: IterableIterator<number> = tracker.getData().keys();\n\n this.keyPointers[0] = pointerIDs.next().value as number;\n this.keyPointers[1] = pointerIDs.next().value as number;\n }\n\n public onTouchEvent(event: AdaptedEvent, tracker: PointerTracker): boolean {\n switch (event.eventType) {\n case EventTypes.DOWN:\n this.isInProgress = false;\n break;\n\n case EventTypes.ADDITIONAL_POINTER_DOWN:\n if (this.isInProgress) {\n break;\n }\n this.isInProgress = true;\n\n this.previousTime = event.time;\n this.previousAngle = NaN;\n\n this.setKeyPointers(tracker);\n\n this.updateCurrent(event, tracker);\n this.onRotationBegin(this);\n break;\n\n case EventTypes.MOVE:\n if (!this.isInProgress) {\n break;\n }\n\n this.updateCurrent(event, tracker);\n this.onRotation(this);\n\n break;\n\n case EventTypes.ADDITIONAL_POINTER_UP:\n if (!this.isInProgress) {\n break;\n }\n\n if (this.keyPointers.indexOf(event.pointerId) >= 0) {\n this.finish();\n }\n\n break;\n\n case EventTypes.UP:\n if (this.isInProgress) {\n this.finish();\n }\n break;\n }\n\n return true;\n }\n\n public getTimeDelta(): number {\n return this.currentTime + this.previousTime;\n }\n\n public getAnchorX(): number {\n return this.anchorX;\n }\n\n public getAnchorY(): number {\n return this.anchorY;\n }\n\n public getRotation(): number {\n return this.rotation;\n }\n\n public reset(): void {\n this.keyPointers = [NaN, NaN];\n this.isInProgress = false;\n }\n}\n"]},"metadata":{},"sourceType":"module"}