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.
155 lines
4.0 KiB
TypeScript
155 lines
4.0 KiB
TypeScript
import * as fs from "fs";
|
|
import Workspace from "./Workspace";
|
|
|
|
export interface BehaviorNodeClassify {
|
|
classify: string;
|
|
desc?: string;
|
|
}
|
|
|
|
export interface SettingsModel {
|
|
recentWorkspaces?: string[];
|
|
recentFiles?: string[];
|
|
serverName?: string;
|
|
nodeClassify?: BehaviorNodeClassify[];
|
|
treesDesc?: { [name: string]: string };
|
|
}
|
|
|
|
const settingPath = "settings.json";
|
|
const sampleNodeClassify: BehaviorNodeClassify[] = [
|
|
{ classify: "Composite", desc: "复合节点" },
|
|
{ classify: "Decorator", desc: "修饰节点" },
|
|
{ classify: "Condition", desc: "条件节点" },
|
|
{ classify: "Action", desc: "行为节点" },
|
|
];
|
|
|
|
export default class Settings {
|
|
private model: SettingsModel;
|
|
private dirty: boolean = false;
|
|
curWorkspace?: Workspace;
|
|
|
|
constructor() {
|
|
this.load();
|
|
|
|
setInterval(() => {
|
|
if (this.dirty) {
|
|
fs.writeFileSync(settingPath, JSON.stringify(this.model, null, 2));
|
|
this.dirty = false;
|
|
}
|
|
}, 1000)
|
|
}
|
|
|
|
get nodeConfPath() {
|
|
return this.curWorkspace.getNodeConfPath();
|
|
}
|
|
get recentWorkspaces() {
|
|
return this.model.recentWorkspaces;
|
|
}
|
|
get recentFiles() {
|
|
return this.model.recentFiles;
|
|
}
|
|
get nodeConfig() {
|
|
return this.curWorkspace.nodeConf;
|
|
}
|
|
get nodeClassify() {
|
|
return this.model.nodeClassify;
|
|
}
|
|
get serverModel() {
|
|
const servers = this.curWorkspace.getServers()
|
|
if (!servers) {
|
|
return;
|
|
}
|
|
for (let server of servers) {
|
|
if (server.name == this.model.serverName) {
|
|
return server;
|
|
}
|
|
}
|
|
return servers[0];
|
|
}
|
|
get serverName() {
|
|
const servers = this.curWorkspace.getServers()
|
|
if (!servers) {
|
|
return "";
|
|
}
|
|
for (let server of servers) {
|
|
if (server.name == this.model.serverName) {
|
|
return this.model.serverName;
|
|
}
|
|
}
|
|
if (servers[0]) {
|
|
return servers[0].name;
|
|
} else {
|
|
return ''
|
|
}
|
|
}
|
|
set serverName(name: string) {
|
|
this.model.serverName = name;
|
|
}
|
|
|
|
set(config: SettingsModel) {
|
|
this.model = {
|
|
...this.model,
|
|
...config,
|
|
};
|
|
this.save();
|
|
}
|
|
|
|
load() {
|
|
if (fs.existsSync(settingPath)) {
|
|
const str = fs.readFileSync(settingPath, "utf8");
|
|
this.model = JSON.parse(str);
|
|
if (!this.model.treesDesc) {
|
|
this.model.treesDesc = {};
|
|
this.save();
|
|
}
|
|
} else {
|
|
this.model = {
|
|
recentWorkspaces: ["sample/workspace.json"],
|
|
recentFiles: [],
|
|
nodeClassify: sampleNodeClassify,
|
|
};
|
|
this.save();
|
|
}
|
|
this.curWorkspace = new Workspace(this.model.recentWorkspaces[0]);
|
|
this.curWorkspace.load();
|
|
}
|
|
|
|
save() {
|
|
this.dirty = true;
|
|
}
|
|
|
|
getNodeConf(name: string) {
|
|
return this.curWorkspace.getNodeConf(name);
|
|
}
|
|
|
|
pushRecentWorkspace(path: string) {
|
|
var list = this.model.recentWorkspaces;
|
|
if (list.indexOf(path) >= 0) {
|
|
list = list.filter((value) => value !== path);
|
|
}
|
|
list.unshift(path);
|
|
while (list.length > 10) {
|
|
list.pop();
|
|
}
|
|
this.model.recentWorkspaces = list;
|
|
this.save();
|
|
}
|
|
|
|
getTreeDesc(name: string) {
|
|
const key = this.curWorkspace.getFilepath() + ' ' + name;
|
|
var desc = this.model.treesDesc[key];
|
|
if (!desc) {
|
|
const str = fs.readFileSync(name, "utf8");
|
|
const tree = JSON.parse(str);
|
|
desc = tree.desc ? tree.desc : '';
|
|
this.model.treesDesc[key] = desc;
|
|
this.save();
|
|
}
|
|
return desc;
|
|
}
|
|
|
|
setTreeDesc(name: string, desc?: string) {
|
|
const key = this.curWorkspace.getFilepath() + ' ' + name;
|
|
this.model.treesDesc[key] = desc;
|
|
}
|
|
}
|