@senspark/ee
Version:
utility library for cocos creator
153 lines (152 loc) • 6.48 kB
JavaScript
;
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;