diff --git a/src/diagram/diagramManager.ts b/src/diagram/diagramManager.ts index d6e4d28..91b3093 100644 --- a/src/diagram/diagramManager.ts +++ b/src/diagram/diagramManager.ts @@ -117,11 +117,14 @@ export class DiagramManager { this._diagramObjects.delete(event.entity.id); break; case DiagramEventType.MODIFY: - console.log(event); + this._logger.debug(event); //diagramObject = this._diagramObjects.get(event.entity.id); - if (diagramObject && event.entity.text) { + if (diagramObject && event.entity.text && event.entity.text != diagramObject.text) { diagramObject.text = event.entity.text; + } else { + this._logger.warn('Skipping text update for', event); } + if (event.entity.position) { //diagramObject.position = event.entity.position; } diff --git a/src/diagram/diagramMenuManager.ts b/src/diagram/diagramMenuManager.ts index 5ea9ed9..2c3de0c 100644 --- a/src/diagram/diagramMenuManager.ts +++ b/src/diagram/diagramMenuManager.ts @@ -23,7 +23,7 @@ export class DiagramMenuManager { private readonly _inputTextView: InputTextView; private readonly _scene: Scene; private _cameraMenu: CameraMenu; - private logger = log.getLogger('DiagramMenuManager'); + private _logger = log.getLogger('DiagramMenuManager'); private _connectionPreview: ConnectionPreview; constructor(notifier: Observable, controllers: Controllers, config: AppConfig) { @@ -35,7 +35,8 @@ export class DiagramMenuManager { this.configMenu = new ConfigMenu(config); this._inputTextView.onTextObservable.add((evt) => { - this.notifyAll({type: DiagramEventType.MODIFY, entity: {id: evt.id, text: evt.text}}); + const event = {type: DiagramEventType.MODIFY, entity: {id: evt.id, text: evt.text}} + this._notifier.notifyObservers(event, DiagramEventObserverMask.FROM_DB); }); this.toolbox = new Toolbox(); this.scaleMenu = new ScaleMenu2(this._notifier); @@ -90,7 +91,7 @@ export class DiagramMenuManager { public createClickMenu(mesh: AbstractMesh, input: WebXRInputSource): ClickMenu { const clickMenu = new ClickMenu(mesh); clickMenu.onClickMenuObservable.add((evt: ActionEvent) => { - console.log(evt); + this._logger.debug(evt); switch (evt.source.id) { case "remove": this.notifyAll({type: DiagramEventType.REMOVE, entity: {id: clickMenu.mesh.id}}); @@ -108,7 +109,7 @@ export class DiagramMenuManager { this.scaleMenu.hide(); break; } - console.log(evt); + this._logger.debug(evt); }, -1, false, this, false); diff --git a/src/diagram/diagramObject.ts b/src/diagram/diagramObject.ts index f8db586..efae673 100644 --- a/src/diagram/diagramObject.ts +++ b/src/diagram/diagramObject.ts @@ -35,6 +35,7 @@ export class DiagramObject { private _label: AbstractMesh; private _meshesPresent: boolean = false; private _positionHash: string; + private _disposed: boolean = false; private _fromMesh: AbstractMesh; private _toMesh: AbstractMesh; private _meshRemovedObserver: Observer; @@ -110,9 +111,18 @@ export class DiagramObject { if (this._label) { this._label.dispose(); } + if (this._diagramEntity.text != value) { + this._eventObservable.notifyObservers({ + type: DiagramEventType.MODIFY, + entity: this._diagramEntity + }, DiagramEventObserverMask.TO_DB); + } + this._diagramEntity.text = value; this._label = createLabel(value); this._label.parent = this._baseTransform; this.updateLabelPosition(); + + } public updateLabelPosition() { @@ -255,20 +265,25 @@ export class DiagramObject { } public dispose() { + if (this._disposed) { + this._logger.warn('DiagramObject dispose called for ', this._diagramEntity?.id, ' but it is already disposed'); + return; + } this._logger.debug('DiagramObject dispose called for ', this._diagramEntity?.id) this._scene?.onAfterRenderObservable.remove(this._sceneObserver); this._sceneObserver = null; this._mesh?.setParent(null); this._mesh?.dispose(true, false); this._mesh = null; - this._label?.dispose(); + this._label?.dispose(false, true); this._label = null; - this._baseTransform?.dispose(); + this._baseTransform?.dispose(false); this._diagramEntity = null; this._scene = null; this._fromMesh = null; this._toMesh = null; this._scene?.onMeshRemovedObservable.remove(this._meshRemovedObserver); + this._disposed = true; } private updateConnection() { diff --git a/src/integration/functions/syncDoc.ts b/src/integration/functions/syncDoc.ts index 3ce19b9..df01b87 100644 --- a/src/integration/functions/syncDoc.ts +++ b/src/integration/functions/syncDoc.ts @@ -3,6 +3,7 @@ import {DiagramEntity} from "../../diagram/types/diagramEntity"; import {Observable} from "@babylonjs/core"; import {UserModelType} from "../../users/userTypes"; import {Encryption} from "../encryption"; +import {DiagramEventObserverMask} from "../../diagram/types/diagramEventObserverMask"; export async function syncDoc(info: any, onDBRemoveObservable: Observable, onDBUpdateObservable: Observable, onUserObservable: Observable, @@ -26,9 +27,12 @@ export async function syncDoc(info: any, onDBRemoveObservable: Observable