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

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>
);
}
}