From d59e0f59598f3de775645d2eff9626cecc536c17 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 20 Jun 2024 12:34:32 -0700 Subject: [PATCH] add contextmenu model, example code in block.tsx --- frontend/app/block/block.tsx | 15 ++++++++-- frontend/app/store/contextmenu.ts | 50 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 frontend/app/store/contextmenu.ts diff --git a/frontend/app/block/block.tsx b/frontend/app/block/block.tsx index 54a3f5e2c..e7583f4f2 100644 --- a/frontend/app/block/block.tsx +++ b/frontend/app/block/block.tsx @@ -7,6 +7,7 @@ import { PreviewView } from "@/app/view/preview"; import { TerminalView } from "@/app/view/term/term"; import { ErrorBoundary } from "@/element/errorboundary"; import { CenteredDiv } from "@/element/quickelems"; +import { ContextMenuModel } from "@/store/contextmenu"; import { atoms, globalStore, useBlockAtom } from "@/store/global"; import * as WOS from "@/store/wos"; import clsx from "clsx"; @@ -87,6 +88,14 @@ const BlockFrame_Tech = ({ if (preview) { isFocused = true; } + function handleContextMenu(e: React.MouseEvent) { + let menu: ContextMenuItem[] = []; + menu.push({ + label: "Close", + click: onClose, + }); + ContextMenuModel.showContextMenu(menu, e); + } return (
-
+
{getBlockHeaderText(blockData)}
-
- +
+
{preview ?
: children}
diff --git a/frontend/app/store/contextmenu.ts b/frontend/app/store/contextmenu.ts new file mode 100644 index 000000000..1adf04d29 --- /dev/null +++ b/frontend/app/store/contextmenu.ts @@ -0,0 +1,50 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { v4 as uuidv4 } from "uuid"; +import { getApi } from "./global"; + +class ContextMenuModelType { + handlers: Map void> = new Map(); // id -> handler + + constructor() { + getApi().onContextMenuClick(this.handleContextMenuClick.bind(this)); + } + + handleContextMenuClick(e: any, id: string): void { + let handler = this.handlers.get(id); + if (handler) { + handler(); + } + } + + _convertAndRegisterMenu(menu: ContextMenuItem[]): ElectronContextMenuItem[] { + let electronMenuItems: ElectronContextMenuItem[] = []; + for (let item of menu) { + let electronItem: ElectronContextMenuItem = { + role: item.role, + type: item.type, + label: item.label, + id: uuidv4(), + }; + if (item.click) { + this.handlers.set(electronItem.id, item.click); + } + if (item.submenu) { + electronItem.submenu = this._convertAndRegisterMenu(item.submenu); + } + electronMenuItems.push(electronItem); + } + return electronMenuItems; + } + + showContextMenu(menu: ContextMenuItem[], ev: React.MouseEvent): void { + this.handlers.clear(); + const electronMenuItems = this._convertAndRegisterMenu(menu); + getApi().showContextMenu(electronMenuItems, { x: ev.clientX, y: ev.clientY }); + } +} + +const ContextMenuModel = new ContextMenuModelType(); + +export { ContextMenuModel, ContextMenuModelType };