UNPKG

@senspark/ee

Version:

utility library for cocos creator

153 lines (152 loc) 6.48 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); } return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var _a = cc._decorator, ccclass = _a.ccclass, menu = _a.menu, property = _a.property; /** Get ancestor nodes that contains cc.ScrollView. */ var getAncestors = function (event, node) { var targets = []; node._getCapturingTargets(event.type, targets); var views = targets .filter(function (item) { return item.getComponent(cc.ScrollView) !== null; }) .map(function (item) { return item.getComponent(cc.ScrollView); }); return views; }; var findBestScrollView = function (event, target) { var firstView = target.getComponent(cc.ScrollView); var bestView = firstView; // Assume the first view is the best. if (bestView.horizontal && bestView.vertical) { // Already capture both directions. } else { var delta = event.touch.getDelta(); // Check all ancestor scroll views. var ancestors = getAncestors(event, target); if (bestView.vertical && Math.abs(delta.x) > Math.abs(delta.y)) { ancestors.some(function (item) { if (item.horizontal) { bestView = item; return true; } return false; }); } if (bestView.horizontal && Math.abs(delta.x) < Math.abs(delta.y)) { ancestors.some(function (item) { if (item.vertical) { bestView = item; return true; } return false; }); } } return bestView; }; var NestedScrollView = /** @class */ (function (_super) { __extends(NestedScrollView, _super); function NestedScrollView() { return _super !== null && _super.apply(this, arguments) || this; } NestedScrollView.prototype.onEnable = function () { var scrollView = this.getComponent(cc.ScrollView); var listener = this.node._touchListener; if (listener !== null && scrollView !== null) { this.setupTouchBegan(listener); this.setupTouchMoved(listener); this.setupTouchEnded(listener); this.setupTouchCancelled(listener); } }; NestedScrollView.prototype.onDisable = function () { // TODO. }; NestedScrollView.prototype.setupTouchBegan = function (listener) { listener.onTouchBegan = function (touch, event) { var pos = touch.getLocation(); var node = this.owner; if (node._hitTest(pos, this)) { event.type = cc.Node.EventType.TOUCH_START; event.touch = touch; event.bubbles = true; node.dispatchEvent(event); // Continue to propagate (was disabled in _stopPropagationIfTargetIsMe). // Don't use this: event._propagationStopped = false; var views = getAncestors(event, node); views.forEach(function (view) { return view.node.dispatchEvent(event); }); // Reset best view. this.__bestView = undefined; return true; } return false; }; }; NestedScrollView.prototype.setupTouchMoved = function (listener) { listener.onTouchMoved = function (touch, event) { var node = this.owner; event.type = cc.Node.EventType.TOUCH_MOVE; event.touch = touch; event.bubbles = true; var bestView = this.__bestView; // Last calculated best view. if (bestView === undefined) { bestView = this.__bestView = findBestScrollView(event, node); } bestView.node.dispatchEvent(event); }; }; NestedScrollView.prototype.setupTouchEnded = function (listener) { listener.onTouchEnded = function (touch, event) { // Original lines in CCScrollView.js var pos = touch.getLocation(); var node = this.owner; if (node._hitTest(pos, this)) { event.type = cc.Node.EventType.TOUCH_END; } else { event.type = cc.Node.EventType.TOUCH_CANCEL; } event.touch = touch; event.bubbles = true; node.dispatchEvent(event); // Additional lines. var views = getAncestors(event, node); views.forEach(function (view) { return view.node.dispatchEvent(event); }); }; }; NestedScrollView.prototype.setupTouchCancelled = function (listener) { listener.onTouchCancelled = function (touch, event) { // Original lines in CCScrollView.js var node = this.owner; event.type = cc.Node.EventType.TOUCH_CANCEL; event.touch = touch; event.bubbles = true; node.dispatchEvent(event); // Additional lines. var views = getAncestors(event, node); views.forEach(function (view) { return view.node.dispatchEvent(event); }); }; }; NestedScrollView = __decorate([ ccclass, menu('ee/NestedScrollView') ], NestedScrollView); return NestedScrollView; }(cc.Component)); exports.NestedScrollView = NestedScrollView;