control/entityEditor/EntityEditor.tstypescript
import { Control, type IControlParams } from "../Control";
import { EntityEditorScene, type EditModeName } from "./EntityEditorScene";
import { EntityEditorDialog } from "./EntityEditorDialog";
import { CameraLock } from "../CameraLock";
import { Entity } from "../../entity/Entity";
import { Dialog } from "../../ui";

export interface IEntityEditorParams extends IControlParams {
    editMode?: EditModeName;
}

export class EntityEditor extends Control {
    protected _entityEditorScene: EntityEditorScene;
    protected _dialog: EntityEditorDialog;

    constructor(options: IEntityEditorParams = {}) {
        super({
            name: "EntityEditor",
            ...options
        });

        this._entityEditorScene = new EntityEditorScene({
            name: `entityEditorScene:${this.__id}`,
            editMode: options.editMode
        });

        this._dialog = new EntityEditorDialog({
            model: this._entityEditorScene
        });
    }

    public override oninit() {
        if (this.renderer) {
            this.renderer.addControl(new CameraLock({ planet: this.planet }));
            this._entityEditorScene.bindPlanet(this.planet!);
            this._dialog.appendTo(this.renderer.getUIContainer());
            this.activate();
        }
    }

    public override onactivate() {
        this.renderer && this.renderer.addScene(this._entityEditorScene);
    }

    public override ondeactivate() {
        this.renderer && this.renderer.removeNode(this._entityEditorScene);
        this._dialog.hide();
    }

    public selectEntity(entity: Entity): void {
        if (!this.isActive()) {
            this.activate();
        }
        this._entityEditorScene.select(entity);
    }

    public positionDialogLeftOf(anchor: Dialog<unknown>): void {
        this._dialog.positionNearElementOnFirstOpen(anchor.el);
    }

    public unselectEntity(): void {
        this._entityEditorScene.unselect();
    }

    public getSelectedEntity(): Entity | null {
        return this._entityEditorScene.getSelectedEntity();
    }
}