From aa6153d28912d1d2d8c6575ad7600521bd8eb797 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 4 Jan 2026 10:18:49 +0330 Subject: [PATCH] base mask --- src/pages/editor/components/EditorCanvas.tsx | 53 +++++++---- src/pages/editor/components/LayersList.tsx | 10 +- .../components/canvas/MaskShapeRenderer.tsx | 76 +++++++++++++++ .../components/canvas/ObjectRenderer.tsx | 92 +++++++++++++++---- .../editor/components/canvas/drawingUtils.ts | 6 +- .../editor/components/canvas/maskUtils.ts | 58 ++++++++++++ .../components/sidebar/ObjectSettings.tsx | 6 +- .../instructions/RectangleInstruction.tsx | 4 +- .../sidebar/settings/MaskSettings.tsx | 77 ++++++++++++++++ .../components/sidebar/settings/index.ts | 1 + .../editor/components/tools/AbstractShape.tsx | 24 ++++- .../editor/components/tools/CircleShape.tsx | 25 ++++- .../components/tools/RectangleShape.tsx | 25 ++++- .../editor/components/tools/TriangleShape.tsx | 24 ++++- src/pages/editor/store/editorStore.ts | 2 + src/pages/editor/store/shapeStore.ts | 4 + 16 files changed, 435 insertions(+), 52 deletions(-) create mode 100644 src/pages/editor/components/canvas/MaskShapeRenderer.tsx create mode 100644 src/pages/editor/components/canvas/maskUtils.ts create mode 100644 src/pages/editor/components/sidebar/settings/MaskSettings.tsx diff --git a/src/pages/editor/components/EditorCanvas.tsx b/src/pages/editor/components/EditorCanvas.tsx index 7bc5464..82cfcbd 100644 --- a/src/pages/editor/components/EditorCanvas.tsx +++ b/src/pages/editor/components/EditorCanvas.tsx @@ -6,6 +6,7 @@ import { useDrawingHandlers } from "./canvas/useDrawingHandlers"; import { useStageSize } from "./canvas/useStageSize"; import { useKeyboardMovement } from "./canvas/useKeyboardMovement"; import ObjectRenderer from "./canvas/ObjectRenderer"; +import { getMaskForObject } from "./canvas/maskUtils"; import CellEditor from "@/components/CellEditor"; import ZoomControls from "./ZoomControls"; @@ -110,7 +111,16 @@ const EditorCanvas = () => { const timeoutId = setTimeout(() => { if (!layerRef.current || !transformerRef.current) return; - const node = layerRef.current.findOne(`#${selectedObjectId}`); + // Check if object is masked - if so, find parent Group + const maskShape = getMaskForObject(selectedObject, objects); + let node: Konva.Node | undefined; + + if (maskShape) { + node = layerRef.current.findOne(`.masked-group-${selectedObjectId}`); + } else { + node = layerRef.current.findOne(`#${selectedObjectId}`); + } + if (node && transformerRef.current) { transformerRef.current.nodes([node]); transformerRef.current.getLayer()?.batchDraw(); @@ -169,7 +179,7 @@ const EditorCanvas = () => { onMouseMove={handleStageMouseMove} onMouseUp={handleStageMouseUp} > - + { fill="#ffffff" listening={false} /> - {objects.map((obj) => ( - - ))} + + + + {objects.map((obj) => { + const maskShape = getMaskForObject(obj, objects); + + return ( + + ); + })} + {selectedObjectId && (() => { const selectedObject = objects.find(obj => obj.id === selectedObjectId); const isText = selectedObject?.type === "text"; diff --git a/src/pages/editor/components/LayersList.tsx b/src/pages/editor/components/LayersList.tsx index c7897e8..bbe2746 100644 --- a/src/pages/editor/components/LayersList.tsx +++ b/src/pages/editor/components/LayersList.tsx @@ -25,8 +25,12 @@ const LayersList = () => { } } - const getLayerLabel = (type: string) => { - switch (type) { + const getLayerLabel = (obj: typeof objects[0]) => { + if (obj.isMask) { + return 'ماسک' + } + + switch (obj.type) { case 'text': return 'متن' case 'rectangle': @@ -60,7 +64,7 @@ const LayersList = () => { )} >
{getLayerIcon(obj.type)}
-
{getLayerLabel(obj.type)}
+
{getLayerLabel(obj)}