import React from "react"; import { Card, Divider, Form, Input, AutoComplete, Select, Switch, InputNumber, notification, message, } from "antd"; import { INode } from "@antv/g6/lib/interface/item"; import { BehaviorNodeModel, BehaviorNodeTypeModel, ArgsDefType, } from "../../common/BehaviorTreeModel"; import Settings from "../../main-process/Settings"; import { FormInstance } from "antd/lib/form"; import Markdown from "react-markdown"; const { Item } = Form; const { Option } = Select; interface NodePanelProps { model: BehaviorNodeModel; settings: Settings; updateNode: (id: string, forceUpdate: boolean) => void; pushUndoStack: () => void; } interface NodePanelState {} export default class NodePanel extends React.Component { formRef = React.createRef(); componentDidUpdate() { this.formRef.current.resetFields(); this.formRef.current.setFieldsValue(this.getInitialValues()); } getInitialValues() { const { model } = this.props; const initialValues: any = { name: model.name, desc: model.desc, debug: model.debug, customArgs: model.args ? JSON.stringify(model.args, null, " ") : "", }; if (model.args) { for (let k in model.args) { initialValues[`args.${k}`] = model.args[k]; } } if (model.input) { model.input.forEach((v, i) => { initialValues[`input.${i}`] = v; }); } if (model.output) { model.output.forEach((v, i) => { initialValues[`output.${i}`] = v; }); } return initialValues; } onFinish = (values: any) => { console.log("Success:", values); const { updateNode, pushUndoStack, model, settings } = this.props; const conf = settings.getNodeConf(values.name); if (!conf) { notification.warn({ message: `节点${values.name}未定义` }); return; } var args: any = {}; if (values.customArgs) { try { args = JSON.parse(values.customArgs); } catch (e) { message.warn(`您输入的自定义参数不符合json格式${values.customArgs}`); return; } } pushUndoStack(); var forceUpdate = false; if (model.name != values.name) { model.name = values.name; forceUpdate = true; } model.desc = values.desc; model.debug = values.debug; if (conf.args) { conf.args.forEach((e) => { const k = "args." + e.name; if (e.type.indexOf("number") > 0) { args[e.name] = Number(values[k]); } else { args[e.name] = values[k]; } }); } model.args = args; this.formRef.current.setFieldsValue({ customArgs: model.args ? JSON.stringify(model.args, null, " ") : "", }); if (conf.input) { model.input = []; conf.input.forEach((e, i) => { model.input.push(values["input." + i] || ""); }); } else { model.input = null; } if (conf.output) { model.output = []; conf.output.forEach((e, i) => { model.output.push(values["output." + i] || ""); }); } else { model.output = null; } if (forceUpdate) { this.forceUpdate(); } updateNode(model.id.toString(), forceUpdate); }; onFinishFailed = (errorInfo: any) => { console.log("Failed:", errorInfo); }; handleSubmit = () => { console.log("handleSubmit"); this.formRef.current.submit(); }; render() { const { model, settings } = this.props; const conf = settings.getNodeConf(model.name); const title = conf.desc; const options: any = []; settings.nodeConfig.map((e) => { options.push({ label: `${e.name}(${e.desc})`, value: e.name }); }); const layout = { labelCol: { span: 6 }, wrapperCol: { span: 18 }, }; return (
{ return ( option.label.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1 ); }} /> {this.renderInputs(conf)} {this.renderArgs(conf)} {this.renderOutputs(conf)}
); } renderArgs(conf: BehaviorNodeTypeModel) { if (!conf || !conf.args || conf.args.length == 0) { return null; } // 普通参数 const normalArgs = (e: ArgsDefType) => { const required = e.type.indexOf("?") == -1; if (e.type.indexOf("string") >= 0) { return ; } else if (e.type.indexOf("int") >= 0) { return ; } else if (e.type.indexOf("boolean") >= 0) { return ; } else if (e.type.indexOf("lua") >= 0) { return ; } else if (e.type.indexOf("enum") >= 0 ) { return ; } }; // 自定义参数 const customArgs = () => { return ( ); }; return (

常量参数

{conf && conf.args && conf.args.map((e, i: number) => { const required = e.type.indexOf("?") == -1; return ( = 0 ? "checked" : undefined } rules={[{ required, message: `${e.desc}(${e.name})为必填字段` }]} > {normalArgs(e)} ); })} {customArgs()}
); } renderInputs(conf: BehaviorNodeTypeModel) { if (!conf.input || !conf.input || conf.input.length == 0) { return null; } return (

输入变量

{conf.input.map((e, i) => { return ( ); })}
); } renderOutputs(conf: BehaviorNodeTypeModel) { if (!conf.output || !conf.output || conf.output.length == 0) { return null; } return (

输出变量

{conf.output.map((e, i) => { return ( ); })}
); } }