From 83e4d68af7caa966aa442d8cd7aa0180e7f61905 Mon Sep 17 00:00:00 2001 From: xudan Date: Tue, 14 Oct 2025 14:21:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E8=BF=90=E5=8A=A8=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E9=A1=B5=E9=9D=A2=E4=B8=AD=E6=96=B0=E5=A2=9E=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E8=8F=9C=E5=8D=95=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E7=94=BB=E5=B8=83=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/movement-supervision.vue | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/pages/movement-supervision.vue b/src/pages/movement-supervision.vue index 4028ce9..df9dae5 100644 --- a/src/pages/movement-supervision.vue +++ b/src/pages/movement-supervision.vue @@ -390,6 +390,7 @@ onMounted(() => { editorStore.setEditor(editor as ShallowRef); storageLocationService.value = new StorageLocationService(editor.value, props.sid); + container.value?.addEventListener('pointerdown', handleCanvasPointerDown, true); }); //#endregion @@ -450,6 +451,13 @@ onUnmounted(() => { }); } + container.value?.removeEventListener('pointerdown', handleCanvasPointerDown, true); + + if (rightClickGuardTimer) { + clearTimeout(rightClickGuardTimer); + rightClickGuardTimer = undefined; + } + // 移除全局事件监听器 document.removeEventListener('click', handleGlobalClick); document.removeEventListener('keydown', handleGlobalKeydown); @@ -555,6 +563,28 @@ const show = ref(true); // 右键菜单状态管理 - 使用组合式函数 const contextMenuManager = createContextMenuManager(); const contextMenuState = ref(contextMenuManager.getState()); +let rightClickGuardTimer: ReturnType | undefined; + +/** + * Guard selection state before Meta2D processes the contextmenu event. + */ +const handleCanvasPointerDown = (event: PointerEvent) => { + if (event.button !== 2) return; + + contextMenuManager.setState({ isRightClickActive: true }); + + if (rightClickGuardTimer) { + clearTimeout(rightClickGuardTimer); + } + + rightClickGuardTimer = setTimeout(() => { + rightClickGuardTimer = undefined; + if (!contextMenuState.value.visible) { + contextMenuManager.setState({ isRightClickActive: false }); + } + }, 200); +}; + //#endregion // 返回到父级 iframe 的场景卡片