diff --git a/app/StorageModel.ts b/app/StorageModel.ts
new file mode 100644
index 0000000..392016a
--- /dev/null
+++ b/app/StorageModel.ts
@@ -0,0 +1,12 @@
+class StorageModel {
+ jsonString: string
+ fileName: string
+ storageDir: string
+
+
+ constructor(jsonString: string, fileName: string, storageDir: string) {
+ this.jsonString = jsonString;
+ this.fileName = fileName;
+ this.storageDir = storageDir;
+ }
+}
diff --git a/app/main.ts b/app/main.ts
index 0668026..5a25dde 100644
--- a/app/main.ts
+++ b/app/main.ts
@@ -1,11 +1,14 @@
-import {app, BrowserWindow, screen, Menu, ipcMain} from 'electron';
+import {app, BrowserWindow, screen, Menu, ipcMain, ipcRenderer} from 'electron';
import * as path from 'path';
import * as fs from 'fs';
+import {json} from "node:stream/consumers";
+import {StorageModel} from "../src/app/game-model/StorageModel";
let win: BrowserWindow | null = null;
const args = process.argv.slice(1),
serve = args.some(val => val === '--serve');
+let projectDirectory = "testModel"
function createWindow(): BrowserWindow {
const size = screen.getPrimaryDisplay().workAreaSize;
@@ -90,6 +93,56 @@ function createWindow(): BrowserWindow {
contextMenu.popup({ window: win!, x: params.x, y: params.y });
})
+ ipcMain.on('save-model', (event, storageModels: StorageModel[]) => {
+ const directoryPath = 'testModel/'
+ if(!fs.existsSync(directoryPath)) {
+ fs.mkdirSync(directoryPath, {recursive: true});
+ }
+
+ storageModels.forEach(storageModel => {
+ const modelDir = path.join(directoryPath, storageModel.storageDir);
+ if(!fs.existsSync(modelDir)) {
+ fs.mkdirSync(modelDir, {recursive: true});
+ }
+
+ const filePath = path.join(directoryPath, storageModel.storageDir, storageModel.fileName + ".json");
+ fs.writeFile(filePath, storageModel.jsonString ,'utf-8', (err) => {
+ if (err) {
+ console.error('Error writing JSON to file:', err);
+ } else {
+ console.log('JSON file saved successfully:', filePath);
+ }
+ })
+ })
+ })
+
+ const menuTemplate = [
+ {
+ label: 'File',
+ submenu: [
+ {
+ label: "New Project",
+ click: () => {
+ createNewProject();
+ }
+ },
+ {
+ label: "Open Project",
+ click: () => {
+ openProject()
+ }
+ },
+ {
+ label: "Save",
+ click: () => {
+ saveProject();
+ }
+ }
+ ]
+ }
+ ]
+ const menu = Menu.buildFromTemplate(menuTemplate);
+ Menu.setApplicationMenu(menu)
return win;
}
@@ -118,7 +171,23 @@ try {
}
});
+
+
} catch (e) {
// Catch Error
// throw e;
}
+
+
+function createNewProject() {
+
+}
+
+function openProject() {
+
+}
+
+function saveProject() {
+ console.log("Clicked SaveProject")
+ win!.webContents.send('get-project-data')
+}
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 95cb454..0b766a6 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -50,11 +50,22 @@ export class AppComponent implements OnInit{
this.onContextMenuMessageRecieved(message);
});
})
+
+ electronService.ipcRenderer.on('get-project-data', (event: any, message: string) => {
+ this.zone.run(() => {
+ this.saveGameModel();
+ })
+ })
} else {
console.log('Run in browser');
}
}
+ saveGameModel() {
+ const storageModels = this.gameModel!.save()
+ this.electronService.ipcRenderer.send('save-model', storageModels)
+ }
+
onContextMenuMessageRecieved(message: string) {
if(message == "edit") {
this.onEditModelComponent();
diff --git a/src/app/editor/script-account-editor/script-account-editor.component.html b/src/app/editor/script-account-editor/script-account-editor.component.html
index 2b36b86..0935334 100644
--- a/src/app/editor/script-account-editor/script-account-editor.component.html
+++ b/src/app/editor/script-account-editor/script-account-editor.component.html
@@ -10,4 +10,6 @@
Please enter a valid number!
+
+
diff --git a/src/app/editor/script-account-editor/script-account-editor.component.ts b/src/app/editor/script-account-editor/script-account-editor.component.ts
index bdf6bc2..271352a 100644
--- a/src/app/editor/script-account-editor/script-account-editor.component.ts
+++ b/src/app/editor/script-account-editor/script-account-editor.component.ts
@@ -6,6 +6,7 @@ import {MatInput} from "@angular/material/input";
import {FormControl, FormGroupDirective, FormsModule, NgForm, Validators} from "@angular/forms";
import {NgIf} from "@angular/common";
import {ErrorStateMatcher} from "@angular/material/core";
+import {ElectronService} from "../../core/services";
export class MyErrorStateMatcher implements ErrorStateMatcher {
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
@@ -24,6 +25,9 @@ export class ScriptAccountEditorComponent implements OnInit{
minCtrl: FormControl = new FormControl(0, [Validators.required, Validators.pattern('^[0-9]*$')]);
maxCtrl: FormControl = new FormControl(100, [Validators.required, Validators.pattern('^[0-9]*$')]);
matcher = new MyErrorStateMatcher();
+
+ constructor(private electronService: ElectronService) {
+ }
ngOnInit() {
this.minCtrl.setValue(this.scriptAccount!.minValue);
this.maxCtrl.setValue(this.scriptAccount!.maxValue);
@@ -46,4 +50,9 @@ export class ScriptAccountEditorComponent implements OnInit{
this.scriptAccount!.maxValue = Number(this.maxCtrl.value);
this.scriptAccount!.onModifyContent();
}
+
+ save() {
+ const jsonString = JSON.stringify(this.scriptAccount!, null, 4);
+ this.electronService.ipcRenderer.send('save-json', jsonString, this.scriptAccount!.componentName + ".json");
+ }
}
diff --git a/src/app/game-model/GameModel.ts b/src/app/game-model/GameModel.ts
index ac4d355..2c6a350 100644
--- a/src/app/game-model/GameModel.ts
+++ b/src/app/game-model/GameModel.ts
@@ -4,6 +4,7 @@ import {Transition} from "./gamesystems/Transition";
import {State} from "./gamesystems/State";
import {ProductGamesystem} from "./gamesystems/ProductGamesystem";
import {SimpleGamesystem} from "./gamesystems/SimpleGamesystem";
+import {StorageModel} from "./StorageModel";
export class GameModel {
private readonly _gameModelName: string
@@ -90,4 +91,17 @@ export class GameModel {
}
}
+ save() {
+ const storageModels: StorageModel[] = [];
+ this.scriptAccounts.forEach(scriptAccount => {
+ const scriptAccountJson = scriptAccount.save();
+ storageModels.push({
+ fileName: scriptAccount.componentName,
+ jsonString: scriptAccountJson,
+ storageDir: "script-accounts"
+ })
+ })
+
+ return storageModels;
+ }
}
diff --git a/src/app/game-model/SaveComponent.ts b/src/app/game-model/SaveComponent.ts
index 473f0c5..631c529 100644
--- a/src/app/game-model/SaveComponent.ts
+++ b/src/app/game-model/SaveComponent.ts
@@ -1,6 +1,8 @@
export abstract class SaveComponent {
unsaved: boolean = false;
+ static JSON_INDENT = 4;
+
onModifyContent() {
this.unsaved = true;
}
@@ -9,5 +11,5 @@ export abstract class SaveComponent {
this.unsaved = false;
}
- abstract save(): void;
+ abstract save(): string;
}
diff --git a/src/app/game-model/StorageModel.ts b/src/app/game-model/StorageModel.ts
new file mode 100644
index 0000000..35b06c5
--- /dev/null
+++ b/src/app/game-model/StorageModel.ts
@@ -0,0 +1,12 @@
+export class StorageModel {
+ jsonString: string
+ fileName: string
+ storageDir: string
+
+
+ constructor(jsonString: string, fileName: string, storageDir: string) {
+ this.jsonString = jsonString;
+ this.fileName = fileName;
+ this.storageDir = storageDir;
+ }
+}
diff --git a/src/app/game-model/gamesystems/Gamesystem.ts b/src/app/game-model/gamesystems/Gamesystem.ts
index 2625649..505a830 100644
--- a/src/app/game-model/gamesystems/Gamesystem.ts
+++ b/src/app/game-model/gamesystems/Gamesystem.ts
@@ -27,7 +27,7 @@ export abstract class Gamesystem extends ModelComponent{
save() {
-
+ return JSON.stringify(this);
}
}
diff --git a/src/app/game-model/scriptAccounts/ScriptAccount.ts b/src/app/game-model/scriptAccounts/ScriptAccount.ts
index f47f3c7..57556e7 100644
--- a/src/app/game-model/scriptAccounts/ScriptAccount.ts
+++ b/src/app/game-model/scriptAccounts/ScriptAccount.ts
@@ -1,5 +1,6 @@
import {ModelComponent} from "../ModelComponent";
import {ModelComponentType} from "../ModelComponentType";
+import {SaveComponent} from "../SaveComponent";
export class ScriptAccount extends ModelComponent{
minValue: number = 0;
@@ -8,7 +9,7 @@ export class ScriptAccount extends ModelComponent{
super(componentName, componentDescription, ModelComponentType.SCRIPTACCOUNT);
}
- save(): void {
+ save(): string {
+ return JSON.stringify(this, null, SaveComponent.JSON_INDENT)
}
-
}
diff --git a/testModel/script-accounts/Luftfeuchtigkeit.json b/testModel/script-accounts/Luftfeuchtigkeit.json
new file mode 100644
index 0000000..b948f4b
--- /dev/null
+++ b/testModel/script-accounts/Luftfeuchtigkeit.json
@@ -0,0 +1,8 @@
+{
+ "unsaved": false,
+ "componentName": "Luftfeuchtigkeit",
+ "componentDescription": "",
+ "type": 0,
+ "minValue": 0,
+ "maxValue": 100
+}
\ No newline at end of file
diff --git a/testModel/script-accounts/Temperature.json b/testModel/script-accounts/Temperature.json
new file mode 100644
index 0000000..c53736b
--- /dev/null
+++ b/testModel/script-accounts/Temperature.json
@@ -0,0 +1,8 @@
+{
+ "unsaved": false,
+ "componentName": "Temperature",
+ "componentDescription": "",
+ "type": 0,
+ "minValue": 0,
+ "maxValue": 100
+}
\ No newline at end of file
diff --git a/testModel/scriptAccounts/Temperature.json b/testModel/scriptAccounts/Temperature.json
new file mode 100644
index 0000000..c53736b
--- /dev/null
+++ b/testModel/scriptAccounts/Temperature.json
@@ -0,0 +1,8 @@
+{
+ "unsaved": false,
+ "componentName": "Temperature",
+ "componentDescription": "",
+ "type": 0,
+ "minValue": 0,
+ "maxValue": 100
+}
\ No newline at end of file