Skip to content

Commit e609003

Browse files
authored
Change move to batch move only (#508)
* add notDragging constant * change move to only bulk move
1 parent 550cc78 commit e609003

File tree

4 files changed

+107
-178
lines changed

4 files changed

+107
-178
lines changed

src/components/EditorCanvas/Area.jsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@ export default function Area({
3737
const { settings } = useSettings();
3838
const { setSaveState } = useSaveState();
3939
const { updateArea } = useAreas();
40-
const { selectedElement, setSelectedElement, bulkSelectedElements } =
41-
useSelect();
40+
const {
41+
selectedElement,
42+
setSelectedElement,
43+
bulkSelectedElements,
44+
setBulkSelectedElements,
45+
} = useSelect();
4246

4347
const handleResize = (e, dir) => {
4448
setResize({ id: data.id, dir: dir });
@@ -53,6 +57,9 @@ export default function Area({
5357
};
5458

5559
const lockUnlockArea = () => {
60+
setBulkSelectedElements((prev) =>
61+
prev.filter((el) => el.id !== data.id || el.type !== ObjectType.AREA),
62+
);
5663
updateArea(data.id, { locked: !data.locked });
5764
};
5865

src/components/EditorCanvas/Canvas.jsx

Lines changed: 78 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,14 @@ export default function Canvas() {
5656
bulkSelectedElements,
5757
setBulkSelectedElements,
5858
} = useSelect();
59-
const [dragging, setDragging] = useState({
59+
const notDragging = {
6060
element: ObjectType.NONE,
6161
id: null,
6262
prevX: 0,
6363
prevY: 0,
6464
initialPositions: [],
65-
});
65+
};
66+
const [dragging, setDragging] = useState(notDragging);
6667
const [linking, setLinking] = useState(false);
6768
const [linkingLine, setLinkingLine] = useState({
6869
startTableId: -1,
@@ -181,7 +182,7 @@ export default function Canvas() {
181182
case ObjectType.NOTE:
182183
return notes[element.id];
183184
default:
184-
return { x: 0, y: 0 };
185+
return { x: 0, y: 0, locked: false };
185186
}
186187
};
187188

@@ -195,67 +196,45 @@ export default function Canvas() {
195196

196197
if (!e.isPrimary) return;
197198

198-
let locked = false;
199-
let prevCoords = { prevX: 0, prevY: 0 };
199+
const element = getElement({ id, type });
200200

201-
if (type === ObjectType.TABLE) {
202-
const table = tables.find((t) => t.id === id);
203-
locked = table.locked;
201+
setSelectedElement((prev) => ({
202+
...prev,
203+
element: type,
204+
id: id,
205+
open: false,
206+
}));
204207

205-
setGrabOffset({
206-
x: table.x - pointer.spaces.diagram.x,
207-
y: table.y - pointer.spaces.diagram.y,
208-
});
209-
prevCoords = { prevX: table.x, prevY: table.y };
210-
} else if (type === ObjectType.AREA) {
211-
const area = areas.find((t) => t.id === id);
212-
locked = area.locked;
213-
214-
setGrabOffset({
215-
x: area.x - pointer.spaces.diagram.x,
216-
y: area.y - pointer.spaces.diagram.y,
217-
});
218-
prevCoords = { prevX: area.x, prevY: area.y };
219-
} else if (type === ObjectType.NOTE) {
220-
const note = notes.find((t) => t.id === id);
221-
locked = note.locked;
222-
223-
setGrabOffset({
224-
x: note.x - pointer.spaces.diagram.x,
225-
y: note.y - pointer.spaces.diagram.y,
226-
});
227-
prevCoords = { prevX: note.x, prevY: note.y };
208+
if (element.locked) {
209+
setBulkSelectedElements([]);
210+
return;
228211
}
229212

230-
if (!locked) {
231-
setDragging((prev) => ({
232-
...prev,
233-
id,
234-
element: type,
235-
...prevCoords,
236-
}));
237-
setSelectedElement((prev) => ({
238-
...prev,
239-
element: type,
240-
id: id,
241-
open: false,
242-
}));
243-
}
213+
let prevCoords = { prevX: element.x, prevY: element.y };
214+
setGrabOffset({
215+
x: element.x - pointer.spaces.diagram.x,
216+
y: element.y - pointer.spaces.diagram.y,
217+
});
244218

245-
if (bulkSelectedElements.length) {
246-
setDragging((prev) => ({
247-
...prev,
248-
initialPositions: bulkSelectedElements.map((element) => ({
249-
...element,
250-
undo: {
251-
x: getElement(element).x,
252-
y: getElement(element).y,
253-
},
254-
})),
255-
}));
219+
let newBulkSelectedElements;
220+
if (bulkSelectedElements.some((el) => el.id === id && el.type === type)) {
221+
newBulkSelectedElements = bulkSelectedElements;
222+
} else {
223+
newBulkSelectedElements = [{ id, type }];
224+
setBulkSelectedElements(newBulkSelectedElements);
256225
}
257-
};
258226

227+
setDragging((prev) => ({
228+
...prev,
229+
id,
230+
element: type,
231+
...prevCoords,
232+
initialPositions: newBulkSelectedElements.map((el) => {
233+
const { x, y } = getElement(el);
234+
return { ...el, undo: { x, y } };
235+
}),
236+
}));
237+
};
259238
/**
260239
* @param {PointerEvent} e
261240
*/
@@ -302,39 +281,30 @@ export default function Canvas() {
302281
endX: pointer.spaces.diagram.x,
303282
endY: pointer.spaces.diagram.y,
304283
});
305-
} else if (
306-
dragging.element !== ObjectType.NONE &&
307-
dragging.id !== null &&
308-
bulkSelectedElements.length &&
309-
bulkSelectedElements.some(
310-
(element) =>
311-
element.id === dragging.id && element.type === dragging.element,
312-
)
313-
) {
314-
for (const element of bulkSelectedElements) {
315-
if (element.type === ObjectType.TABLE) {
316-
const table = tables.find((e) => e.id === element.id);
317-
if (table.locked) continue;
318-
const { x, y } = table;
319-
updateTable(element.id, {
284+
return;
285+
}
286+
287+
if (isDragging) {
288+
for (const el of bulkSelectedElements) {
289+
const element = getElement(el);
290+
const { type } = el;
291+
if (element.locked) continue;
292+
const { x, y } = element;
293+
294+
if (type === ObjectType.TABLE) {
295+
updateTable(el.id, {
320296
x: x + deltaX,
321297
y: y + deltaY,
322298
});
323299
}
324-
if (element.type === ObjectType.AREA) {
325-
const area = areas[element.id];
326-
if (area.locked) continue;
327-
const { x, y } = area;
328-
updateArea(element.id, {
300+
if (type === ObjectType.AREA) {
301+
updateArea(el.id, {
329302
x: x + deltaX,
330303
y: y + deltaY,
331304
});
332305
}
333-
if (element.type === ObjectType.NOTE) {
334-
const note = notes[element.id];
335-
if (note.locked) continue;
336-
const { x, y } = note;
337-
updateNote(element.id, {
306+
if (type === ObjectType.NOTE) {
307+
updateNote(el.id, {
338308
x: x + deltaX,
339309
y: y + deltaY,
340310
});
@@ -346,35 +316,10 @@ export default function Canvas() {
346316
prevX: finalX,
347317
prevY: finalY,
348318
}));
349-
} else if (dragging.element === ObjectType.TABLE && dragging.id !== null) {
350-
const table = tables.find((t) => t.id === dragging.id);
351-
if (table.locked) return;
352-
353-
updateTable(dragging.id, {
354-
x: finalX,
355-
y: finalY,
356-
});
357-
} else if (
358-
dragging.element === ObjectType.AREA &&
359-
dragging.id !== null &&
360-
areaResize.id === -1
361-
) {
362-
const area = areas.find((t) => t.id === dragging.id);
363-
if (area.locked) return;
364-
365-
updateArea(dragging.id, {
366-
x: finalX,
367-
y: finalY,
368-
});
369-
} else if (dragging.element === ObjectType.NOTE && dragging.id !== null) {
370-
const note = notes.find((t) => t.id === dragging.id);
371-
if (note.locked) return;
319+
return;
320+
}
372321

373-
updateNote(dragging.id, {
374-
x: finalX,
375-
y: finalY,
376-
});
377-
} else if (areaResize.id !== -1) {
322+
if (areaResize.id !== -1) {
378323
if (areaResize.dir === "none") return;
379324
let newDims = { ...initCoords };
380325
delete newDims.pointerX;
@@ -405,7 +350,10 @@ export default function Canvas() {
405350
}
406351

407352
updateArea(areaResize.id, { ...newDims });
408-
} else if (bulkSelectRectPts.show) {
353+
return;
354+
}
355+
356+
if (bulkSelectRectPts.show) {
409357
setBulkSelectRectPts((prev) => ({
410358
...prev,
411359
x2: finalX,
@@ -452,7 +400,8 @@ export default function Canvas() {
452400
}
453401
};
454402

455-
const coordsDidUpdate = (element) => {
403+
const coordsDidUpdate = () => {
404+
const element = { id: dragging.id, type: dragging.element };
456405
const elementData = getElement(element);
457406
const updated = !(
458407
dragging.prevX === elementData.x && dragging.prevY === elementData.y
@@ -489,60 +438,24 @@ export default function Canvas() {
489438

490439
if (!e.isPrimary) return;
491440

492-
let bulkMoved = false;
441+
const coordinatesDidUpdate = coordsDidUpdate();
493442

494-
if (coordsDidUpdate({ id: dragging.id, type: dragging.element })) {
495-
if (bulkSelectedElements.length) {
496-
setUndoStack((prev) => [
497-
...prev,
498-
{
499-
action: Action.MOVE,
500-
bulk: true,
501-
message: t("bulk_update"),
502-
elements: dragging.initialPositions.map((element) => ({
503-
...element,
504-
redo: {
505-
x: getElement(element).x,
506-
y: getElement(element).y,
507-
},
508-
})),
509-
},
510-
]);
511-
bulkMoved = true;
512-
} else {
513-
const element = getElement({
514-
id: dragging.id,
515-
type: dragging.element,
516-
});
517-
setUndoStack((prev) => [
518-
...prev,
519-
{
520-
action: Action.MOVE,
521-
element: dragging.element,
522-
x: dragging.prevX,
523-
y: dragging.prevY,
524-
toX: element.x,
525-
toY: element.y,
526-
id: dragging.id,
527-
message: t("move_element", {
528-
coords: `(${element.x}, ${element.y})`,
529-
name: getElement({
530-
id: dragging.id,
531-
type: dragging.element,
532-
}).name,
533-
}),
534-
},
535-
]);
536-
}
443+
if (coordinatesDidUpdate) {
444+
setUndoStack((prev) => [
445+
...prev,
446+
{
447+
action: Action.MOVE,
448+
bulk: true,
449+
message: t("bulk_update"),
450+
elements: dragging.initialPositions.map((element) => {
451+
const { x, y } = getElement(element);
452+
return { ...element, redo: { x, y } };
453+
}),
454+
},
455+
]);
537456
setRedoStack([]);
538457
}
539-
setDragging({
540-
element: ObjectType.NONE,
541-
id: null,
542-
prevX: 0,
543-
prevY: 0,
544-
initialPositions: [],
545-
});
458+
setDragging(notDragging);
546459

547460
if (bulkSelectRectPts.show) {
548461
setBulkSelectRectPts((prev) => ({
@@ -551,7 +464,7 @@ export default function Canvas() {
551464
y2: pointer.spaces.diagram.y,
552465
show: false,
553466
}));
554-
if (!bulkMoved) {
467+
if (!coordinatesDidUpdate) {
555468
collectSelectedElements();
556469
}
557470
}
@@ -601,13 +514,7 @@ export default function Canvas() {
601514

602515
const handleGripField = () => {
603516
setPanning((old) => ({ ...old, isPanning: false }));
604-
setDragging({
605-
element: ObjectType.NONE,
606-
id: null,
607-
prevX: 0,
608-
prevY: 0,
609-
initialPositions: [],
610-
});
517+
setDragging(notDragging);
611518
setLinking(true);
612519
};
613520

src/components/EditorCanvas/Note.jsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ export default function Note({ data, onPointerDown }) {
2626
const { setSaveState } = useSaveState();
2727
const { updateNote, deleteNote } = useNotes();
2828
const { setUndoStack, setRedoStack } = useUndoRedo();
29-
const { selectedElement, setSelectedElement, bulkSelectedElements } =
30-
useSelect();
29+
const {
30+
selectedElement,
31+
setSelectedElement,
32+
bulkSelectedElements,
33+
setBulkSelectedElements,
34+
} = useSelect();
3135
const initialColorRef = useRef(data.color);
3236

3337
const handleColorPick = (color) => {
@@ -97,6 +101,9 @@ export default function Note({ data, onPointerDown }) {
97101
};
98102

99103
const lockUnlockNote = () => {
104+
setBulkSelectedElements((prev) =>
105+
prev.filter((el) => el.id !== data.id || el.type !== ObjectType.NOTE),
106+
);
100107
updateNote(data.id, { locked: !data.locked });
101108
};
102109

0 commit comments

Comments
 (0)