UNPKG

@nativescript-community/gesturehandler

Version:

Declarative API exposing platform native touch and gesture system to NativeScript.

412 lines 14.9 kB
import { Utils } from '@nativescript/core'; import { getClass } from '@nativescript/core/utils/types'; import { BaseGestureRootView, BaseNative, GestureHandlerStateEvent, GestureHandlerTouchEvent, GestureState, HandlerType, ManagerBase, ViewDisposeEvent, ViewInitEvent, install as installBase, nativeProperty } from './gesturehandler.common'; import { observe as gestureObserve } from './gestures_override'; export { GestureState, GestureHandlerStateEvent, GestureHandlerTouchEvent, HandlerType, ViewInitEvent, ViewDisposeEvent }; export var FlingDirection; (function (FlingDirection) { FlingDirection[FlingDirection["DIRECTION_LEFT"] = 2] = "DIRECTION_LEFT"; FlingDirection[FlingDirection["DIRECTION_UP"] = 4] = "DIRECTION_UP"; FlingDirection[FlingDirection["DIRECTION_DOWN"] = 8] = "DIRECTION_DOWN"; FlingDirection[FlingDirection["DIRECTION_RIGHT"] = 1] = "DIRECTION_RIGHT"; })(FlingDirection || (FlingDirection = {})); let installed = false; let installedOverrides = false; export function install(overrideNGestures = false) { if (!installed) { installed = true; installBase(overrideNGestures); } if (overrideNGestures === true && !installedOverrides) { installedOverrides = true; const NSView = require('@nativescript/core/ui/core/view').View; NSView.prototype._observe = function (type, callback, thisArg) { if (!this._gestureObservers[type]) { this._gestureObservers[type] = []; } this._gestureObservers[type].push(gestureObserve(this, type, callback, thisArg)); // if (type & GestureTypes.touch && this.isLoaded && !this.touchListenerIsSet) { // this.setOnTouchListener(); // } }; } } function toJsObject(objCObj) { if (objCObj === null || typeof objCObj !== 'object') { return objCObj; } let node, key, i, l; const oKeyArr = objCObj.allKeys; if (oKeyArr === undefined && objCObj.count !== undefined) { // array node = []; for (i = 0, l = objCObj.count; i < l; i++) { key = objCObj.objectAtIndex(i); node.push(toJsObject(key)); } } else if (oKeyArr !== undefined) { // object node = {}; for (i = 0, l = oKeyArr.count; i < l; i++) { key = oKeyArr.objectAtIndex(i); const val = objCObj.valueForKey(key); // Firestore can store nulls if (val === null) { node[key] = null; continue; } node[key] = getValueForClass(val); } } else { node = getValueForClass(objCObj); } return node; } function getValueForClass(val) { switch (getClass(val)) { case 'NSArray': case 'NSMutableArray': return toJsObject(val); case 'NSDictionary': case 'NSMutableDictionary': return toJsObject(val); case 'String': return String(val); case 'Boolean': return val; case 'Number': case 'NSDecimalNumber': return Number(String(val)); case 'Date': return new Date(val); default: console.log("Please report this at https://github.com/farfromrefug/@nativescript-community/gesturehandler/issues: iOS toJsObject is missing a converter for class '" + getClass(val) + "'. Casting to String as a fallback."); return String(val); } } export class GestureRootView extends BaseGestureRootView { } var HandlerDelegate = /** @class */ (function (_super) { __extends(HandlerDelegate, _super); function HandlerDelegate() { return _super !== null && _super.apply(this, arguments) || this; } HandlerDelegate.new = function () { return _super.new.call(this); }; // public initWithOwner(owner: WeakRef<Handler<any, any>>): HandlerDelegate { // this._owner = owner; // return this; // } HandlerDelegate.initWithOwner = function (owner) { var impl = HandlerDelegate.new(); impl._owner = owner; return impl; }; HandlerDelegate.prototype.gestureHandlerDidChangeStatePrevStateExtraDataView = function (handler, state, prevState, extraData, view) { var owner = this._owner && this._owner.get(); if (owner) { owner.notify({ eventName: GestureHandlerStateEvent, object: owner, data: { state: state, prevState: prevState, ios: handler, extraData: toJsObject(extraData), view: view.nsView ? view.nsView.get() : null } }); } }; HandlerDelegate.prototype.gestureHandlerTouchEventOnViewStateExtraData = function (handler, view, state, extraData) { var owner = this._owner && this._owner.get(); if (owner) { owner.notify({ eventName: GestureHandlerTouchEvent, object: owner, data: { state: state, ios: handler, extraData: toJsObject(extraData), view: view.nsView ? view.nsView.get() : null } }); } }; HandlerDelegate.prototype.gestureHandlerShouldActivateForEvent = function (handler, extraData) { var owner = this._owner && this._owner.get(); if (owner && owner.options && owner.options.shouldStartGesture) { return owner.options.shouldStartGesture(toJsObject(extraData)); } return true; }; HandlerDelegate.ObjCProtocols = [GestureHandlerDelegate]; return HandlerDelegate; }(NSObject)); export { HandlerDelegate }; export class Handler extends BaseNative { constructor() { super(...arguments); this.nativeGetterKey = 'nativeView'; } createNative() { return null; } attachToView(view) { if (view === this.attachedView) { return; } if (this.attachedView) { this.detachFromView(this.attachedView); } this.attachedView = view; this.delegate = HandlerDelegate.initWithOwner(new WeakRef(this)); this.native.delegate = this.delegate; this.manager.get().attachGestureHandler(this, view); } detachFromView(view) { if ((view && view !== this.attachedView) || !this.attachedView) { return; } if (!this.attachedView) { return; } const tag = this.native.tag; this.delegate = this.native.delegate = null; this.manager.get().detachGestureHandler(tag, this.attachedView); this.attachedView = null; } getTag() { return this.native.tag; } setTag(value) { // cant change tag on ios } getView() { return this.attachedView; } cancel() { this.native.cancel(); } } __decorate([ nativeProperty ], Handler.prototype, "enabled", void 0); __decorate([ nativeProperty ], Handler.prototype, "shouldCancelWhenOutside", void 0); export class TapHandler extends Handler { } __decorate([ nativeProperty ], TapHandler.prototype, "numberOfTaps", void 0); __decorate([ nativeProperty ], TapHandler.prototype, "maxDurationMs", void 0); __decorate([ nativeProperty ], TapHandler.prototype, "maxDelayMs", void 0); __decorate([ nativeProperty ], TapHandler.prototype, "maxDeltaX", void 0); __decorate([ nativeProperty ], TapHandler.prototype, "maxDeltaY", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], TapHandler.prototype, "maxDist", void 0); __decorate([ nativeProperty ], TapHandler.prototype, "minPointers", void 0); export class PanHandler extends Handler { } __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "minDist", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "activeOffsetXStart", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "activeOffsetXEnd", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "failOffsetXStart", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "failOffsetXEnd", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "activeOffsetYStart", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "activeOffsetYEnd", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "failOffsetYStart", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "failOffsetYEnd", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "minVelocity", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "minVelocityX", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PanHandler.prototype, "minVelocityY", void 0); __decorate([ nativeProperty ], PanHandler.prototype, "minPointers", void 0); __decorate([ nativeProperty ], PanHandler.prototype, "maxPointers", void 0); __decorate([ nativeProperty({ nativeSetterName: 'setAverageTouches' }) ], PanHandler.prototype, "avgTouches", void 0); __decorate([ nativeProperty ], PanHandler.prototype, "numberOfPointers", void 0); export class PinchHandler extends Handler { } __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], PinchHandler.prototype, "minSpan", void 0); export class FlingHandler extends Handler { } __decorate([ nativeProperty ], FlingHandler.prototype, "numberOfPointers", void 0); __decorate([ nativeProperty ], FlingHandler.prototype, "direction", void 0); export class ForceTouchGestureHandler extends Handler { } __decorate([ nativeProperty ], ForceTouchGestureHandler.prototype, "minForce", void 0); __decorate([ nativeProperty ], ForceTouchGestureHandler.prototype, "maxForce", void 0); export class LongPressHandler extends Handler { } __decorate([ nativeProperty ], LongPressHandler.prototype, "minDurationMs", void 0); __decorate([ nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } }) ], LongPressHandler.prototype, "maxDist", void 0); export class RotationHandler extends Handler { } export class NativeViewHandler extends Handler { } __decorate([ nativeProperty ], NativeViewHandler.prototype, "shouldActivateOnStart", void 0); __decorate([ nativeProperty ], NativeViewHandler.prototype, "disallowInterruption", void 0); export class Manager extends ManagerBase { constructor() { super(...arguments); this.viewListeners = new Map(); } get manager() { if (!this._manager) { this._manager = GestureHandlerManager.alloc().init(); } return this._manager; } static getInstance() { if (!Manager.sManager) { Manager.sManager = new Manager(); } return Manager.sManager; } createGestureHandler(handlerName, handlerTag, config) { const nHandler = this.manager.createGestureHandlerTagConfig(handlerName, handlerTag, config ? NSDictionary.dictionaryWithDictionary(config) : null); let result; switch (handlerName) { case 'tap': result = new TapHandler(config, nHandler); break; case 'pan': result = new PanHandler(config, nHandler); break; case 'fling': result = new FlingHandler(config, nHandler); break; case 'longPress': result = new LongPressHandler(config, nHandler); break; case 'nativeView': result = new NativeViewHandler(config, nHandler); break; case 'pinch': result = new PinchHandler(config, nHandler); break; case 'rotation': result = new RotationHandler(config, nHandler); break; case 'forceTouch': result = new ForceTouchGestureHandler(config, nHandler); break; default: result = new Handler(config, nHandler); break; } result.manager = new WeakRef(this); return result; } attachGestureHandler(handler, view) { this.manager.registerGestureHandler(handler.native); const tag = handler.native.tag; if (view.nativeView) { this.manager.attachGestureHandlerToView(tag, view[handler.nativeGetterKey]); } const onInit = () => { // we need to ensure the handler is registered // in case it was dropped in dispose this.manager.registerGestureHandler(handler.native); this.manager.attachGestureHandlerToView(tag, view[handler.nativeGetterKey]); }; const onDispose = () => this.manager.dropGestureHandler(tag); view.on(ViewInitEvent, onInit, this); view.on(ViewDisposeEvent, onDispose, this); let viewListeners = this.viewListeners.get(view); if (!viewListeners) { viewListeners = new Map(); this.viewListeners.set(view, viewListeners); } viewListeners.set(tag, { init: onInit, dispose: onDispose }); } detachGestureHandler(handlerTag, view) { if (view.nativeView) { this.manager.dropGestureHandler(handlerTag); } if (view) { const viewListeners = this.viewListeners.get(view); if (viewListeners) { const listeners = viewListeners.get(handlerTag); if (listeners) { view.off(ViewInitEvent, listeners.init, this); view.off(ViewDisposeEvent, () => listeners.dispose, this); viewListeners.delete(handlerTag); if (viewListeners.size === 0) { this.viewListeners.delete(view); } } } } } } //# sourceMappingURL=gesturehandler.ios.js.map