124 lines
4.8 KiB
TypeScript
124 lines
4.8 KiB
TypeScript
import {AbstractActionManager, AbstractMesh, ActionManager, Observable, Scene} from "@babylonjs/core";
|
|
import {DiagramEntity, DiagramEvent, DiagramEventType} from "./types/diagramEntity";
|
|
import log from "loglevel";
|
|
import {Controllers} from "../controllers/controllers";
|
|
import {AppConfig} from "../util/appConfig";
|
|
import {buildEntityActionManager} from "./functions/buildEntityActionManager";
|
|
import {DefaultScene} from "../defaultScene";
|
|
import {DiagramMenuManager} from "./diagramMenuManager";
|
|
import {DiagramEventObserverMask} from "./types/diagramEventObserverMask";
|
|
import {DiagramObject} from "../objects/diagramObject";
|
|
|
|
|
|
export class DiagramManager {
|
|
private logger = log.getLogger('DiagramManager');
|
|
public readonly _config: AppConfig;
|
|
private readonly _controllers: Controllers;
|
|
private readonly _diagramEntityActionManager: ActionManager;
|
|
public readonly onDiagramEventObservable: Observable<DiagramEvent> = new Observable();
|
|
private readonly _diagramMenuManager: DiagramMenuManager;
|
|
private readonly _scene: Scene;
|
|
private readonly _diagramObjects: Map<string, DiagramObject> = new Map<string, DiagramObject>();
|
|
|
|
constructor() {
|
|
this._scene = DefaultScene.Scene;
|
|
this._config = new AppConfig();
|
|
this._controllers = new Controllers();
|
|
this._diagramMenuManager = new DiagramMenuManager(this.onDiagramEventObservable, this._controllers, this._config);
|
|
this._diagramEntityActionManager = buildEntityActionManager(this._controllers);
|
|
this.onDiagramEventObservable.add(this.onDiagramEvent, DiagramEventObserverMask.FROM_DB, true, this);
|
|
|
|
document.addEventListener('uploadImage', (event: CustomEvent) => {
|
|
const diagramEntity: DiagramEntity = {
|
|
template: '#image-template',
|
|
image: event.detail.data,
|
|
text: event.detail.name,
|
|
position: {x: 0, y: 1.6, z: 0},
|
|
rotation: {x: 0, y: Math.PI, z: 0},
|
|
scale: {x: 1, y: 1, z: 1},
|
|
}
|
|
const object = new DiagramObject(this._scene, {diagramEntity: diagramEntity});
|
|
this._diagramObjects.set(diagramEntity.id, object);
|
|
|
|
//const newMesh = buildMeshFromDiagramEntity(diagramEntity, this._scene);
|
|
if (this.onDiagramEventObservable) {
|
|
this.onDiagramEventObservable.notifyObservers({
|
|
type: DiagramEventType.ADD,
|
|
entity: diagramEntity
|
|
}, DiagramEventObserverMask.TO_DB);
|
|
}
|
|
|
|
});
|
|
this.logger.debug("DiagramManager constructed");
|
|
}
|
|
|
|
public get actionManager(): AbstractActionManager {
|
|
return this._diagramEntityActionManager;
|
|
}
|
|
|
|
public get diagramMenuManager(): DiagramMenuManager {
|
|
return this._diagramMenuManager;
|
|
}
|
|
|
|
public getDiagramObject(id: string) {
|
|
return this._diagramObjects.get(id);
|
|
}
|
|
|
|
public isDiagramObject(mesh: AbstractMesh) {
|
|
return this._diagramObjects.has(mesh?.id)
|
|
}
|
|
|
|
|
|
public get controllers(): Controllers {
|
|
return this._controllers;
|
|
}
|
|
|
|
public createCopy(id: string): DiagramObject {
|
|
const diagramObject = this._diagramObjects.get(id);
|
|
if (!diagramObject) {
|
|
return null;
|
|
}
|
|
const obj = diagramObject.clone();
|
|
return obj;
|
|
}
|
|
|
|
public addObject(diagramObject: DiagramObject) {
|
|
this._diagramObjects.set(diagramObject.diagramEntity.id, diagramObject);
|
|
}
|
|
public get config(): AppConfig {
|
|
return this._config;
|
|
}
|
|
|
|
|
|
private onDiagramEvent(event: DiagramEvent) {
|
|
switch (event.type) {
|
|
case DiagramEventType.ADD:
|
|
let diagramObject = this._diagramObjects.get(event.entity.id);
|
|
if (diagramObject) {
|
|
diagramObject.fromDiagramEntity(event.entity);
|
|
} else {
|
|
diagramObject = new DiagramObject(this._scene,
|
|
{diagramEntity: event.entity, actionManager: this._diagramEntityActionManager});
|
|
}
|
|
if (diagramObject) {
|
|
this._diagramObjects.set(event.entity.id, diagramObject);
|
|
}
|
|
break;
|
|
case DiagramEventType.REMOVE:
|
|
const object = this._diagramObjects.get(event.entity.id);
|
|
if (object) {
|
|
object.dispose();
|
|
}
|
|
this._diagramObjects.delete(event.entity.id);
|
|
break;
|
|
case DiagramEventType.MODIFY:
|
|
console.log(event);
|
|
if (event.entity.text) {
|
|
const diagramObject = this._diagramObjects.get(event.entity.id);
|
|
diagramObject.text = event.entity.text;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|