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

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