control/entityEditor/EntityEditor.tstypescript
import { EntityGizmo, type IEntityGizmoParams } from "../entityGizmo/EntityGizmo";
import { EntityEditorDialog } from "./EntityEditorDialog";
import { CameraLock } from "../CameraLock";
import { Dialog } from "../../ui";

export interface IEntityEditorParams extends IEntityGizmoParams {
    visibility?: boolean;
}

/**
 * Entity properties editor. Combines the {@link EntityGizmo} on-map transform mechanism
 * with the "Entity Properties" dialog.
 * @class
 * @extends {EntityGizmo}
 */
export class EntityEditor extends EntityGizmo {
    protected _dialog: EntityEditorDialog;
    protected _visibility: boolean;

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

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

        this._visibility = options.visibility || false;

        this.events.on("unselect", this._onUnselectEntity);
    }

    public override oninit() {
        super.oninit();
        if (this.renderer) {
            this.renderer.addControl(new CameraLock({ planet: this.planet }));
            this._dialog.appendTo(this.renderer.getUIContainer());
            if (this._visibility) {
                this._dialog.show();
            }
        }
    }

    public override ondeactivate() {
        super.ondeactivate();
        this._dialog.hide();
    }

    protected _onUnselectEntity = () => {
        if (!this._visibility) {
            this._dialog.hide();
        }
    };

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