From 130aec73638dabf2ab97185955921e4a856d694d Mon Sep 17 00:00:00 2001 From: zhandouxiaojiji Date: Fri, 20 Nov 2020 17:50:52 +0800 Subject: [PATCH] reload server --- common/MainEventType.ts | 1 + main-process/AppMenu.ts | 13 ++- package-lock.json | 168 ++++++++++++++++++++++++++++---- package.json | 3 +- render-process/Editor/index.tsx | 12 ++- render-process/TreeTabs.tsx | 10 ++ render-process/index.tsx | 31 ++++-- 7 files changed, 203 insertions(+), 35 deletions(-) diff --git a/common/MainEventType.ts b/common/MainEventType.ts index 14d9ab3..369a01b 100644 --- a/common/MainEventType.ts +++ b/common/MainEventType.ts @@ -9,4 +9,5 @@ export default { PASTE_NODE: "PASTE_NODE", SAVE: "SAVE", SAVE_ALL: "SAVE_ALL", + RELOAD_SERVER: "RELOAD_SERVER", }; diff --git a/main-process/AppMenu.ts b/main-process/AppMenu.ts index f5998a0..7639a09 100644 --- a/main-process/AppMenu.ts +++ b/main-process/AppMenu.ts @@ -323,6 +323,16 @@ export default class AppMenu { label: "联调服务器", submenu: serverItems, }, + { + label: "热更", + accelerator: "Ctrl+R", + click: () => { + this.webContents.send(MainEventType.RELOAD_SERVER); + } + }, + { + type: 'separator', + }, { label: "打开控制台", accelerator: "Ctrl+Shift+I", @@ -331,8 +341,7 @@ export default class AppMenu { }, }, { - label: "重载", - accelerator: "Ctrl+R", + label: "重载编辑器", click: (_, browserWindow) => { browserWindow.reload(); }, diff --git a/package-lock.json b/package-lock.json index 654fdb1..256a375 100644 --- a/package-lock.json +++ b/package-lock.json @@ -375,6 +375,14 @@ "@types/node": "*" } }, + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/@types/concat-stream/download/@types/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "requires": { + "@types/node": "*" + } + }, "@types/connect": { "version": "3.4.33", "resolved": "https://registry.npm.taobao.org/@types/connect/download/@types/connect-3.4.33.tgz?cache=0&sync_timestamp=1605052812480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fconnect%2Fdownload%2F%40types%2Fconnect-3.4.33.tgz", @@ -441,6 +449,14 @@ "@types/range-parser": "*" } }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npm.taobao.org/@types/form-data/download/@types/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, "@types/fs-extra": { "version": "9.0.4", "resolved": "https://registry.npm.taobao.org/@types/fs-extra/download/@types/fs-extra-9.0.4.tgz", @@ -499,8 +515,7 @@ "@types/qs": { "version": "6.9.5", "resolved": "https://registry.npm.taobao.org/@types/qs/download/@types/qs-6.9.5.tgz?cache=0&sync_timestamp=1605055106687&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fqs%2Fdownload%2F%40types%2Fqs-6.9.5.tgz", - "integrity": "sha1-Q0cRvdSete5p2QwdZ8NUqajssYs=", - "dev": true + "integrity": "sha1-Q0cRvdSete5p2QwdZ8NUqajssYs=" }, "@types/range-parser": { "version": "1.2.3", @@ -1101,6 +1116,11 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, "asar": { "version": "3.0.3", "resolved": "https://registry.npm.taobao.org/asar/download/asar-3.0.3.tgz", @@ -1199,6 +1219,11 @@ "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-3.4.0.tgz?cache=0&sync_timestamp=1596623572478&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-validator%2Fdownload%2Fasync-validator-3.4.0.tgz", "integrity": "sha1-hxs+WUEkv0xOt7zRqeeLRPOwnK4=" }, + "asynckit": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/at-least-node/download/at-least-node-1.0.0.tgz", @@ -1378,8 +1403,7 @@ "version": "3.0.1", "resolved": "https://registry.npm.taobao.org/boolean/download/boolean-3.0.1.tgz", "integrity": "sha1-NezytKLuGRsLRJhvFOtfBSpcu08=", - "dev": true, - "optional": true + "dev": true }, "boxen": { "version": "4.2.0", @@ -1678,8 +1702,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", - "dev": true + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" }, "buffer-xor": { "version": "1.0.3", @@ -1938,6 +1961,11 @@ "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687070184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", @@ -2142,6 +2170,14 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1598576116597&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", @@ -2180,7 +2216,6 @@ "version": "1.6.2", "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -2525,8 +2560,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { "version": "2.8.5", @@ -2856,6 +2890,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", @@ -4296,6 +4335,16 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.5.1.tgz", + "integrity": "sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", @@ -4449,6 +4498,11 @@ "read-pkg-up": "^2.0.0" } }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/get-port/download/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&sync_timestamp=1597056502934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz", @@ -4769,6 +4823,17 @@ "entities": "^2.0.0" } }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npm.taobao.org/http-basic/download/http-basic-8.1.3.tgz", + "integrity": "sha1-p8q+51Joabm3EBNpcIBbEAQmG78=", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz", @@ -4794,6 +4859,21 @@ } } }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/http-response-object/download/http-response-object-3.0.2.tgz", + "integrity": "sha1-f0NbshBFTkNg0HTvH5idXqiqmBA=", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.46", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-10.17.46.tgz?cache=0&sync_timestamp=1605819795096&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-10.17.46.tgz", + "integrity": "sha1-HNhn6/6ZV6tFlR8vcV+N5fPat6M=" + } + } + }, "https-browserify": { "version": "1.0.0", "resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", @@ -5150,8 +5230,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.3", @@ -6110,6 +6189,11 @@ "author-regex": "^1.0.0" } }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parse-cache-control/download/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, "parse-entities": { "version": "2.0.0", "resolved": "https://registry.npm.taobao.org/parse-entities/download/parse-entities-2.0.0.tgz", @@ -6371,8 +6455,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", - "dev": true + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" }, "progress": { "version": "2.0.3", @@ -6380,6 +6463,14 @@ "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", "dev": true }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/promise/download/promise-8.1.0.tgz", + "integrity": "sha1-aXwlw9/nQ13Xn81Yw4oTWIjq8F4=", + "requires": { + "asap": "~2.0.6" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", @@ -7121,7 +7212,6 @@ "version": "2.3.7", "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz?cache=0&sync_timestamp=1581624324274&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.7.tgz", "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7955,7 +8045,6 @@ "version": "1.1.1", "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz?cache=0&sync_timestamp=1565170823020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring_decoder%2Fdownload%2Fstring_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -8068,6 +8157,24 @@ "has-flag": "^3.0.0" } }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/sync-request/download/sync-request-6.1.0.tgz", + "integrity": "sha1-6WIXVlteULv/4XmGi6dVMvtZfmg=", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npm.taobao.org/sync-rpc/download/sync-rpc-1.3.6.tgz", + "integrity": "sha1-suiyVQoSzLxx34ZEgQUp3raGZac=", + "requires": { + "get-port": "^3.1.0" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz?cache=0&sync_timestamp=1600381197118&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-1.1.3.tgz", @@ -8181,6 +8288,31 @@ } } }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/then-request/download/then-request-6.0.2.tgz", + "integrity": "sha1-7Bjdi1ykOq7ly5L35MFjDpUNTww=", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-8.10.66.tgz?cache=0&sync_timestamp=1605819795096&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-8.10.66.tgz", + "integrity": "sha1-3QNdQJ3zIqzIPf9ipgLxKleDu7M=" + } + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", @@ -8392,8 +8524,7 @@ "typedarray": { "version": "0.0.6", "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -8717,8 +8848,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", diff --git a/package.json b/package.json index 1e8f852..73d2e1c 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "react-dom": "^16.13.1", "react-markdown": "^5.0.2", "rimraf": "^3.0.2", - "sanitize-filename": "^1.6.3" + "sanitize-filename": "^1.6.3", + "sync-request": "^6.1.0" } } diff --git a/render-process/Editor/index.tsx b/render-process/Editor/index.tsx index 35c9fed..7ab6789 100644 --- a/render-process/Editor/index.tsx +++ b/render-process/Editor/index.tsx @@ -332,14 +332,16 @@ export default class Editor extends React.Component { save() { const { filepath } = this.props; const root = Utils.createFileData(this.graph.findDataById("1") as GraphNodeModel); + const treeModel = { + name: path.basename(filepath).slice(0, -5), + root, + desc: root.desc, + } as BehaviorTreeModel; fs.writeFileSync( filepath, - JSON.stringify({ - name: path.basename(filepath).slice(0, -5), - root, - desc: root.desc, - }) + JSON.stringify(treeModel) ); + return treeModel; } copyNode() { diff --git a/render-process/TreeTabs.tsx b/render-process/TreeTabs.tsx index 9d7d7fd..066f2a0 100644 --- a/render-process/TreeTabs.tsx +++ b/render-process/TreeTabs.tsx @@ -6,6 +6,7 @@ import * as path from "path"; import "antd/dist/antd.dark.css"; import MainEventType from "../common/MainEventType"; +import { BehaviorTreeModel } from "../common/BehaviorTreeModel"; const { TabPane } = Tabs; @@ -63,6 +64,15 @@ export default class TreeTabs extends Component { }); } + getOpenTreesModel() { + const trees: BehaviorTreeModel[] = [] + for (let k in this.editors) { + let editor = this.editors[k]; + trees.push(editor.save()); + } + return trees; + } + getCurEditor() { const { curPath } = this.state; if (!curPath) { diff --git a/render-process/index.tsx b/render-process/index.tsx index a325e1b..fb0bc81 100644 --- a/render-process/index.tsx +++ b/render-process/index.tsx @@ -1,24 +1,19 @@ import * as ReactDOM from "react-dom"; -import Editor from "./Editor"; +import SyncRequest from "sync-request"; import React, { Component } from "react"; -import { Layout, Tabs } from "antd"; +import { Layout, message, Tabs } from "antd"; import { ipcRenderer, remote } from "electron"; -import * as path from "path"; -import * as fs from "fs"; import * as Utils from "../common/Utils"; import MainEventType from "../common/MainEventType"; import Properties from "./Properties"; import Settings from "../main-process/Settings"; -import G6 from "@antv/g6"; import "antd/dist/antd.dark.css"; import "./index.css"; -import { ModelConfig, Item } from "@antv/g6/lib/types"; import RegisterNode from "./RegisterNode"; import TreeTabs from "./TreeTabs"; -const { Header, Sider, Content, Footer } = Layout; -const { TabPane } = Tabs; +const { Sider, Content } = Layout; interface MainState { workdir: string; @@ -33,6 +28,7 @@ export default class Main extends Component { settings: Settings; tabs: TreeTabs; + session = 0; componentDidMount() { this.updateSettings(); @@ -48,6 +44,25 @@ export default class Main extends Component { this.setState({ workdir, workspace }); }); + ipcRenderer.on(MainEventType.RELOAD_SERVER, () => { + const serverModel = this.settings.serverModel; + if (!serverModel) { + message.warning("没有配置服务器"); + return; + } + SyncRequest("POST", serverModel.host, { + body: JSON.stringify({ + cmd:"btree.reload", + data: { + trees: this.tabs.getOpenTreesModel() + }, + session: this.session++, + timestamp: Date.now(), + }) + }); + message.success("服务器已更新"); + }) + console.log("workdir", this.settings.curWorkspace.getWorkdir()); this.setState({ workdir: this.settings.curWorkspace.getWorkdir(),