Skip to content

Commit 5d03a7d

Browse files
committed
fix: override rewrite to get closer to N
1 parent 6a4eb59 commit 5d03a7d

File tree

1 file changed

+215
-30
lines changed

1 file changed

+215
-30
lines changed

src/gestures_override.ts

Lines changed: 215 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { EventData, View } from '@nativescript/core';
2-
import { GestureEventData, GestureTypes, GesturesObserver as NGesturesObserver, TouchAction, toString as gestureToString } from '@nativescript/core/ui/gestures';
2+
import { GestureEventData, GestureStateTypes, GestureTypes, GesturesObserver as NGesturesObserver, SwipeDirection, TouchAction, toString as gestureToString } from '@nativescript/core/ui/gestures';
33
import { layout } from '@nativescript/core/utils/utils';
44
import { Manager } from './gesturehandler';
5-
import { GestureHandlerStateEvent, GestureHandlerTouchEvent, GestureState, GestureStateEventData, HandlerType } from './gesturehandler.common';
5+
import { GestureHandlerStateEvent, GestureHandlerTouchEvent, GestureState, GestureStateEventData, HandlerType, ROOT_GESTURE_HANDLER_TAG } from './gesturehandler.common';
66

77
export function observe(target: View, type: GestureTypes, callback: (args: GestureEventData) => void, context?: any): GesturesObserver {
88
const observer = new GesturesObserver(target, callback, context);
@@ -47,6 +47,12 @@ export class GesturesObserver {
4747
if (!target['DOUBLE_TAP_HANDLER_TAG']) {
4848
target['DOUBLE_TAP_HANDLER_TAG'] = TAG++;
4949
}
50+
if (!target['PINCH_HANDLER_TAG']) {
51+
target['PINCH_HANDLER_TAG'] = TAG++;
52+
}
53+
if (!target['PAN_HANDLER_TAG']) {
54+
target['PAN_HANDLER_TAG'] = TAG++;
55+
}
5056
this._callback = callback;
5157
this._context = context;
5258
}
@@ -88,7 +94,7 @@ export class GesturesObserver {
8894
}
8995
private _notifyTouch: boolean;
9096

91-
private _eventData: TouchGestureEventData;
97+
private _eventData: { [k: number]: CommonGestureEventData | TouchGestureEventData } = {};
9298

9399
private _onTargetLoaded: (data: EventData) => void;
94100
private _onTargetUnloaded: (data: EventData) => void;
@@ -116,32 +122,49 @@ export class GesturesObserver {
116122
this._notifyTouch = false;
117123
this._eventData = null;
118124
}
125+
126+
private emitEvent(type: GestureTypes, event: GestureStateEventData) {
127+
if (this.callback) {
128+
let eventData = this._eventData[type] as CommonGestureEventData;
129+
if (!eventData) {
130+
switch (type) {
131+
case GestureTypes.pan:
132+
this._eventData[type] = eventData = new PanGestureEventData(type);
133+
break;
134+
case GestureTypes.pinch:
135+
this._eventData[type] = eventData = new PinchGestureEventData(type);
136+
break;
137+
case GestureTypes.swipe:
138+
this._eventData[type] = eventData = new SwipeGestureEventData(type);
139+
break;
140+
default:
141+
this._eventData[type] = eventData = new CommonGestureEventData(type);
142+
break;
143+
}
144+
}
145+
eventData.prepare(this.target, event.data);
146+
_executeCallback(this, eventData);
147+
// this.callback.call(this._context, {
148+
// eventName: gestureToString(type),
149+
// object: event.data.view,
150+
// type,
151+
// ...event.data,
152+
// ...event.data.extraData,
153+
// });
154+
}
155+
}
119156
private onGestureStateChange(type: GestureTypes, triggerOnstate = -1) {
120157
return (event: GestureStateEventData) => {
121158
if (triggerOnstate !== -1 && event.data.state !== triggerOnstate) {
122159
return;
123160
}
124-
if (this.callback) {
125-
this.callback.call(this._context, {
126-
eventName: gestureToString(type),
127-
object: event.data.view,
128-
type,
129-
...event.data,
130-
...event.data.extraData,
131-
});
132-
}
161+
this.emitEvent(type, event);
133162
};
134163
}
135164
private onGestureTouchChange(type: GestureTypes) {
136165
return (event: GestureStateEventData) => {
137-
if (this.callback && event.data.state === GestureState.ACTIVE) {
138-
this.callback.call(this._context, {
139-
eventName: gestureToString(type),
140-
object: event.data.view,
141-
type,
142-
...event.data,
143-
...event.data.extraData,
144-
});
166+
if (event.data.state === GestureState.ACTIVE) {
167+
this.emitEvent(type, event);
145168
}
146169
};
147170
}
@@ -163,6 +186,7 @@ export class GesturesObserver {
163186
if (type & GestureTypes.tap) {
164187
if (!gestureHandler) {
165188
gestureHandler = manager.createGestureHandler(HandlerType.TAP, target['TAP_HANDLER_TAG'], {
189+
simultaneousHandlers: [ROOT_GESTURE_HANDLER_TAG],
166190
waitFor: [target['LONGPRESS_HANDLER_TAG'], target['DOUBLE_TAP_HANDLER_TAG']],
167191
});
168192
gestureHandler.attachToView(target);
@@ -172,7 +196,9 @@ export class GesturesObserver {
172196
}
173197
if (type & GestureTypes.longPress) {
174198
if (!gestureHandler) {
175-
gestureHandler = manager.createGestureHandler(HandlerType.LONG_PRESS, target['LONGPRESS_HANDLER_TAG']);
199+
gestureHandler = manager.createGestureHandler(HandlerType.LONG_PRESS, target['LONGPRESS_HANDLER_TAG'], {
200+
simultaneousHandlers: [ROOT_GESTURE_HANDLER_TAG],
201+
});
176202
gestureHandler.attachToView(target);
177203
target._gestureHandlers[type] = gestureHandler;
178204
}
@@ -182,6 +208,7 @@ export class GesturesObserver {
182208
if (!gestureHandler) {
183209
gestureHandler = manager.createGestureHandler(HandlerType.TAP, target['DOUBLE_TAP_HANDLER_TAG'], {
184210
numberOfTaps: 2,
211+
simultaneousHandlers: [ROOT_GESTURE_HANDLER_TAG],
185212
});
186213
gestureHandler.attachToView(target);
187214
target._gestureHandlers[type] = gestureHandler;
@@ -191,7 +218,9 @@ export class GesturesObserver {
191218

192219
if (type & GestureTypes.pinch) {
193220
if (!gestureHandler) {
194-
gestureHandler = manager.createGestureHandler(HandlerType.PINCH, TAG++);
221+
gestureHandler = manager.createGestureHandler(HandlerType.PINCH, target['PINCH_HANDLER_TAG'], {
222+
simultaneousHandlers: [target['PAN_HANDLER_TAG'], ROOT_GESTURE_HANDLER_TAG],
223+
});
195224
gestureHandler.attachToView(target);
196225
target._gestureHandlers[type] = gestureHandler;
197226
}
@@ -201,7 +230,9 @@ export class GesturesObserver {
201230

202231
if (type & GestureTypes.swipe) {
203232
if (!gestureHandler) {
204-
gestureHandler = manager.createGestureHandler(HandlerType.FLING, TAG++);
233+
gestureHandler = manager.createGestureHandler(HandlerType.FLING, TAG++, {
234+
simultaneousHandlers: [ROOT_GESTURE_HANDLER_TAG],
235+
});
205236
gestureHandler.attachToView(target);
206237
target._gestureHandlers[type] = gestureHandler;
207238
}
@@ -210,7 +241,9 @@ export class GesturesObserver {
210241

211242
if (type & GestureTypes.pan) {
212243
if (!gestureHandler) {
213-
gestureHandler = manager.createGestureHandler(HandlerType.PAN, TAG++, {});
244+
gestureHandler = manager.createGestureHandler(HandlerType.PAN, target['PAN_HANDLER_TAG'], {
245+
simultaneousHandlers: [target['PINCH_HANDLER_TAG'], ROOT_GESTURE_HANDLER_TAG],
246+
});
214247
gestureHandler.attachToView(target);
215248
target._gestureHandlers[type] = gestureHandler;
216249
}
@@ -220,7 +253,9 @@ export class GesturesObserver {
220253

221254
if (type & GestureTypes.rotation) {
222255
if (!gestureHandler) {
223-
gestureHandler = manager.createGestureHandler(HandlerType.ROTATION, TAG++, {});
256+
gestureHandler = manager.createGestureHandler(HandlerType.ROTATION, TAG++, {
257+
simultaneousHandlers: [ROOT_GESTURE_HANDLER_TAG],
258+
});
224259
gestureHandler.attachToView(target);
225260
target._gestureHandlers[type] = gestureHandler;
226261
}
@@ -237,11 +272,12 @@ export class GesturesObserver {
237272

238273
public androidOnTouchEvent(motionEvent: android.view.MotionEvent) {
239274
if (this._notifyTouch) {
240-
if (!this._eventData) {
241-
this._eventData = new TouchGestureEventData();
275+
let eventData = this._eventData[GestureTypes.touch];
276+
if (!eventData) {
277+
eventData = this._eventData[GestureTypes.touch] = new TouchGestureEventData();
242278
}
243-
this._eventData.prepare(this.target, motionEvent);
244-
_executeCallback(this, this._eventData);
279+
eventData.prepare(this.target, motionEvent);
280+
_executeCallback(this, eventData);
245281
}
246282
}
247283
}
@@ -262,14 +298,135 @@ class Pointer implements Pointer {
262298
return this.event.getY(this.android) / layout.getDisplayDensity();
263299
}
264300
}
265-
class TouchGestureEventData implements TouchGestureEventData {
301+
class GesturePointer {
302+
android: number;
303+
ios: number;
304+
private event: any;
305+
constructor(index: number, private x, private y) {
306+
this.android = index;
307+
}
308+
309+
getX(): number {
310+
return this.x;
311+
}
312+
313+
getY(): number {
314+
return this.y;
315+
}
316+
}
317+
318+
class CommonGestureEventData implements GestureEventData {
319+
ios;
320+
android;
321+
eventName: string;
322+
type: GestureTypes;
323+
view: View;
324+
object: any;
325+
eventData: {
326+
state: GestureState;
327+
ios?: any; // native View
328+
android?: any; // native View
329+
view?: View; // native View
330+
extraData: {
331+
numberOfPointers: number;
332+
[k: string]: number | string;
333+
};
334+
};
335+
state: GestureStateTypes;
336+
337+
private _activePointers: GesturePointer[];
338+
private _allPointers: GesturePointer[];
339+
340+
constructor(type: GestureTypes) {
341+
this.eventName = gestureToString(type);
342+
this.type = type;
343+
}
344+
345+
public prepare(view: View, eventData) {
346+
this.view = view;
347+
this.object = view;
348+
this._activePointers = undefined;
349+
this._allPointers = undefined;
350+
this.eventData = eventData;
351+
switch (this.eventData.state) {
352+
case GestureState.BEGAN:
353+
this.state = GestureStateTypes.began;
354+
break;
355+
case GestureState.CANCELLED:
356+
case GestureState.FAILED:
357+
this.state = GestureStateTypes.cancelled;
358+
break;
359+
case GestureState.ACTIVE:
360+
this.state = GestureStateTypes.changed;
361+
break;
362+
case GestureState.END:
363+
this.state = GestureStateTypes.ended;
364+
break;
365+
}
366+
}
367+
368+
get extraData() {
369+
return this.eventData.extraData;
370+
}
371+
372+
getPointerCount(): number {
373+
return this.extraData.numberOfPointers;
374+
}
375+
376+
getActivePointers() {
377+
// Only one active pointer in Android
378+
if (!this._activePointers) {
379+
const positions = this.extraData.positions;
380+
this._activePointers = [new GesturePointer(0, positions[0], positions[1])];
381+
}
382+
return this._activePointers;
383+
}
384+
385+
getAllPointers() {
386+
if (!this._allPointers) {
387+
this._allPointers = [];
388+
const positions = this.extraData.positions;
389+
for (let i = 0; i < this.getPointerCount(); i++) {
390+
this._allPointers.push(new GesturePointer(i, positions[i * 2], positions[i * 2 + 1]));
391+
}
392+
}
393+
return this._allPointers;
394+
}
395+
396+
getX(): number {
397+
return this.extraData.x as number;
398+
}
399+
400+
getY(): number {
401+
return this.extraData.y as number;
402+
}
403+
404+
private getActionType(e: android.view.MotionEvent): string {
405+
switch (e.getActionMasked()) {
406+
case android.view.MotionEvent.ACTION_DOWN:
407+
case android.view.MotionEvent.ACTION_POINTER_DOWN:
408+
return TouchAction.down;
409+
case android.view.MotionEvent.ACTION_MOVE:
410+
return TouchAction.move;
411+
case android.view.MotionEvent.ACTION_UP:
412+
case android.view.MotionEvent.ACTION_POINTER_UP:
413+
return TouchAction.up;
414+
case android.view.MotionEvent.ACTION_CANCEL:
415+
return TouchAction.cancel;
416+
}
417+
418+
return '';
419+
}
420+
}
421+
class TouchGestureEventData {
266422
eventName: string = gestureToString(GestureTypes.touch);
267423
type: GestureTypes = GestureTypes.touch;
268424
ios: any = undefined;
269425
action: string;
270426
view: View;
271427
android: android.view.MotionEvent;
272428
object: any;
429+
state: GestureStateTypes;
273430

274431
private _activePointers: Pointer[];
275432
private _allPointers: Pointer[];
@@ -331,6 +488,34 @@ class TouchGestureEventData implements TouchGestureEventData {
331488
}
332489
}
333490

491+
function _getSwipeDirection(direction: string): SwipeDirection {
492+
return SwipeDirection[direction];
493+
}
494+
class SwipeGestureEventData extends CommonGestureEventData {
495+
get direction() {
496+
return _getSwipeDirection(this.extraData.direction as string);
497+
}
498+
}
499+
class PanGestureEventData extends CommonGestureEventData {
500+
get deltaX() {
501+
return this.eventData.extraData.translationX;
502+
}
503+
get deltaY() {
504+
return this.eventData.extraData.translationY;
505+
}
506+
}
507+
class PinchGestureEventData extends CommonGestureEventData {
508+
getFocusX() {
509+
return this.eventData.extraData.focalX;
510+
}
511+
getFocusY() {
512+
return this.eventData.extraData.focalY;
513+
}
514+
get scale() {
515+
return this.eventData.extraData.scale;
516+
}
517+
}
518+
334519
function _executeCallback(observer: GesturesObserver, args: GestureEventData) {
335520
if (observer && observer.callback) {
336521
observer.callback.call((observer as any)._context, args);

0 commit comments

Comments
 (0)