diff --git a/src/pages/editor/components/canvas/ObjectRenderer.tsx b/src/pages/editor/components/canvas/ObjectRenderer.tsx index b96cef5..3694c0f 100644 --- a/src/pages/editor/components/canvas/ObjectRenderer.tsx +++ b/src/pages/editor/components/canvas/ObjectRenderer.tsx @@ -74,7 +74,7 @@ const ObjectRenderer = ({ if (rafId1) cancelAnimationFrame(rafId1); groupNode?.clearCache(); }; - }, [shouldApplyMask, isSelected, maskShape?.x, maskShape?.y, maskShape?.width, maskShape?.height, maskShape?.rotation, obj.x, obj.y, obj.width, obj.height, obj.rotation, obj.maskInvert]); + }, [shouldApplyMask, isSelected, maskShape?.x, maskShape?.y, maskShape?.width, maskShape?.height, maskShape?.rotation, obj.x, obj.y, obj.width, obj.height, obj.rotation, obj.maskInvert, obj.strokeWidth, obj.stroke, obj.fill]); // Refresh cache after transformer is attached (when isSelected changes) useEffect(() => { diff --git a/src/pages/editor/components/sidebar/settings/ShapeSettings.tsx b/src/pages/editor/components/sidebar/settings/ShapeSettings.tsx index a1780ef..ef11d1a 100644 --- a/src/pages/editor/components/sidebar/settings/ShapeSettings.tsx +++ b/src/pages/editor/components/sidebar/settings/ShapeSettings.tsx @@ -1,5 +1,3 @@ -import { useEffect, useState } from "react"; -import Button from "@/components/Button"; import Input from "@/components/Input"; import ColorPicker from "@/components/ColorPicker"; import type { EditorObject } from "@/pages/editor/store/editorStore"; @@ -9,14 +7,6 @@ type ShapeSettingsProps = { onUpdate: (id: string, updates: Partial) => void; }; -type ShapeFormState = { - width: string; - height: string; - fill: string; - stroke: string; - strokeWidth: string; -}; - const ShapeSettings = ({ selectedObject, onUpdate }: ShapeSettingsProps) => { const baseWidth = selectedObject.width ?? 100; const baseHeight = selectedObject.height ?? 100; @@ -24,105 +14,57 @@ const ShapeSettings = ({ selectedObject, onUpdate }: ShapeSettingsProps) => { const baseStroke = selectedObject.stroke ?? "#1e40af"; const baseStrokeWidth = selectedObject.strokeWidth ?? 0; - const [formState, setFormState] = useState({ - width: String(baseWidth), - height: String(baseHeight), - fill: baseFill, - stroke: baseStroke, - strokeWidth: String(baseStrokeWidth), - }); - - useEffect(() => { - setFormState({ - width: String(baseWidth), - height: String(baseHeight), - fill: baseFill, - stroke: baseStroke, - strokeWidth: String(baseStrokeWidth), - }); - }, [baseWidth, baseHeight, baseFill, baseStroke, baseStrokeWidth]); - - const parseNumber = (value: string, fallback: number) => { - const parsed = parseInt(value, 10); - return Number.isNaN(parsed) ? fallback : parsed; - }; - - const handleSave = () => { - onUpdate(selectedObject.id, { - width: parseNumber(formState.width, baseWidth), - height: parseNumber(formState.height, baseHeight), - fill: formState.fill || baseFill, - stroke: formState.stroke || baseStroke, - strokeWidth: parseNumber(formState.strokeWidth, baseStrokeWidth), - }); - }; - - const isDirty = - formState.width !== String(baseWidth) || - formState.height !== String(baseHeight) || - formState.fill !== baseFill || - formState.stroke !== baseStroke || - formState.strokeWidth !== String(baseStrokeWidth); - return (
- setFormState((prev) => ({ - ...prev, - width: e.target.value, - })) + onUpdate(selectedObject.id, { + width: parseInt(e.target.value) || baseWidth, + }) } /> - setFormState((prev) => ({ - ...prev, - height: e.target.value, - })) + onUpdate(selectedObject.id, { + height: parseInt(e.target.value) || baseHeight, + }) } /> - setFormState((prev) => ({ - ...prev, + onUpdate(selectedObject.id, { fill: value, - })) + }) } /> - setFormState((prev) => ({ - ...prev, + onUpdate(selectedObject.id, { stroke: value, - })) + }) } /> - setFormState((prev) => ({ - ...prev, - strokeWidth: e.target.value, - })) + onUpdate(selectedObject.id, { + strokeWidth: parseInt(e.target.value) || 0, + }) } min={0} /> -
); }; diff --git a/src/pages/editor/components/tools/AbstractShape.tsx b/src/pages/editor/components/tools/AbstractShape.tsx index 81d7b8d..39cc841 100644 --- a/src/pages/editor/components/tools/AbstractShape.tsx +++ b/src/pages/editor/components/tools/AbstractShape.tsx @@ -14,6 +14,22 @@ const AbstractShape = ({ obj, isSelected, onSelect, onUpdate, draggable }: Shape const abstractScale = 0.85; const radius = baseRadius * abstractScale; const innerRadius = radius * 0.5; + + const actualStrokeWidth = obj.strokeWidth ?? 0; + const hasStroke = actualStrokeWidth > 0; + + // برای نمایش انتخاب: اگر strokeWidth واقعی > 0 است، از آن استفاده کن، وگرنه stroke را برای انتخاب نمایش بده + const displayStroke = isSelected + ? (hasStroke ? obj.stroke : "#3b82f6") + : (isMask && showGuide) + ? "#ff6b6b" + : (isMask && !showGuide) + ? "transparent" + : (hasStroke ? obj.stroke : undefined); + + const displayStrokeWidth = isSelected + ? (hasStroke ? actualStrokeWidth : 3) + : (isMask && showGuide ? 2 : actualStrokeWidth); return ( 0; + + // برای نمایش انتخاب: اگر strokeWidth واقعی > 0 است، از آن استفاده کن، وگرنه stroke را برای انتخاب نمایش بده + const displayStroke = isSelected + ? (hasStroke ? obj.stroke : "#3b82f6") + : (isMask && showGuide) + ? "#ff6b6b" + : (isMask && !showGuide) + ? "transparent" + : (hasStroke ? obj.stroke : undefined); + + const displayStrokeWidth = isSelected + ? (hasStroke ? actualStrokeWidth : 3) + : (isMask && showGuide ? 2 : actualStrokeWidth); return ( 0; + + // برای نمایش انتخاب: اگر strokeWidth واقعی > 0 است، از آن استفاده کن، وگرنه stroke را برای انتخاب نمایش بده + const displayStroke = isSelected + ? (hasStroke ? obj.stroke : "#3b82f6") + : (isMask && showGuide) + ? "#ff6b6b" + : (isMask && !showGuide) + ? "transparent" + : (hasStroke ? obj.stroke : undefined); + + const displayStrokeWidth = isSelected + ? (hasStroke ? actualStrokeWidth : 3) + : (isMask && showGuide ? 2 : actualStrokeWidth); + return ( 0; + + // برای نمایش انتخاب: اگر strokeWidth واقعی > 0 است، از آن استفاده کن، وگرنه stroke را برای انتخاب نمایش بده + const displayStroke = isSelected + ? (hasStroke ? obj.stroke : "#3b82f6") + : (isMask && showGuide) + ? "#ff6b6b" + : (isMask && !showGuide) + ? "transparent" + : (hasStroke ? obj.stroke : undefined); + + const displayStrokeWidth = isSelected + ? (hasStroke ? actualStrokeWidth : 3) + : (isMask && showGuide ? 2 : actualStrokeWidth); return (