You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.0 KiB
TypeScript
171 lines
5.0 KiB
TypeScript
import Editor from "./Editor";
|
|
import React, { Component } from "react";
|
|
import { Layout, Tabs, message } from "antd";
|
|
import { ipcRenderer, remote } from "electron";
|
|
import * as path from "path";
|
|
|
|
import "antd/dist/antd.dark.css";
|
|
import MainEventType from "../common/MainEventType";
|
|
import { BehaviorTreeModel } from "../common/BehaviorTreeModel";
|
|
|
|
const { TabPane } = Tabs;
|
|
|
|
interface TreeTabsProps {
|
|
onTabSelected: (path: string) => void;
|
|
}
|
|
|
|
interface TreeInfo {
|
|
filepath: string;
|
|
unsave?: boolean;
|
|
}
|
|
|
|
interface TreeTabsState {
|
|
trees: TreeInfo[];
|
|
curTree?: string;
|
|
}
|
|
|
|
export default class TreeTabs extends Component<TreeTabsProps, TreeTabsState> {
|
|
state: TreeTabsState = {
|
|
trees: [],
|
|
};
|
|
|
|
editors: { [path: string]: Editor } = {};
|
|
|
|
componentDidMount() {
|
|
ipcRenderer.on(MainEventType.CREATE_NODE, (event: any, name: any) => {
|
|
const editor = this.getCurEditor();
|
|
editor?.createNode(name);
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.DELETE_NODE, () => {
|
|
const editor = this.getCurEditor();
|
|
editor?.deleteNode();
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.COPY_NODE, () => {
|
|
const editor = this.getCurEditor();
|
|
editor?.copyNode();
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.PASTE_NODE, () => {
|
|
const editor = this.getCurEditor();
|
|
editor?.pasteNode();
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.SAVE, (event: any) => {
|
|
const { curTree: curPath } = this.state;
|
|
if (!curPath) {
|
|
return;
|
|
}
|
|
const editor = this.editors[curPath];
|
|
editor.save();
|
|
message.success("已保存");
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.SAVE_ALL, (event: any) => {
|
|
for (let k in this.editors) {
|
|
let editor = this.editors[k];
|
|
editor.save();
|
|
}
|
|
message.success("已保存所有行为树");
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.UNDO, () => {
|
|
const editor = this.getCurEditor();
|
|
editor?.undo();
|
|
});
|
|
|
|
ipcRenderer.on(MainEventType.REDO, () => {
|
|
const editor = this.getCurEditor();
|
|
editor?.redo();
|
|
});
|
|
}
|
|
|
|
componentDidUpdate() {
|
|
setTimeout(() => {
|
|
this.props.onTabSelected(this.state.curTree);
|
|
}, 500);
|
|
}
|
|
|
|
getOpenTreesModel() {
|
|
const trees: BehaviorTreeModel[] = []
|
|
for (let k in this.editors) {
|
|
let editor = this.editors[k];
|
|
if (editor) {
|
|
trees.push(editor.save());
|
|
}
|
|
}
|
|
return trees;
|
|
}
|
|
|
|
getCurEditor() {
|
|
const { curTree: curPath } = this.state;
|
|
if (!curPath) {
|
|
return;
|
|
}
|
|
return this.editors[curPath];
|
|
}
|
|
|
|
openFile(path: string) {
|
|
if (!this.state.trees.find(e => e.filepath == path)) {
|
|
const trees = this.state.trees;
|
|
trees.push({ filepath: path });
|
|
this.setState({ trees, curTree: path });
|
|
} else {
|
|
this.setState({ curTree: path });
|
|
}
|
|
}
|
|
|
|
closeFile(path: string) {
|
|
let trees = this.state.trees;
|
|
trees = trees.filter(tree => tree.filepath != path);
|
|
const length = trees.length;
|
|
this.setState({ trees: trees, curTree: length > 0 ? trees[0].filepath : null });
|
|
}
|
|
|
|
render() {
|
|
const { trees, curTree } = this.state;
|
|
console.log("render tabs", trees);
|
|
if (!curTree) {
|
|
return <div />;
|
|
}
|
|
this.editors = {};
|
|
return (
|
|
<Tabs
|
|
hideAdd
|
|
className="tabs"
|
|
type="editable-card"
|
|
defaultActiveKey={curTree}
|
|
activeKey={curTree}
|
|
onChange={(activeKey) => {
|
|
this.setState({ curTree: activeKey });
|
|
}}
|
|
onEdit={(targetKey, action) => {
|
|
if (action == "remove") {
|
|
this.closeFile(targetKey as string);
|
|
}
|
|
}}
|
|
>
|
|
{trees.map((tree) => {
|
|
return (
|
|
<TabPane tab={`${path.basename(tree.filepath)}${tree.unsave?"*":''}`} key={tree.filepath}>
|
|
<Editor
|
|
filepath={tree.filepath}
|
|
onChangeSaveState={(unsave) => {
|
|
if(tree.unsave != unsave) {
|
|
tree.unsave = unsave;
|
|
this.forceUpdate();
|
|
}
|
|
}}
|
|
ref={(ref) => {
|
|
this.editors[tree.filepath] = ref;
|
|
}}
|
|
/>
|
|
</TabPane>
|
|
);
|
|
})}
|
|
</Tabs>
|
|
);
|
|
}
|
|
}
|