lock resize in group with a object mask
This commit is contained in:
@@ -655,11 +655,39 @@ const EditorCanvas = () => {
|
|||||||
const isGroup = selectedObject?.type === "group";
|
const isGroup = selectedObject?.type === "group";
|
||||||
|
|
||||||
// بررسی امکان group/ungroup با mask
|
// بررسی امکان group/ungroup با mask
|
||||||
const hasMask = selectedObject?.maskId;
|
let isGroupedWithMask = false;
|
||||||
const maskObject = hasMask ? objects.find(m => m.id === selectedObject.maskId) : null;
|
let hasMask = false;
|
||||||
const isGrouped = selectedObject?.groupId && maskObject?.groupId === selectedObject.groupId;
|
let maskObject = null;
|
||||||
const canGroup = hasMask && !isGrouped && maskObject && !selectedObject?.isMask;
|
|
||||||
const canUngroup = isGrouped && selectedObject?.groupId;
|
if (isGroup) {
|
||||||
|
// اگر این یک group است، بررسی کن که آیا از یک object با mask تشکیل شده
|
||||||
|
const groupMembers = objects.filter(o => o.groupId === selectedObject.id);
|
||||||
|
const objectWithMask = groupMembers.find(m => m.maskId);
|
||||||
|
if (objectWithMask) {
|
||||||
|
maskObject = groupMembers.find(m => m.id === objectWithMask.maskId);
|
||||||
|
isGroupedWithMask = !!maskObject;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// اگر یک object معمولی است
|
||||||
|
hasMask = !!selectedObject?.maskId;
|
||||||
|
maskObject = hasMask ? objects.find(m => m.id === selectedObject.maskId) : null;
|
||||||
|
isGroupedWithMask = selectedObject?.groupId && maskObject?.groupId === selectedObject.groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
const canGroup = hasMask && !isGroupedWithMask && maskObject && !selectedObject?.isMask;
|
||||||
|
const canUngroup = isGroupedWithMask && isGroup;
|
||||||
|
|
||||||
|
// اگر با mask گروه شده، امکان ریسایز نباشد
|
||||||
|
const enabledAnchors = isGroupedWithMask ? [] : [
|
||||||
|
"top-left",
|
||||||
|
"top-right",
|
||||||
|
"bottom-left",
|
||||||
|
"bottom-right",
|
||||||
|
"top-center",
|
||||||
|
"bottom-center",
|
||||||
|
"middle-left",
|
||||||
|
"middle-right",
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -669,6 +697,10 @@ const EditorCanvas = () => {
|
|||||||
if (Math.abs(newBox.width) < 5 || Math.abs(newBox.height) < 5) {
|
if (Math.abs(newBox.width) < 5 || Math.abs(newBox.height) < 5) {
|
||||||
return oldBox;
|
return oldBox;
|
||||||
}
|
}
|
||||||
|
// اگر با mask گروه شده، هیچ تغییر سایزی مجاز نیست
|
||||||
|
if (isGroupedWithMask) {
|
||||||
|
return oldBox;
|
||||||
|
}
|
||||||
return newBox;
|
return newBox;
|
||||||
}}
|
}}
|
||||||
ignoreStroke={isText}
|
ignoreStroke={isText}
|
||||||
@@ -678,17 +710,8 @@ const EditorCanvas = () => {
|
|||||||
borderStroke="#3b82f6"
|
borderStroke="#3b82f6"
|
||||||
borderStrokeWidth={2}
|
borderStrokeWidth={2}
|
||||||
anchorSize={8}
|
anchorSize={8}
|
||||||
rotateEnabled={!isGroup}
|
rotateEnabled={!isGroup && !isGroupedWithMask}
|
||||||
enabledAnchors={[
|
enabledAnchors={enabledAnchors}
|
||||||
"top-left",
|
|
||||||
"top-right",
|
|
||||||
"bottom-left",
|
|
||||||
"bottom-right",
|
|
||||||
"top-center",
|
|
||||||
"bottom-center",
|
|
||||||
"middle-left",
|
|
||||||
"middle-right",
|
|
||||||
]}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* دکمه گروهبندی */}
|
{/* دکمه گروهبندی */}
|
||||||
@@ -739,8 +762,8 @@ const EditorCanvas = () => {
|
|||||||
shadowColor="black"
|
shadowColor="black"
|
||||||
shadowBlur={10}
|
shadowBlur={10}
|
||||||
shadowOpacity={0.2}
|
shadowOpacity={0.2}
|
||||||
onClick={() => handleUngroupFromMask(selectedObject.groupId!)}
|
onClick={() => handleUngroupFromMask(selectedObject.id)}
|
||||||
onTap={() => handleUngroupFromMask(selectedObject.groupId!)}
|
onTap={() => handleUngroupFromMask(selectedObject.id)}
|
||||||
listening={true}
|
listening={true}
|
||||||
/>
|
/>
|
||||||
<Text
|
<Text
|
||||||
@@ -754,8 +777,8 @@ const EditorCanvas = () => {
|
|||||||
fill="white"
|
fill="white"
|
||||||
align="center"
|
align="center"
|
||||||
verticalAlign="middle"
|
verticalAlign="middle"
|
||||||
onClick={() => handleUngroupFromMask(selectedObject.groupId!)}
|
onClick={() => handleUngroupFromMask(selectedObject.id)}
|
||||||
onTap={() => handleUngroupFromMask(selectedObject.groupId!)}
|
onTap={() => handleUngroupFromMask(selectedObject.id)}
|
||||||
listening={true}
|
listening={true}
|
||||||
/>
|
/>
|
||||||
</Group>
|
</Group>
|
||||||
|
|||||||
@@ -319,8 +319,12 @@ const ObjectRenderer = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// بررسی آیا object با mask گروه شده است
|
||||||
|
const isGroupedWithMask = obj.groupId && maskShape && maskShape.groupId === obj.groupId;
|
||||||
|
|
||||||
const handleGroupTransformEnd = () => {
|
const handleGroupTransformEnd = () => {
|
||||||
if (!groupRef.current || !maskShape) return;
|
if (!groupRef.current || !maskShape) return;
|
||||||
|
|
||||||
const node = groupRef.current;
|
const node = groupRef.current;
|
||||||
const scaleX = node.scaleX();
|
const scaleX = node.scaleX();
|
||||||
const scaleY = node.scaleY();
|
const scaleY = node.scaleY();
|
||||||
@@ -398,25 +402,6 @@ const ObjectRenderer = ({
|
|||||||
width: newWidth,
|
width: newWidth,
|
||||||
height: newHeight,
|
height: newHeight,
|
||||||
});
|
});
|
||||||
|
|
||||||
// اگر mask و object در یک گروه هستند، mask را هم scale کن
|
|
||||||
if (obj.groupId && maskShape.groupId === obj.groupId) {
|
|
||||||
// محاسبه موقعیت جدید mask
|
|
||||||
// موقعیت نسبی را scale میکنم و به موقعیت جدید object اضافه میکنم
|
|
||||||
// این باعث میشود که موقعیت نسبی mask نسبت به object حفظ شود
|
|
||||||
const newMaskX = finalX + (relativeX * scaleX);
|
|
||||||
const newMaskY = finalY + (relativeY * scaleY);
|
|
||||||
const newMaskWidth = (maskShape.width || 100) * scaleX;
|
|
||||||
const newMaskHeight = (maskShape.height || 100) * scaleY;
|
|
||||||
|
|
||||||
// بهروزرسانی mask
|
|
||||||
onUpdate(maskShape.id, {
|
|
||||||
x: newMaskX,
|
|
||||||
y: newMaskY,
|
|
||||||
width: newMaskWidth,
|
|
||||||
height: newMaskHeight,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -434,7 +419,7 @@ const ObjectRenderer = ({
|
|||||||
}}
|
}}
|
||||||
onDragEnd={handleGroupDragEnd}
|
onDragEnd={handleGroupDragEnd}
|
||||||
onDragMove={handleGroupDragMove}
|
onDragMove={handleGroupDragMove}
|
||||||
onTransformEnd={handleGroupTransformEnd}
|
{...(!isGroupedWithMask && { onTransformEnd: handleGroupTransformEnd })}
|
||||||
>
|
>
|
||||||
{shapeElement}
|
{shapeElement}
|
||||||
<Group globalCompositeOperation={compositeOp} listening={false}>
|
<Group globalCompositeOperation={compositeOp} listening={false}>
|
||||||
|
|||||||
Reference in New Issue
Block a user