2024-12-12 20:13:50 +08:00

178 lines
5.6 KiB
TypeScript

import { v4 } from "uuid";
import { Msg, Page, PluginEvent } from "../../../core/types";
import { ArrayData, BoolData, ColorData, EngineData, EnumData, Group, ImageData, Info, NodeInfoData, NumberData, ObjectData, ObjectItemRequestData, Property, StringData, TextData, TreeData, Vec2Data, Vec3Data, Vec4Data } from "../data";
export class TestClient {
recv(event: PluginEvent) {
}
}
class Node {
active: boolean = true;
children: Node[] = [];
id: string = "";
name: string = "";
components: Group[] = [];
constructor(name: string = "") {
this.name = name;
this.active = true;
this.id = v4();
this.children = [];
}
buildComponent(name: string) {
const info = new Group(name)
this.components.push(info);
return info;
}
buildChild(name: string) {
const node = new Node(name);
this.children.push(node);
return node;
}
toTreeData(data: TreeData) {
data.id = this.id;
data.text = this.name;
data.active = this.active;
for (let i = 0; i < this.children.length; i++) {
const child = this.children[i];
const childData = new TreeData();
child.toTreeData(childData);
data.children.push(childData);
}
}
private allNodes(): Node[] {
const nodes: Node[] = [];
function circle(node: Node) {
node.children.forEach(child => {
nodes.push(child);
circle(child);
})
}
circle(this);
return nodes;
}
findNode(id: string): Node | null {
const nodes: Node[] = this.allNodes();
return nodes.find(node => node.id === id) || null;
}
findInfo(id: string): Info | null {
const nodes: Node[] = this.allNodes();
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];
const comp = node.findProperty(id);
if (comp) {
return comp;
}
}
return null;
}
private findProperty(id: string): Info | null {
for (let i = 0; i < this.components.length; i++) {
const comp = this.components[i];
for (let j = 0; j < comp.data.length; j++) {
const item: Property = comp.data[j];
if (item.value.id === id) {
return item.value;
}
}
}
return null;
}
}
export class TestServer {
private clients: TestClient[] = [];
private testData: Node = new Node("scene");
constructor() {
this.testData.buildChild("base").buildComponent("group1")
.buildProperty('bool', new BoolData(true))
.buildProperty("text", new TextData("text"))
.buildProperty("number", new NumberData(100))
.buildProperty("string", new StringData("string"))
.buildProperty("enum", new EnumData().test())
.buildProperty("color", new ColorData('#f00'))
.buildProperty("image", new ImageData().test())
this.testData.buildChild('vec').buildComponent('group2')
.buildProperty("number", new NumberData(200))
.buildProperty("vec2", new Vec2Data().test())
.buildProperty("vec3", new Vec3Data().test())
.buildProperty("vec4", new Vec4Data().test())
this.testData.buildChild("obj/arr").buildComponent("group3")
.buildProperty("array", new ArrayData().test())
.buildProperty("object", new ObjectData().test())
.buildProperty("arr_arr", new ArrayData().testSub())
this.testData.buildChild("engine").buildComponent("group4")
.buildProperty("node", new EngineData().init('name', 'cc_Node', 'uuid'))
.buildProperty("sprite", new EngineData().init('name', 'cc_Sprite', 'uuid'))
.buildProperty("label", new EngineData().init('name', 'cc_Label', 'uuid'))
.buildProperty("un_known", new EngineData().init('name', 'un_known', 'uuid'))
const c = this.testData.buildChild("str1")
c.active = false;
c.buildComponent("group51").buildProperty("str1", new StringData("str1"))
c.buildComponent("group52").buildProperty("num", new NumberData(200))
this.testData.buildChild("str2").buildComponent("group6")
.buildProperty("str2", new StringData("str2"))
}
add(client: TestClient) {
this.clients.push(client);
}
recv(msg: string, data: any) {
switch (msg) {
case Msg.NodeInfo: {
const id: string = data as string;
const node: Node = this.testData.findNode(id);
let group = [];
if (node) {
group = node.components;
} else {
let g = new Group("scene").buildProperty("scene id", new StringData(id));
group.push(g);
}
const ret: NodeInfoData = {
uuid: id,
group: group
};
const event = new PluginEvent(Page.Background, Page.Devtools, Msg.NodeInfo, ret);
this.send(event);
break;
}
case Msg.TreeInfo: {
const ret: TreeData = new TreeData();
this.testData.toTreeData(ret);
const event = new PluginEvent(Page.Inject, Page.Devtools, Msg.TreeInfo, ret);
this.send(event);
break;
}
case Msg.SetProperty: {
console.log(data);
break;
}
case Msg.GetObjectItemData: {
const objData = data as ObjectData;
const info = this.testData.findInfo(objData.id);
if (info && info instanceof ObjectData) {
const ret: ObjectItemRequestData = {
id: objData.id,
data: info.testProperty(),
}
const event = new PluginEvent(Page.Inject, Page.Devtools, Msg.GetObjectItemData, ret);
this.send(event)
}
break;
}
case Msg.LogData: {
console.log(data);
break;
}
default:
break;
}
}
send(event: PluginEvent) {
this.clients.forEach((client) => {
client.recv(event)
});
}
}
export const testServer = new TestServer();