98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
import { BimComponent } from '../core/component';
|
||
import { BimEngine } from '../bim-engine';
|
||
import { BimDialog } from '../components/dialog';
|
||
import { WalkPlanViewPanel } from '../components/walk-plan-view-panel';
|
||
|
||
/**
|
||
* 平面图弹窗管理器
|
||
*/
|
||
export class WalkPlanViewDialogManager extends BimComponent {
|
||
private dialogId = 'walk-plan-view-dialog';
|
||
private dialog: BimDialog | null = null;
|
||
private panel: WalkPlanViewPanel | null = null;
|
||
|
||
constructor(engine: BimEngine) {
|
||
super(engine);
|
||
}
|
||
|
||
public init(): void {
|
||
// 可以在这里监听事件
|
||
}
|
||
|
||
/**
|
||
* 显示弹窗
|
||
*/
|
||
public show(): void {
|
||
if (!this.engine.dialog || !this.engine.container) {
|
||
console.warn('Dialog manager or container is not initialized');
|
||
return;
|
||
}
|
||
|
||
// 如果已打开,先销毁
|
||
this.destroy();
|
||
|
||
// 创建面板(暂时空内容)
|
||
this.panel = new WalkPlanViewPanel();
|
||
this.panel.init();
|
||
|
||
const dialogWidth = 300;
|
||
const dialogHeight = 400;
|
||
const paddingLeft = 20;
|
||
const paddingBottom = 20;
|
||
const container = this.engine.container;
|
||
const containerHeight = container.clientHeight;
|
||
|
||
// 左下角:left: 20px, bottom: 20px
|
||
const x = paddingLeft;
|
||
const y = containerHeight - dialogHeight - paddingBottom;
|
||
|
||
this.dialog = this.engine.dialog.create({
|
||
id: this.dialogId,
|
||
title: 'walkControl.planView.dialogTitle',
|
||
width: dialogWidth,
|
||
height: dialogHeight,
|
||
position: { x, y },
|
||
draggable: true,
|
||
resizable: false,
|
||
content: this.panel.element,
|
||
onClose: () => {
|
||
// 通知主控制面板更新状态
|
||
if (this.engine.walkControl && this.engine.walkControl.panel) {
|
||
this.engine.walkControl.panel.setPlanViewActive(false);
|
||
}
|
||
this.hide();
|
||
}
|
||
});
|
||
this.dialog.init();
|
||
}
|
||
|
||
/**
|
||
* 隐藏弹窗
|
||
*/
|
||
public hide(): void {
|
||
this.destroy();
|
||
}
|
||
|
||
/**
|
||
* 销毁弹窗和面板
|
||
*/
|
||
public destroy(): void {
|
||
// 先保存 dialog 引用,避免在回调中重复调用
|
||
const dialog = this.dialog;
|
||
|
||
// 立即清空引用,防止递归
|
||
this.dialog = null;
|
||
|
||
// 关闭弹窗
|
||
if (dialog) {
|
||
dialog.destroy();
|
||
}
|
||
|
||
// 销毁面板
|
||
if (this.panel) {
|
||
this.panel.destroy();
|
||
this.panel = null;
|
||
}
|
||
}
|
||
}
|