mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-25 19:08:49 +01:00
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import {MenuItem, subMenu} from "../menus/Menu";
|
|
|
|
export class EventBus<DetailType = any> {
|
|
private eventTarget: EventTarget;
|
|
|
|
constructor(name = "") {
|
|
this.eventTarget = document.appendChild(document.createComment(name));
|
|
}
|
|
|
|
on(type: TEventBus, listener: (event: CustomEvent<DetailType>) => void) {
|
|
if (type ==="loaded-protyle") {
|
|
console.warn("0.8.8 将移除 loaded-protyle, 请使用 loaded-protyle-static 进行替代");
|
|
}
|
|
this.eventTarget.addEventListener(type, listener);
|
|
}
|
|
|
|
once(type: TEventBus, listener: (event: CustomEvent<DetailType>) => void) {
|
|
this.eventTarget.addEventListener(type, listener, {once: true});
|
|
}
|
|
|
|
off(type: TEventBus, listener: (event: CustomEvent<DetailType>) => void) {
|
|
this.eventTarget.removeEventListener(type, listener);
|
|
}
|
|
|
|
emit(type: TEventBus, detail?: DetailType) {
|
|
return this.eventTarget.dispatchEvent(new CustomEvent(type, {detail, cancelable: true}));
|
|
}
|
|
}
|
|
|
|
export const emitOpenMenu = (options: {
|
|
plugins: import("./index").Plugin[],
|
|
type: TEventBus,
|
|
detail: any,
|
|
separatorPosition?: "top" | "bottom",
|
|
}) => {
|
|
const pluginSubMenu = new subMenu();
|
|
options.detail.menu = pluginSubMenu;
|
|
options.plugins.forEach((plugin) => {
|
|
plugin.eventBus.emit(options.type, options.detail);
|
|
});
|
|
if (pluginSubMenu.menus.length > 0) {
|
|
if (options.separatorPosition === "top") {
|
|
window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element);
|
|
}
|
|
window.siyuan.menus.menu.append(new MenuItem({
|
|
label: window.siyuan.languages.plugin,
|
|
icon: "iconPlugin",
|
|
type: "submenu",
|
|
submenu: pluginSubMenu.menus,
|
|
}).element);
|
|
if (options.separatorPosition === "bottom") {
|
|
window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element);
|
|
}
|
|
}
|
|
};
|