';
this.el = root;
this.body = root.querySelector('#pw-inspector-body');
return root;
};
InspectorPanel.prototype.render = function () {
var body = this.body;
var node = this._node;
var cc = this._cc;
if (!body) return;
if (!node || !node.isValid) {
body.innerHTML = '
未选中节点
';
return;
}
var p = node.getPosition ? node.getPosition() : node.position;
var e = node.eulerAngles || (node.getRotation ? { x: 0, y: 0, z: 0 } : { x: 0, y: 0, z: 0 });
if (node.eulerAngles) e = node.eulerAngles;
var s = node.getScale ? node.getScale() : node.scale;
var html = [];
html.push('
');
}
if (node.components) {
for (var i = 0; i < node.components.length; i++) {
var comp = node.components[i];
if (!comp || !comp.constructor) continue;
var cname = comp.constructor.name;
if (cname === 'UITransform') continue;
html.push('
' + escapeHtml(cname) + '
');
var keys = Object.keys(comp);
var shown = 0;
for (var k = 0; k < keys.length && shown < 24; k++) {
var key = keys[k];
if (!key || key.charAt(0) === '_' || key === 'node' || key === 'uuid') continue;
var val = comp[key];
var t = typeof val;
if (t === 'number') {
html.push(fieldNum(key, 'c' + i + '_' + key, val));
shown++;
} else if (t === 'boolean') {
html.push(fieldCheck(key, 'c' + i + '_' + key, val));
shown++;
} else if (t === 'string') {
html.push(fieldText(key, 'c' + i + '_' + key, val));
shown++;
}
}
if (!shown) html.push('无可编辑公开字段');
html.push('
');
}
}
body.innerHTML = html.join('');
this._bindFields(node, uit);
};
InspectorPanel.prototype._bindFields = function (node, uit) {
var self = this;
var body = this.body;
var cc = this._cc;
function byFid(id) {
return body.querySelector('[data-fid="' + id.replace(/"/g, '') + '"]');
}
function num(id) {
var el = byFid(id);
return el ? parseFloat(el.value) : NaN;
}
function bind(id, apply) {
var el = byFid(id);
if (!el) return;
var run = function () {
try {
apply(el);
} catch (e) {
console.warn('[调试工作台] 设置属性失败', id, e);
}
};
el.addEventListener('change', run);
el.addEventListener('input', run);
}
function readPos() {
return node.getPosition ? node.getPosition() : node.position;
}
function writePos(x, y, z) {
if (typeof node.setPosition === 'function') {
node.setPosition(x, y, z);
return;
}
if (cc && cc.Vec3) node.position = new cc.Vec3(x, y, z);
}
function readScale() {
return node.getScale ? node.getScale() : node.scale;
}
function writeScale(x, y, z) {
if (typeof node.setScale === 'function') {
node.setScale(x, y, z);
return;
}
if (cc && cc.Vec3) node.scale = new cc.Vec3(x, y, z);
}
function writeEuler(x, y, z) {
if (typeof node.setRotationFromEuler === 'function') {
node.setRotationFromEuler(x, y, z);
return;
}
if (node.eulerAngles) {
node.eulerAngles = cc && cc.Vec3 ? new cc.Vec3(x, y, z) : { x: x, y: y, z: z };
}
}
bind('name', function (el) { node.name = el.value; });
bind('active', function (el) { node.active = !!el.checked; });
bind('layer', function () {
var v = num('layer');
if (!isNaN(v)) node.layer = v | 0;
});
bind('px', function () {
var v = num('px');
if (isNaN(v)) return;
var p = readPos();
writePos(v, p.y, p.z);
});
bind('py', function () {
var v = num('py');
if (isNaN(v)) return;
var p = readPos();
writePos(p.x, v, p.z);
});
bind('pz', function () {
var v = num('pz');
if (isNaN(v)) return;
var p = readPos();
writePos(p.x, p.y, v);
});
bind('rx', function () {
var v = num('rx');
if (isNaN(v)) return;
var e = node.eulerAngles;
writeEuler(v, e.y, e.z);
});
bind('ry', function () {
var v = num('ry');
if (isNaN(v)) return;
var e = node.eulerAngles;
writeEuler(e.x, v, e.z);
});
bind('rz', function () {
var v = num('rz');
if (isNaN(v)) return;
var e = node.eulerAngles;
writeEuler(e.x, e.y, v);
});
bind('sx', function () {
var v = num('sx');
if (isNaN(v)) return;
var s = readScale();
writeScale(v, s.y, s.z);
});
bind('sy', function () {
var v = num('sy');
if (isNaN(v)) return;
var s = readScale();
writeScale(s.x, v, s.z);
});
bind('sz', function () {
var v = num('sz');
if (isNaN(v)) return;
var s = readScale();
writeScale(s.x, s.y, v);
});
if (uit) {
bind('uiw', function () {
var w = num('uiw');
var h = num('uih');
if (isNaN(w)) return;
if (typeof uit.setContentSize === 'function') uit.setContentSize(w, isNaN(h) ? uit.height : h);
else uit.width = w;
});
bind('uih', function () {
var w = num('uiw');
var h = num('uih');
if (isNaN(h)) return;
if (typeof uit.setContentSize === 'function') uit.setContentSize(isNaN(w) ? uit.width : w, h);
else uit.height = h;
});
bind('uax', function () {
var v = num('uax');
if (isNaN(v)) return;
if (typeof uit.setAnchorPoint === 'function') uit.setAnchorPoint(v, uit.anchorY);
else uit.anchorX = v;
});
bind('uay', function () {
var v = num('uay');
if (isNaN(v)) return;
if (typeof uit.setAnchorPoint === 'function') uit.setAnchorPoint(uit.anchorX, v);
else uit.anchorY = v;
});
}
if (node.components) {
for (var i = 0; i < node.components.length; i++) {
var comp = node.components[i];
if (!comp) continue;
var keys = Object.keys(comp);
for (var k = 0; k < keys.length; k++) {
var key = keys[k];
var id = 'c' + i + '_' + key;
var el = byFid(id);
if (!el) continue;
(function (component, prop, input) {
var apply = function () {
try {
var cur = component[prop];
if (typeof cur === 'number') {
var n = parseFloat(input.value);
if (!isNaN(n)) component[prop] = n;
} else if (typeof cur === 'boolean') {
component[prop] = !!input.checked;
} else if (typeof cur === 'string') {
component[prop] = input.value;
}
} catch (err) {
console.warn('[调试工作台] 组件属性失败', prop, err);
}
};
input.addEventListener('change', apply);
input.addEventListener('input', apply);
})(comp, key, el);
}
}
}
};
function fieldText(label, id, value) {
return '';
}
function fieldNum(label, id, value) {
return '';
}
function fieldCheck(label, id, value) {
return '';
}
function escapeHtml(s) {
return String(s).replace(/&/g, '&').replace(//g, '>');
}
function escapeAttr(s) {
return escapeHtml(s).replace(/"/g, '"');
}
global.PWInspectorPanel = InspectorPanel;
})(window);