From 042c546ebe96bf521104ce8c0692a801dde957b9 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Thu, 27 Aug 2026 18:51:27 +0200 Subject: [PATCH] task(C3fin2): snap marks and selection handles wired to canvas events --- frontend/src/components/CanvasArea.tsx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/frontend/src/components/CanvasArea.tsx b/frontend/src/components/CanvasArea.tsx index 9b43e36..b49f780 100644 --- a/frontend/src/components/CanvasArea.tsx +++ b/frontend/src/components/CanvasArea.tsx @@ -154,6 +154,30 @@ const CanvasArea: React.FC = ({ hitTest: (wx, wy, tol) => renderEngine.hitTest(wx, wy, tol), }), }); + + // ── Task C3fin: Snap-Marks + Selection-Handles im Pixi-Overlay ── + if (pixi && USE_PIXI_RENDERER) { + // Snap-Marks bei Mausbewegung (wenn ein V2-Tool aktiv ist): + const snapMove = (e: PointerEvent) => { + if (!dispatcherRef.current?.getActive()) return; + const rect = canvas.getBoundingClientRect(); + const world = zoomPan.screenToWorld(e.clientX - rect.left, e.clientY - rect.top); + const snapResult = snapEngine.snap(world.x, world.y); + const marks = snapResult.point + ? [{ x: snapResult.point.x, y: snapResult.point.y, type: (snapResult.point as { type?: string }).type ?? 'snap' }] + : []; + pixi!.setSnapPoints(marks); + }; + canvas.addEventListener('pointermove', snapMove); + + // Selection-Handles bei Änderung: + const origSetIds = selectionEngine.selectByIds.bind(selectionEngine); + selectionEngine.selectByIds = (ids: string[], additive: boolean) => { + origSetIds(ids, additive); + const selected = v2Doc.getAllElements().filter((el) => ids.includes(el.id)); + pixi!.setSelection({ selectedIds: ids, elements: selected }); + }; + } logger.info('InteractionDispatcher v2 aktiviert (VITE_TOOL_DISPATCHER=v2)'); }