Files
bim_engine/src/managers/right-key-manager.ts

89 lines
2.5 KiB
TypeScript
Raw Normal View History

/**
*
*
*/
import { BaseManager } from '../core/base-manager';
import { ManagerRegistry } from '../core/manager-registry';
import { BimRightKey } from '../components/right-key';
import { BimMenu } from '../components/menu';
import { MenuItemConfig } from '../components/menu/item';
/**
*
*
*/
export class RightKeyManager extends BaseManager {
/** 容器元素 */
private container: HTMLElement;
/** 右键面板实例 */
private rightKeyPanel: BimRightKey;
/** 上下文处理器列表 */
private contextHandlers: Array<(e: MouseEvent) => MenuItemConfig[] | null> = [];
constructor(container: HTMLElement, registry: ManagerRegistry) {
super(registry);
this.container = container;
this.rightKeyPanel = new BimRightKey({
zIndex: 9000,
container: this.container,
onContext: this.handleContextMenu
});
this.rightKeyPanel.init();
}
/** 销毁管理器 */
public destroy(): void {
this.rightKeyPanel.destroy();
super.destroy();
}
/**
*
* @param handler
*/
public registerHandler(handler: (e: MouseEvent) => MenuItemConfig[] | null): void {
this.contextHandlers.push(handler);
}
/**
*
* @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;
const menu = new BimMenu({ items, groupOrder });
menu.init();
this.rightKeyPanel.mount(menu);
this.rightKeyPanel.show(x, y);
}
/** 隐藏菜单 */
public hide(): void {
this.rightKeyPanel.hide();
}
/** 处理右键点击事件 */
private handleContextMenu = (e: MouseEvent): void => {
let items: MenuItemConfig[] | null = null;
for (const handler of this.contextHandlers) {
const result = handler(e);
if (result && result.length > 0) {
if (!items) items = [];
items = items.concat(result);
}
}
if (items && items.length > 0) {
this.showMenu(e.clientX, e.clientY, items);
} else {
this.hide();
}
};
}