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 _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 { DEFAULT_TOUCH_SLOP } from \"../constants\";\nimport { EventTypes } from \"../interfaces\";\nvar ScaleGestureDetector = function () {\n function ScaleGestureDetector(callbacks) {\n _classCallCheck(this, ScaleGestureDetector);\n _defineProperty(this, \"onScaleBegin\", void 0);\n _defineProperty(this, \"onScale\", void 0);\n _defineProperty(this, \"onScaleEnd\", void 0);\n _defineProperty(this, \"focusX\", void 0);\n _defineProperty(this, \"focusY\", void 0);\n _defineProperty(this, \"currentSpan\", void 0);\n _defineProperty(this, \"prevSpan\", void 0);\n _defineProperty(this, \"initialSpan\", void 0);\n _defineProperty(this, \"currentTime\", void 0);\n _defineProperty(this, \"prevTime\", void 0);\n _defineProperty(this, \"inProgress\", false);\n _defineProperty(this, \"spanSlop\", void 0);\n _defineProperty(this, \"minSpan\", void 0);\n this.onScaleBegin = callbacks.onScaleBegin;\n this.onScale = callbacks.onScale;\n this.onScaleEnd = callbacks.onScaleEnd;\n this.spanSlop = DEFAULT_TOUCH_SLOP * 2;\n this.minSpan = 0;\n }\n _createClass(ScaleGestureDetector, [{\n key: \"onTouchEvent\",\n value: function onTouchEvent(event, tracker) {\n this.currentTime = event.time;\n var action = event.eventType;\n var numOfPointers = tracker.getTrackedPointersCount();\n var streamComplete = action === EventTypes.UP || action === EventTypes.ADDITIONAL_POINTER_UP || action === EventTypes.CANCEL;\n if (action === EventTypes.DOWN || streamComplete) {\n if (this.inProgress) {\n this.onScaleEnd(this);\n this.inProgress = false;\n this.initialSpan = 0;\n }\n if (streamComplete) {\n return true;\n }\n }\n var configChanged = action === EventTypes.DOWN || action === EventTypes.ADDITIONAL_POINTER_UP || action === EventTypes.ADDITIONAL_POINTER_DOWN;\n var pointerUp = action === EventTypes.ADDITIONAL_POINTER_UP;\n var ignoredPointer = pointerUp ? event.pointerId : undefined;\n var div = pointerUp ? numOfPointers - 1 : numOfPointers;\n var sumX = tracker.getSumX(ignoredPointer);\n var sumY = tracker.getSumY(ignoredPointer);\n var focusX = sumX / div;\n var focusY = sumY / div;\n var devSumX = 0;\n var devSumY = 0;\n tracker.getData().forEach(function (value, key) {\n if (key === ignoredPointer) {\n return;\n }\n devSumX += Math.abs(value.lastX - focusX);\n devSumY += Math.abs(value.lastY - focusY);\n });\n var devX = devSumX / div;\n var devY = devSumY / div;\n var spanX = devX * 2;\n var spanY = devY * 2;\n var span = Math.hypot(spanX, spanY);\n var wasInProgress = this.inProgress;\n this.focusX = focusX;\n this.focusY = focusY;\n if (this.inProgress && (span < this.minSpan || configChanged)) {\n this.onScaleEnd(this);\n this.inProgress = false;\n this.initialSpan = span;\n }\n if (configChanged) {\n this.initialSpan = this.prevSpan = this.currentSpan = span;\n }\n if (!this.inProgress && span >= this.minSpan && (wasInProgress || Math.abs(span - this.initialSpan) > this.spanSlop)) {\n this.prevSpan = this.currentSpan = span;\n this.prevTime = this.currentTime;\n this.inProgress = this.onScaleBegin(this);\n }\n if (action !== EventTypes.MOVE) {\n return true;\n }\n this.currentSpan = span;\n if (this.inProgress && !this.onScale(this)) {\n return true;\n }\n this.prevSpan = this.currentSpan;\n this.prevTime = this.currentTime;\n return true;\n }\n }, {\n key: \"getCurrentSpan\",\n value: function getCurrentSpan() {\n return this.currentSpan;\n }\n }, {\n key: \"getFocusX\",\n value: function getFocusX() {\n return this.focusX;\n }\n }, {\n key: \"getFocusY\",\n value: function getFocusY() {\n return this.focusY;\n }\n }, {\n key: \"getTimeDelta\",\n value: function getTimeDelta() {\n return this.currentTime - this.prevTime;\n }\n }, {\n key: \"getScaleFactor\",\n value: function getScaleFactor(numOfPointers) {\n if (numOfPointers < 2) {\n return 1;\n }\n return this.prevSpan > 0 ? this.currentSpan / this.prevSpan : 1;\n }\n }]);\n return ScaleGestureDetector;\n}();\nexport { ScaleGestureDetector as default };","map":{"version":3,"sources":["ScaleGestureDetector.ts"],"names":["DEFAULT_TOUCH_SLOP","EventTypes","ScaleGestureDetector","constructor","callbacks","onScaleBegin","onScale","onScaleEnd","spanSlop","minSpan","onTouchEvent","event","tracker","currentTime","time","action","eventType","numOfPointers","getTrackedPointersCount","streamComplete","UP","ADDITIONAL_POINTER_UP","CANCEL","DOWN","inProgress","initialSpan","configChanged","ADDITIONAL_POINTER_DOWN","pointerUp","ignoredPointer","pointerId","undefined","div","sumX","getSumX","sumY","getSumY","focusX","focusY","devSumX","devSumY","getData","forEach","value","key","Math","abs","lastX","lastY","devX","devY","spanX","spanY","span","hypot","wasInProgress","prevSpan","currentSpan","prevTime","MOVE","getCurrentSpan","getFocusX","getFocusY","getTimeDelta","getScaleFactor"],"mappings":"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","sourcesContent":["import { DEFAULT_TOUCH_SLOP } from '../constants';\nimport { AdaptedEvent, EventTypes } from '../interfaces';\n\nimport PointerTracker from '../tools/PointerTracker';\n\nexport interface ScaleGestureListener {\n onScaleBegin: (detector: ScaleGestureDetector) => boolean;\n onScale: (detector: ScaleGestureDetector) => boolean;\n onScaleEnd: (detector: ScaleGestureDetector) => void;\n}\n\nexport default class ScaleGestureDetector implements ScaleGestureListener {\n public onScaleBegin: (detector: ScaleGestureDetector) => boolean;\n public onScale: (detector: ScaleGestureDetector) => boolean;\n public onScaleEnd: (detector: ScaleGestureDetector) => void;\n\n private focusX!: number;\n private focusY!: number;\n\n private currentSpan!: number;\n private prevSpan!: number;\n private initialSpan!: number;\n\n private currentTime!: number;\n private prevTime!: number;\n\n private inProgress = false;\n\n private spanSlop: number;\n private minSpan: number;\n\n public constructor(callbacks: ScaleGestureListener) {\n this.onScaleBegin = callbacks.onScaleBegin;\n this.onScale = callbacks.onScale;\n this.onScaleEnd = callbacks.onScaleEnd;\n\n this.spanSlop = DEFAULT_TOUCH_SLOP * 2;\n this.minSpan = 0;\n }\n\n public onTouchEvent(event: AdaptedEvent, tracker: PointerTracker): boolean {\n this.currentTime = event.time;\n\n const action: EventTypes = event.eventType;\n const numOfPointers = tracker.getTrackedPointersCount();\n\n const streamComplete: boolean =\n action === EventTypes.UP ||\n action === EventTypes.ADDITIONAL_POINTER_UP ||\n action === EventTypes.CANCEL;\n\n if (action === EventTypes.DOWN || streamComplete) {\n if (this.inProgress) {\n this.onScaleEnd(this);\n this.inProgress = false;\n this.initialSpan = 0;\n }\n\n if (streamComplete) {\n return true;\n }\n }\n\n const configChanged: boolean =\n action === EventTypes.DOWN ||\n action === EventTypes.ADDITIONAL_POINTER_UP ||\n action === EventTypes.ADDITIONAL_POINTER_DOWN;\n\n const pointerUp = action === EventTypes.ADDITIONAL_POINTER_UP;\n\n const ignoredPointer: number | undefined = pointerUp\n ? event.pointerId\n : undefined;\n\n //Determine focal point\n\n const div: number = pointerUp ? numOfPointers - 1 : numOfPointers;\n\n const sumX = tracker.getSumX(ignoredPointer);\n const sumY = tracker.getSumY(ignoredPointer);\n\n const focusX = sumX / div;\n const focusY = sumY / div;\n\n //Determine average deviation from focal point\n\n let devSumX = 0;\n let devSumY = 0;\n\n tracker.getData().forEach((value, key) => {\n if (key === ignoredPointer) {\n return;\n }\n\n devSumX += Math.abs(value.lastX - focusX);\n devSumY += Math.abs(value.lastY - focusY);\n });\n\n const devX: number = devSumX / div;\n const devY: number = devSumY / div;\n\n const spanX: number = devX * 2;\n const spanY: number = devY * 2;\n\n const span = Math.hypot(spanX, spanY);\n\n //Begin/end events\n const wasInProgress: boolean = this.inProgress;\n this.focusX = focusX;\n this.focusY = focusY;\n\n if (this.inProgress && (span < this.minSpan || configChanged)) {\n this.onScaleEnd(this);\n this.inProgress = false;\n this.initialSpan = span;\n }\n\n if (configChanged) {\n this.initialSpan = this.prevSpan = this.currentSpan = span;\n }\n\n if (\n !this.inProgress &&\n span >= this.minSpan &&\n (wasInProgress || Math.abs(span - this.initialSpan) > this.spanSlop)\n ) {\n this.prevSpan = this.currentSpan = span;\n this.prevTime = this.currentTime;\n this.inProgress = this.onScaleBegin(this);\n }\n\n //Handle motion\n if (action !== EventTypes.MOVE) {\n return true;\n }\n\n this.currentSpan = span;\n\n if (this.inProgress && !this.onScale(this)) {\n return true;\n }\n\n this.prevSpan = this.currentSpan;\n this.prevTime = this.currentTime;\n\n return true;\n }\n\n public getCurrentSpan(): number {\n return this.currentSpan;\n }\n\n public getFocusX(): number {\n return this.focusX;\n }\n\n public getFocusY(): number {\n return this.focusY;\n }\n\n public getTimeDelta(): number {\n return this.currentTime - this.prevTime;\n }\n\n public getScaleFactor(numOfPointers: number): number {\n if (numOfPointers < 2) {\n return 1;\n }\n\n return this.prevSpan > 0 ? this.currentSpan / this.prevSpan : 1;\n }\n}\n"]},"metadata":{},"sourceType":"module"}