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