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 的场景卡片