import {Component, Input, OnInit} from '@angular/core'; import {GameModel} from "../../project/game-model/GameModel"; import {FlatTreeControl} from "@angular/cdk/tree"; import {MatTreeFlatDataSource, MatTreeFlattener} from "@angular/material/tree"; import {ItemGroup} from "../../project/game-model/inventory/ItemGroup"; import {AbstractItemGroup} from "../../project/game-model/inventory/AbstractItemGroup"; import {ConcreteItemGroup} from "../../project/game-model/inventory/ConcreteItemGroup"; import {ModelComponent} from "../../project/game-model/ModelComponent"; import {Item} from "../../project/game-model/inventory/Item"; import {ModelComponentType} from "../../project/game-model/ModelComponentType"; interface FlatNode { expandable: boolean, name: string, level: number } @Component({ selector: 'app-item-overview', templateUrl: './item-overview.component.html', styleUrl: './item-overview.component.scss' }) export class ItemOverviewComponent implements OnInit{ @Input() gameModel: GameModel | undefined private _transformer = (node: ModelComponent, level: number) => { if(node instanceof AbstractItemGroup) { return { expandable: !!node.children && node.children.length > 0, name: node.componentName, level: level, }; } else if(node instanceof ConcreteItemGroup) { return { expandable: !!node.items && node.items.length > 0, name: node.componentName, level: level } } else { return { expandable: false, name: node.componentName, level: level } } }; treeControl = new FlatTreeControl( node => node.level, node => node.expandable, ); treeFlattener = new MatTreeFlattener( this._transformer, node => node.level, node => node.expandable, node => this.getNodeChildren(node) ); dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); hasChild = (_: number, node: FlatNode) => node.expandable; getNodeChildren(node: ModelComponent): ModelComponent[] { if(node instanceof ConcreteItemGroup) { return node.items; } else if(node instanceof AbstractItemGroup) { return node.children; } else { return []; } } ngOnInit() { this.dataSource.data = this.gameModel!.itemgroups; } }