This commit is contained in:
hamid zarghami
2025-11-19 08:57:42 +03:30
parent 3f18ac62fa
commit 3b47e29ba4
3 changed files with 29 additions and 12 deletions
@@ -1,6 +1,6 @@
import { useState, useRef, useEffect } from "react"; import { useState, useRef, useEffect } from "react";
import Konva from "konva"; import Konva from "konva";
import { useEditorStore, type EditorObject } from "../../store/editorStore"; import { useEditorStore, type EditorObject } from "@/pages/editor/store/editorStore";
import { createDrawingObject } from "./drawingUtils"; import { createDrawingObject } from "./drawingUtils";
export const useDrawingHandlers = () => { export const useDrawingHandlers = () => {
@@ -9,31 +9,46 @@ export const useDrawingHandlers = () => {
const [tempObject, setTempObject] = useState<EditorObject | null>(null); const [tempObject, setTempObject] = useState<EditorObject | null>(null);
const transformerRef = useRef<Konva.Transformer>(null); const transformerRef = useRef<Konva.Transformer>(null);
const { tool, addObject, updateObject, setSelectedObjectId } = useEditorStore(); const { tool, addObject, updateObject, setSelectedObjectId, selectedObjectId } = useEditorStore();
useEffect(() => { useEffect(() => {
setTempObject(null); setTempObject(null);
setIsDrawing(false); setIsDrawing(false);
}, [tool]); }, [tool]);
const clearSelection = () => {
setSelectedObjectId(null);
if (transformerRef.current) {
transformerRef.current.nodes([]);
transformerRef.current.getLayer()?.batchDraw();
}
};
const handleStageMouseDown = (e: Konva.KonvaEventObject<MouseEvent>) => { const handleStageMouseDown = (e: Konva.KonvaEventObject<MouseEvent>) => {
const stage = e.target.getStage(); const stage = e.target.getStage();
if (!stage) return; if (!stage) return;
const pointerPos = stage.getPointerPosition(); const clickedOnEmpty = e.target === stage;
if (!pointerPos) return;
if (clickedOnEmpty && selectedObjectId) {
clearSelection();
return;
}
if (tool === "select") { if (tool === "select") {
const clickedOnEmpty = e.target === stage;
if (clickedOnEmpty) { if (clickedOnEmpty) {
setSelectedObjectId(null); clearSelection();
if (transformerRef.current) {
transformerRef.current.nodes([]);
}
} }
return; return;
} }
if (selectedObjectId) {
return;
}
const pointerPos = stage.getPointerPosition();
if (!pointerPos) return;
setIsDrawing(true); setIsDrawing(true);
setStartPos(pointerPos); setStartPos(pointerPos);
@@ -31,7 +31,7 @@ const RectangleInstruction: FC = () => {
onClick={() => setActiveShape(shape.id)} onClick={() => setActiveShape(shape.id)}
className={clx( className={clx(
"size-[60px] flex flex-col gap-1 justify-center items-center rounded-xl text-[13px] transition-colors", "size-[60px] flex flex-col gap-1 justify-center items-center rounded-xl text-[13px] transition-colors",
isActive ? "border-black text-black" : "border-transparent hover:border-black/20", isActive ? "" : "border-transparent",
)} )}
aria-pressed={isActive} aria-pressed={isActive}
> >
@@ -13,7 +13,9 @@ const AbstractShape = ({ obj, isSelected, transformerRef, onSelect, onUpdate, dr
} }
}, [isSelected, transformerRef]); }, [isSelected, transformerRef]);
const radius = Math.min((obj.width || 100) / 2, (obj.height || 100) / 2); const baseRadius = Math.min((obj.width || 100) / 2, (obj.height || 100) / 2);
const abstractScale = 0.85;
const radius = baseRadius * abstractScale;
const innerRadius = radius * 0.5; const innerRadius = radius * 0.5;
return ( return (
@@ -51,7 +53,7 @@ const AbstractShape = ({ obj, isSelected, transformerRef, onSelect, onUpdate, dr
node.scaleX(1); node.scaleX(1);
node.scaleY(1); node.scaleY(1);
const newRadius = Math.max(5, radius * Math.min(scaleX, scaleY)); const newRadius = Math.max(5, baseRadius * Math.min(scaleX, scaleY));
const newSize = newRadius * 2; const newSize = newRadius * 2;
onUpdate(obj.id, { onUpdate(obj.id, {
x: node.x() - newSize / 2, x: node.x() - newSize / 2,