refactor: 重构 Manager 架构,引入 ManagerRegistry 和 BaseManager 基类
- 新增 ManagerRegistry 单例注册表,统一管理所有 Manager 实例 - 新增 BaseManager 基类,自动管理事件订阅清理 - 新增 BaseDialogManager 基类,统一对话框生命周期管理 - 重构 15 个 Manager 使用新基类 - 重构 Toolbar 按钮和 Menu 按钮移除 engine 参数依赖 - 删除 BimComponent 基类(已不再使用) - 为所有 Manager 和核心模块添加中文 JSDoc 注释
This commit is contained in:
@@ -1,30 +1,28 @@
|
||||
import { BimComponent } from '../core/component';
|
||||
import { BimEngine } from '../bim-engine';
|
||||
/**
|
||||
* 右键菜单管理器
|
||||
* 负责管理右键上下文菜单的显示和交互
|
||||
*/
|
||||
import { BaseManager } from '../core/base-manager';
|
||||
import { BimRightKey } from '../components/right-key';
|
||||
import { BimMenu } from '../components/menu';
|
||||
import { MenuItemConfig } from '../components/menu/item';
|
||||
|
||||
/**
|
||||
* 右键菜单管理器 (RightKeyManager)
|
||||
* 负责协调右键交互流程:
|
||||
* 1. 监听 Canvas/容器的 contextmenu 事件
|
||||
* 2. 通过注册的处理器 (Handler) 获取需要显示的菜单项
|
||||
* 3. 实例化 Menu 组件并装载到 RightKey 容器中显示
|
||||
* 右键菜单管理器
|
||||
* 支持注册多个上下文处理器,动态生成右键菜单
|
||||
*/
|
||||
export class RightKeyManager extends BimComponent {
|
||||
export class RightKeyManager extends BaseManager {
|
||||
/** 容器元素 */
|
||||
private container: HTMLElement;
|
||||
/** 右键面板实例 */
|
||||
private rightKeyPanel: BimRightKey;
|
||||
|
||||
// 存储注册的上下文处理器
|
||||
// 每个处理器接收鼠标事件,返回一组菜单项(如果没有对应菜单则返回 null)
|
||||
/** 上下文处理器列表 */
|
||||
private contextHandlers: Array<(e: MouseEvent) => MenuItemConfig[] | null> = [];
|
||||
|
||||
constructor(engine: BimEngine, container: HTMLElement) {
|
||||
super(engine);
|
||||
constructor(container: HTMLElement) {
|
||||
super();
|
||||
this.container = container;
|
||||
|
||||
// 初始化右键容器,设置极高的层级以覆盖所有 UI
|
||||
// 将事件监听和触发逻辑下放给 BimRightKey 组件
|
||||
this.rightKeyPanel = new BimRightKey({
|
||||
zIndex: 9000,
|
||||
container: this.container,
|
||||
@@ -33,55 +31,44 @@ export class RightKeyManager extends BimComponent {
|
||||
this.rightKeyPanel.init();
|
||||
}
|
||||
|
||||
/** 销毁管理器 */
|
||||
public destroy(): void {
|
||||
this.rightKeyPanel.destroy();
|
||||
super.destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册上下文菜单处理器
|
||||
* @param handler 处理函数,接收鼠标事件,返回菜单项数组
|
||||
* 注册上下文处理器
|
||||
* @param handler 处理器函数,返回菜单项配置
|
||||
*/
|
||||
public registerHandler(handler: (e: MouseEvent) => MenuItemConfig[] | null): void {
|
||||
this.contextHandlers.push(handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* 手动显示菜单
|
||||
* 允许外部直接调用以显示特定的菜单,不一定依赖右键事件
|
||||
* @param x 屏幕 X 坐标
|
||||
* @param y 屏幕 Y 坐标
|
||||
* @param items 菜单项列表
|
||||
* @param groupOrder 可选的分组顺序
|
||||
* 显示菜单
|
||||
* @param x 横坐标
|
||||
* @param y 纵坐标
|
||||
* @param items 菜单项配置
|
||||
* @param groupOrder 分组顺序
|
||||
*/
|
||||
public showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void {
|
||||
if (!items || items.length === 0) return;
|
||||
|
||||
// 1. 创建菜单内容组件
|
||||
const menu = new BimMenu({ items, groupOrder });
|
||||
menu.init(); // 必须初始化以生成 DOM
|
||||
menu.init();
|
||||
|
||||
// 2. 将菜单挂载到右键容器
|
||||
this.rightKeyPanel.mount(menu);
|
||||
|
||||
// 3. 显示容器
|
||||
this.rightKeyPanel.show(x, y);
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏右键菜单
|
||||
*/
|
||||
/** 隐藏菜单 */
|
||||
public hide(): void {
|
||||
this.rightKeyPanel.hide();
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理右键点击事件
|
||||
* 由 BimRightKey 组件在检测到有效右键点击时调用
|
||||
*/
|
||||
/** 处理右键点击事件 */
|
||||
private handleContextMenu = (e: MouseEvent): void => {
|
||||
// 1. 确定上下文项
|
||||
// 遍历所有注册的处理器,找到第一个返回非空结果的处理器
|
||||
// 这种责任链模式允许插件优先处理特定对象的右键
|
||||
let items: MenuItemConfig[] | null = null;
|
||||
for (const handler of this.contextHandlers) {
|
||||
const result = handler(e);
|
||||
@@ -91,11 +78,9 @@ export class RightKeyManager extends BimComponent {
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 如果有菜单项,则显示
|
||||
if (items && items.length > 0) {
|
||||
this.showMenu(e.clientX, e.clientY, items);
|
||||
} else {
|
||||
// 如果没有任何内容,则关闭可能存在的菜单
|
||||
this.hide();
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user