다중 선택 후 함께 이동하는 기능을 구현
This commit is contained in:
parent
352f9f441f
commit
a299195b42
|
|
@ -309,15 +309,20 @@ export function CanvasComponent({ component }: CanvasComponentProps) {
|
|||
// Ctrl/Cmd 키 감지 (다중 선택)
|
||||
const isMultiSelect = e.ctrlKey || e.metaKey;
|
||||
|
||||
// 그룹화된 컴포넌트 클릭 시: 같은 그룹의 모든 컴포넌트 선택
|
||||
if (isGrouped && !isMultiSelect) {
|
||||
const groupMembers = components.filter((c) => c.groupId === component.groupId);
|
||||
const groupMemberIds = groupMembers.map((c) => c.id);
|
||||
// 첫 번째 컴포넌트를 선택하고, 나머지를 다중 선택에 추가
|
||||
selectComponent(groupMemberIds[0], false);
|
||||
groupMemberIds.slice(1).forEach((id) => selectComponent(id, true));
|
||||
} else {
|
||||
selectComponent(component.id, isMultiSelect);
|
||||
// 이미 다중 선택의 일부인 경우: 선택 상태 유지 (드래그만 시작)
|
||||
const isPartOfMultiSelection = selectedComponentIds.length > 1 && selectedComponentIds.includes(component.id);
|
||||
|
||||
if (!isPartOfMultiSelection) {
|
||||
// 그룹화된 컴포넌트 클릭 시: 같은 그룹의 모든 컴포넌트 선택
|
||||
if (isGrouped && !isMultiSelect) {
|
||||
const groupMembers = components.filter((c) => c.groupId === component.groupId);
|
||||
const groupMemberIds = groupMembers.map((c) => c.id);
|
||||
// 첫 번째 컴포넌트를 선택하고, 나머지를 다중 선택에 추가
|
||||
selectComponent(groupMemberIds[0], false);
|
||||
groupMemberIds.slice(1).forEach((id) => selectComponent(id, true));
|
||||
} else {
|
||||
selectComponent(component.id, isMultiSelect);
|
||||
}
|
||||
}
|
||||
|
||||
setIsDragging(true);
|
||||
|
|
@ -389,8 +394,27 @@ export function CanvasComponent({ component }: CanvasComponentProps) {
|
|||
y: snappedY,
|
||||
});
|
||||
|
||||
// 다중 선택된 경우: 선택된 다른 컴포넌트들도 함께 이동
|
||||
if (selectedComponentIds.length > 1 && selectedComponentIds.includes(component.id)) {
|
||||
components.forEach((c) => {
|
||||
// 현재 컴포넌트는 이미 이동됨, 잠긴 컴포넌트는 제외
|
||||
if (c.id !== component.id && selectedComponentIds.includes(c.id) && !c.locked) {
|
||||
const newMultiX = c.x + deltaX;
|
||||
const newMultiY = c.y + deltaY;
|
||||
|
||||
// 경계 체크
|
||||
const multiMaxX = canvasWidthPx - marginRightPx - c.width;
|
||||
const multiMaxY = canvasHeightPx - marginBottomPx - c.height;
|
||||
|
||||
updateComponent(c.id, {
|
||||
x: Math.min(Math.max(marginLeftPx, newMultiX), multiMaxX),
|
||||
y: Math.min(Math.max(marginTopPx, newMultiY), multiMaxY),
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
// 그룹화된 경우: 같은 그룹의 다른 컴포넌트도 함께 이동
|
||||
if (isGrouped) {
|
||||
else if (isGrouped) {
|
||||
components.forEach((c) => {
|
||||
if (c.groupId === component.groupId && c.id !== component.id) {
|
||||
const newGroupX = c.x + deltaX;
|
||||
|
|
|
|||
Loading…
Reference in New Issue