From ab2c3465b01e4062ca3eae0571f641bc7016141a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Fri, 4 Sep 2026 14:17:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=A2=84=E8=A7=88=E6=8B=96?= =?UTF-8?q?=E5=8A=A8=E5=BD=93=E5=89=8D=E9=80=89=E4=B8=AD=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拖动命中其它节点时保持变换提交到按下前选中节点 补充跨节点拖动不重新选择命中节点的回归测试 避免无效选中节点提前捕获指针 --- .../preview/useNodeTransformInteraction.ts | 6 ++-- .../useNodeTransformInteraction.test.tsx | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/useNodeTransformInteraction.ts b/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/useNodeTransformInteraction.ts index 86241117b..6460ba0bf 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/useNodeTransformInteraction.ts +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/useNodeTransformInteraction.ts @@ -264,14 +264,14 @@ export function useNodeTransformInteraction({ ) { return; } - event.stopPropagation(); - event.currentTarget.setPointerCapture(event.pointerId); - suppressNextNodeClickRef.current = false; const selectedNode = selectedNodeId && tree ? findNodeById(tree.root, selectedNodeId) : null; const dragNode = selectedNode && selectedNode.id !== tree?.root.id ? selectedNode : node; if (!isFiniteTransform(dragNode.layout.transform)) return; + event.stopPropagation(); + event.currentTarget.setPointerCapture(event.pointerId); + suppressNextNodeClickRef.current = false; event.preventDefault(); activeGestureRef.current = { kind: 'drag', diff --git a/apps/ai-game-creator-shell/tests/useNodeTransformInteraction.test.tsx b/apps/ai-game-creator-shell/tests/useNodeTransformInteraction.test.tsx index a9b48fe39..7434c355e 100644 --- a/apps/ai-game-creator-shell/tests/useNodeTransformInteraction.test.tsx +++ b/apps/ai-game-creator-shell/tests/useNodeTransformInteraction.test.tsx @@ -131,6 +131,40 @@ function renderInteraction({ } describe('useNodeTransformInteraction', () => { + it('moves the current selection when dragging another node without selecting the hit node', () => { + const selected = transformedNode('selected', { + anchor_min: [0, 0], + anchor_max: [0, 0], + offset_min: [20, 20], + offset_max: [80, 70], + }); + const tree: UITree = { + src_ui_design: 'page', + root: node('root', [selected, child]), + }; + const { result, canvasProjection } = renderInteraction({ + tree, + selectedNodeId: 'selected', + }); + const target = gestureTarget(); + + act(() => { + result.current.onNodePointerDown(pointerEvent(target, 1, 0, 0), child); + result.current.onNodePointerMove(pointerEvent(target, 1, 4, 0)); + result.current.onNodePointerUp(pointerEvent(target, 1, 4, 0)); + }); + + expect(canvasProjection.selectNode).not.toHaveBeenCalled(); + expect(canvasProjection.updateNodeTransform).toHaveBeenCalledWith( + 'page', + 'selected', + expect.objectContaining({ + offset_min: [24, 20], + offset_max: [84, 70], + }), + ); + }); + it('prevents native text selection when starting a node drag', () => { const { result } = renderInteraction(); const target = gestureTarget();