diff --git a/app/main.ts b/app/main.ts index 30431c1..e1bbffd 100644 --- a/app/main.ts +++ b/app/main.ts @@ -104,13 +104,13 @@ function createWindow(): BrowserWindow { { label: "Abstract Itemgroup", click: () => { - win!.webContents.send('context-menu', "new-itemgroup_abstract") + win!.webContents.send('context-menu', "new-itemgroup-abstract") } }, { label: "Concrete Itemgroup", click: () => { - win!.webContents.send('context-menu', "new-itemgroup_concrete") + win!.webContents.send('context-menu', "new-itemgroup-concrete") } }, { diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 6a0240f..f82569a 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -25,11 +25,13 @@ import {CharacterOverviewComponent} from "./side-overviews/character-overview/ch import {CharacterSerializer} from "./project/serializer/CharacterSerializer"; import {CharacterParser} from "./project/parser/characterParser/CharacterParser"; import {TemplateType} from "./project/game-model/templates/TemplateType"; -import {TemplateTypeUtilities} from "./project/game-model/templates/TemplateTypeUtilities"; import {SimpleTemplateGamesystem} from "./project/game-model/templates/simpleGamesystem/SimpleTemplateGamesystem"; import {ItemSerializer} from "./project/serializer/ItemSerializer"; import {ItemgroupParser} from "./project/parser/itemParser/ItemgroupParser"; import {ItemParser} from "./project/parser/itemParser/ItemParser"; +import {ItemgroupCreator} from "./project/game-model/utils/creator/ItemgroupCreator"; +import {ItemOverviewComponent} from "./side-overviews/item-overview/item-overview.component"; +import {Overview} from "./side-overviews/Overview"; @Component({ selector: 'app-root', @@ -44,6 +46,7 @@ export class AppComponent implements OnInit{ @ViewChild('scriptAccountOverview') scriptAccountOverview: ScriptAccountOverviewComponent | undefined @ViewChild('gamesystemOverview') gamesystemOverview: GamescriptOverviewComponent | undefined @ViewChild('characterOverview') characterOverview: CharacterOverviewComponent | undefined + @ViewChild('itemOverview') itemOverview: ItemOverviewComponent | undefined gameModel: GameModel | undefined @@ -82,12 +85,34 @@ export class AppComponent implements OnInit{ } else if(message.startsWith("new")) { const splittedMessage = message.split("-"); const modelComponentType = ModelComponentTypeUtillities.fromString(splittedMessage[1]); - const templateType = TemplateTypeUtilities.fromString(splittedMessage[2]); - if(modelComponentType != undefined) { - this.onCreateModelComponent(modelComponentType, templateType); - } else { - console.log("[ERROR] [App-Component] Unknown Context-Menu Command!") + if(modelComponentType) { + let creationContext = ""; + if(splittedMessage.length > 2) { + creationContext = splittedMessage[2]; + } + + let componentCreator; + switch (modelComponentType) { + case ModelComponentType.ITEMGROUP: { + componentCreator = new ItemgroupCreator(creationContext, this.gameModel!, this.selectedModelComponent); + + } + } + + if(componentCreator) { + const createdModel = componentCreator.createModelComponent(); + this.openModelComponent(createdModel!) + + const openedOverview = this.openedOverview; + if(openedOverview) { + openedOverview.refresh() + } + + } else { + console.log("[ERROR] Unknown Creation Command: ", message) + } } + } } @@ -303,6 +328,25 @@ export class AppComponent implements OnInit{ } } + get selectedModelComponent(): ModelComponent | undefined { + switch (this.openContent) { + case ModelComponentType.GAMESYTEM: return this.gamesystemOverview!.getSelectedGamesystem(); + case ModelComponentType.CHARACTER: return this.characterOverview!.selectedCharacter; + case ModelComponentType.SCRIPTACCOUNT: return this.scriptAccountOverview!.selectedScriptAccount; + case ModelComponentType.ITEMGROUP: return this.itemOverview!.selectedModelComponent; + case ModelComponentType.ITEM: return this.itemOverview!.selectedModelComponent; + default: return undefined + } + } + + get openedOverview(): Overview | undefined { + if(this.openContent === ModelComponentType.ITEMGROUP || this.openContent === ModelComponentType.ITEM) { + return this.itemOverview; + } else { + return undefined; + } + } + protected readonly open = open; } diff --git a/src/app/project/game-model/utils/creator/ItemgroupCreator.ts b/src/app/project/game-model/utils/creator/ItemgroupCreator.ts new file mode 100644 index 0000000..924ee6a --- /dev/null +++ b/src/app/project/game-model/utils/creator/ItemgroupCreator.ts @@ -0,0 +1,36 @@ +import {ModelComponentCreator} from "./ModelComponentCreator"; +import {ModelComponent} from "../../ModelComponent"; +import {GameModel} from "../../GameModel"; +import {AbstractItemGroup} from "../../inventory/AbstractItemGroup"; +import {ModelComponentType} from "../../ModelComponentType"; +import {ConcreteItemGroup} from "../../inventory/ConcreteItemGroup"; + +export class ItemgroupCreator extends ModelComponentCreator { + + + + constructor(context: string, gameModel: GameModel, selectedComponent: ModelComponent | undefined) { + super(context, gameModel, selectedComponent); + } + + createModelComponent(): ModelComponent | undefined{ + let itemgroup; + if(this.context === 'abstract') { + itemgroup = new AbstractItemGroup("New Abstract Itemgroup", "", ModelComponentType.ITEMGROUP); + } else if(this.context === 'concrete') { + itemgroup = new ConcreteItemGroup("New Concrete Itemgroup", "", ModelComponentType.ITEMGROUP); + } else { + return undefined + } + + if(this.selectedComponent != null && this.selectedComponent instanceof AbstractItemGroup) { + this.selectedComponent.addChildItemgroup(itemgroup); + } else { + this.gameModel.itemgroups.push(itemgroup); + } + + return itemgroup; + } + + +} diff --git a/src/app/project/game-model/utils/creator/ModelComponentCreator.ts b/src/app/project/game-model/utils/creator/ModelComponentCreator.ts new file mode 100644 index 0000000..68a90e2 --- /dev/null +++ b/src/app/project/game-model/utils/creator/ModelComponentCreator.ts @@ -0,0 +1,18 @@ +import {ModelComponent} from "../../ModelComponent"; +import {GameModel} from "../../GameModel"; +import {Overview} from "../../../../side-overviews/Overview"; + +export abstract class ModelComponentCreator { + context: string; + gameModel: GameModel + selectedComponent: ModelComponent | undefined + + + protected constructor(context: string, gameModel: GameModel, selectedComponent: ModelComponent | undefined) { + this.context = context; + this.gameModel = gameModel; + this.selectedComponent = selectedComponent; + } + + abstract createModelComponent(): ModelComponent | undefined; +} diff --git a/src/app/side-overviews/Overview.ts b/src/app/side-overviews/Overview.ts new file mode 100644 index 0000000..88dd18f --- /dev/null +++ b/src/app/side-overviews/Overview.ts @@ -0,0 +1,3 @@ +export interface Overview { + refresh(): void +} diff --git a/src/app/side-overviews/item-overview/item-overview.component.ts b/src/app/side-overviews/item-overview/item-overview.component.ts index 3ae9aa0..a41020e 100644 --- a/src/app/side-overviews/item-overview/item-overview.component.ts +++ b/src/app/side-overviews/item-overview/item-overview.component.ts @@ -8,6 +8,7 @@ import {ModelComponent} from "../../project/game-model/ModelComponent"; import {ModelComponentType} from "../../project/game-model/ModelComponentType"; import {ItemGroup} from "../../project/game-model/inventory/ItemGroup"; import {Item} from "../../project/game-model/inventory/Item"; +import {Overview} from "../Overview"; interface FlatNode { expandable: boolean, @@ -21,7 +22,7 @@ interface FlatNode { templateUrl: './item-overview.component.html', styleUrl: './item-overview.component.scss' }) -export class ItemOverviewComponent implements OnInit{ +export class ItemOverviewComponent implements OnInit, Overview{ @Input() gameModel: GameModel | undefined @Output() openItemgroupEmitter: EventEmitter = new EventEmitter(); @@ -120,4 +121,33 @@ export class ItemOverviewComponent implements OnInit{ } return undefined; } + + get selectedModelComponent() { + if(this.selectedItem) { + if(this.selectedItem.type === ModelComponentType.ITEMGROUP) { + let groupQueue: ItemGroup[] = this.gameModel!.itemgroups.concat(); + while(groupQueue.length > 0) { + const currentGroup = groupQueue.shift()!; + + if(currentGroup.componentName === this.selectedItem.name) { + return currentGroup; + } + + if(currentGroup instanceof AbstractItemGroup) { + groupQueue = groupQueue.concat(currentGroup.children); + } + } + } else { + return this.searchItemByName(this.selectedItem!.name) + } + } else { + return undefined + } + } + + refresh(): void { + this.dataSource.data = this.gameModel!.itemgroups; + console.log("Opened Refreshed") + } + }