@senspark/ee
Version:
utility library for cocos creator
277 lines (276 loc) • 10.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var assert = require("assert");
var NestedPrefab_1 = require("./NestedPrefab");
var ProfileManager_1 = require("./ProfileManager");
var UnselectableComponent_1 = require("./UnselectableComponent");
var settingKey = 'use_nested_prefab';
// tslint:disable-next-line:ban-types
var cloneFunction = function (f) {
var result = function () {
return f.apply(this, arguments);
};
for (var key in f) {
if (f.hasOwnProperty(key)) {
result[key] = f[key];
}
}
return result;
};
var overwriteGetIntersectionList = function (oldFunction) {
cc.log('overwrite cc.engine.getIntersectionList.');
// Clone the original getIntersectionList function.
var original = cloneFunction(oldFunction).bind(cc.engine);
// Overwrite the getIntersectionList function.
return function (rect, t) {
var profile = ProfileManager_1.ProfileManager.getInstance();
if (!profile.loadData(settingKey)) {
return original(rect, t);
}
return original(rect, t).filter(function (entry) {
var node = entry.node;
assert(node !== null);
var comp = node.getComponent(UnselectableComponent_1.UnselectableComponent);
if (comp !== null && comp.enabled) {
// Ignore this node.
return false;
}
return true;
});
};
};
/** Version < 2 */
var overwriteDumpHierarchy = function (oldFunction) {
cc.log('overwrite _Scene.dumpHierarchy.');
var original = cloneFunction(oldFunction);
var NodeStates;
(function (NodeStates) {
NodeStates[NodeStates["Normal"] = 0] = "Normal";
NodeStates[NodeStates["Prefab"] = 1] = "Prefab";
NodeStates[NodeStates["Prefab_AutoSync"] = 2] = "Prefab_AutoSync";
NodeStates[NodeStates["Prefab_Missing"] = 3] = "Prefab_Missing";
})(NodeStates || (NodeStates = {}));
var getChildren = function (node) {
if (node.getComponent(UnselectableComponent_1.UnselectableComponent) !== null) {
// Ignore this node.
return undefined;
}
var state = NodeStates.Normal;
if (node._prefab) {
if (node._prefab.root && node._prefab.root._prefab.sync) {
state = NodeStates.Prefab_AutoSync;
}
else {
state = NodeStates.Prefab;
}
}
var children = [];
node._children.map(getChildren).forEach(function (entry) {
if (entry !== undefined) {
children.push(entry);
}
});
return {
name: node.name,
id: node.uuid,
children: children.length > 0 ? children : null,
state: state,
isActive: node._activeInHierarchy,
};
};
return (function (scene, includeScene) {
var profile = ProfileManager_1.ProfileManager.getInstance();
if (!profile.loadData(settingKey)) {
return original(scene, includeScene);
}
scene = scene || cc.director.getScene();
var nodes = includeScene ? [scene] : scene._children;
return nodes.map(getChildren);
});
};
/** Version < 2 */
var overwriteCreateNodeFromAsset = function (oldFunction) {
cc.log('overwrite _Scene.createNodeFromAsset.');
var original = cloneFunction(oldFunction);
return (function (uuid, callback) {
var profile = ProfileManager_1.ProfileManager.getInstance();
if (!profile.loadData('use_nested_prefab')) {
original(uuid, callback);
return;
}
cc.AssetLibrary.queryAssetInfo(uuid, function (err0, url, raw, ctor) {
if (ctor === cc.Prefab) {
cc.AssetLibrary.loadAsset(uuid, function (error, result) {
if (error) {
callback(error);
return;
}
if (result instanceof cc.Prefab) {
var defaultPrefabs = [
'sprite',
'sprite_splash',
'label',
'richtext',
'particlesystem',
'tiledmap',
'canvas',
'button',
'pageview',
'progressBar',
'editbox',
'slider',
'toggle',
'toggleContainer',
'videoplayer',
'webview',
];
if (defaultPrefabs.indexOf(result.name) === -1) {
callback(null, NestedPrefab_1.NestedPrefab.createNode(result));
}
else {
original(uuid, callback);
}
}
else {
callback(new Error("Expected asset type cc.Prefab but found " + cc.js.getClassName(result)));
}
});
}
else {
original(uuid, callback);
}
});
});
};
var overwriteGizmoRegisterEvent = function (oldFunction) {
cc.log('overwrite Editor.Gizmo._registerEvent');
return function () {
var _this = this;
var node = this._root.node;
var isIgnore = function () {
var profile = ProfileManager_1.ProfileManager.getInstance();
if (!profile.loadData(settingKey)) {
return false;
}
assert(_this.node !== null);
var comp = _this.node.getComponent(UnselectableComponent_1.UnselectableComponent);
return comp !== null && comp.enabled;
};
node.addEventListener("mousedown", function (event) {
if (isIgnore()) {
return;
}
var uuid = _this.nodes.map(function (item) { return item.uuid; });
Editor.Selection.select("node", uuid);
}, true);
node.addEventListener("mouseover", function (event) {
if (isIgnore()) {
return;
}
Editor.Selection.hover("node", _this.node.uuid);
}, true);
node.addEventListener("mouseleave", function (event) {
if (isIgnore()) {
return;
}
Editor.Selection.hover("node", null);
}, true);
node.addEventListener("mousemove", function (event) {
if (isIgnore()) {
return;
}
var element = event.srcElement;
element.instance.ignoreMouseMove || event.stopPropagation();
}, false);
};
};
var overwriteFunction = function (oldFunction, callback) {
var key = '__ee_js_overwrite';
var originalFunction = oldFunction;
if (oldFunction[key] !== undefined) {
originalFunction = oldFunction[key];
}
var newFunction = callback(originalFunction);
newFunction[key] = originalFunction;
return newFunction;
};
// Version >= 2
// app.asar/editor/page/scene-utils/dump/hierarchy.js
var dumpHierarchy = function (scene, includeScene) {
var NodeStates;
(function (NodeStates) {
NodeStates[NodeStates["Normal"] = 0] = "Normal";
NodeStates[NodeStates["Prefab"] = 1] = "Prefab";
NodeStates[NodeStates["Prefab_AutoSync"] = 2] = "Prefab_AutoSync";
NodeStates[NodeStates["Prefab_Missing"] = 3] = "Prefab_Missing";
})(NodeStates || (NodeStates = {}));
var getChildren = function (node, filter) {
if (filter && node.getComponent(UnselectableComponent_1.UnselectableComponent) !== null) {
// Ignore this node.
return undefined;
}
var state = NodeStates.Normal;
if (node._prefab) {
if (node._prefab.root) {
if (node._prefab.root._prefab.asset) {
if (node._prefab.root._prefab.sync) {
state = NodeStates.Prefab_AutoSync;
}
else {
state = NodeStates.Prefab;
}
}
else {
state = NodeStates.Prefab_Missing;
}
}
else {
state = NodeStates.Prefab;
}
}
var children = [];
node._children.map(function (item) { return getChildren(item, filter); }).forEach(function (entry) {
if (entry !== undefined) {
children.push(entry);
}
});
return {
name: node.name,
id: node.uuid,
children: children.length > 0 ? children : null,
prefabState: state,
locked: !!(node._objFlags & cc.Object.Flags.LockedInEditor),
isActive: node._activeInHierarchy,
hidden: node instanceof cc.PrivateNode,
};
};
var profile = ProfileManager_1.ProfileManager.getInstance();
scene = scene || cc.director.getScene();
var nodes = includeScene ? [scene] : scene._children;
return nodes.map(function (node) { return getChildren(node, profile.loadData(settingKey)); });
};
if (CC_EDITOR) {
cc.engine.getIntersectionList = overwriteFunction(cc.engine.getIntersectionList, overwriteGetIntersectionList);
if (cc.ENGINE_VERSION >= '2') {
var panels = Editor.UI.PolymerUtils.panels;
// app.asar/editor/builtin/scene/panel/scene.js
var scene = panels['scene'];
// app.asar/editor/builtin/scene/panel/messages/*.js
var messages = scene.prototype.messages;
messages['scene:query-hierarchy'] = function (event) {
if (!cc.engine.isInitialized) {
event.reply(null, '', []);
return;
}
var nodes = dumpHierarchy();
var uuid = _Scene.currentScene().uuid;
event.reply(null, uuid, nodes);
};
// TODO: createNodeFromAsset for version >= 2.
}
else {
_Scene.dumpHierarchy = overwriteFunction(_Scene.dumpHierarchy, overwriteDumpHierarchy);
_Scene.createNodeFromAsset = overwriteFunction(_Scene.createNodeFromAsset, overwriteCreateNodeFromAsset);
}
Editor.Gizmo.prototype._registerEvent = overwriteFunction(Editor.Gizmo.prototype._registerEvent, overwriteGizmoRegisterEvent);
}