diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx index c9e4d0e..735bda7 100644 --- a/src/components/EditorCanvas/Canvas.jsx +++ b/src/components/EditorCanvas/Canvas.jsx @@ -5,8 +5,6 @@ import { Constraint, darkBgTheme, ObjectType, - tableFieldHeight, - tableHeaderHeight, gridSize, gridCircleRadius, } from "../../data/constants"; @@ -29,7 +27,7 @@ import { } from "../../hooks"; import { useTranslation } from "react-i18next"; import { useEventListener } from "usehooks-ts"; -import { areFieldsCompatible } from "../../utils/utils"; +import { areFieldsCompatible, getTableHeight } from "../../utils/utils"; import { getRectFromEndpoints, isInsideRect } from "../../utils/rect"; import { noteWidth, State } from "../../data/constants"; @@ -117,8 +115,7 @@ export default function Canvas() { x: table.x, y: table.y, width: settings.tableWidth, - height: - table.fields.length * tableFieldHeight + tableHeaderHeight + 7, + height: getTableHeight(table), }, rect, ) @@ -230,14 +227,7 @@ export default function Canvas() { prevCoords = { prevX: note.x, prevY: note.y }; } - if (locked) { - setPanning({ - isPanning: true, - panStart: transform.pan, - cursorStart: pointer.spaces.screen, - }); - pointer.setStyle("grabbing"); - } else { + if (!locked) { setDragging((prev) => ({ ...prev, id, @@ -274,6 +264,21 @@ export default function Canvas() { if (!e.isPrimary) return; + if (panning.isPanning) { + setTransform((prev) => ({ + ...prev, + pan: { + x: + panning.panStart.x + + (panning.cursorStart.x - pointer.spaces.screen.x) / transform.zoom, + y: + panning.panStart.y + + (panning.cursorStart.y - pointer.spaces.screen.y) / transform.zoom, + }, + })); + return; + } + const isDragging = dragging.element !== ObjectType.NONE && dragging.id !== null; @@ -300,26 +305,38 @@ export default function Canvas() { } else if ( dragging.element !== ObjectType.NONE && dragging.id !== null && - bulkSelectedElements.length + bulkSelectedElements.length && + bulkSelectedElements.some( + (element) => + element.id === dragging.id && element.type === dragging.element, + ) ) { for (const element of bulkSelectedElements) { if (element.type === ObjectType.TABLE) { - const { x, y } = tables.find((e) => e.id === element.id); + const table = tables.find((e) => e.id === element.id); + if (table.locked) continue; + const { x, y } = table; updateTable(element.id, { x: x + deltaX, y: y + deltaY, }); } if (element.type === ObjectType.AREA) { + const area = areas[element.id]; + if (area.locked) continue; + const { x, y } = area; updateArea(element.id, { - x: areas[element.id].x + deltaX, - y: areas[element.id].y + deltaY, + x: x + deltaX, + y: y + deltaY, }); } if (element.type === ObjectType.NOTE) { + const note = notes[element.id]; + if (note.locked) continue; + const { x, y } = note; updateNote(element.id, { - x: notes[element.id].x + deltaX, - y: notes[element.id].y + deltaY, + x: x + deltaX, + y: y + deltaY, }); } } @@ -329,25 +346,6 @@ export default function Canvas() { prevX: finalX, prevY: finalY, })); - } else if ( - panning.isPanning && - dragging.element === ObjectType.NONE && - areaResize.id === -1 - ) { - if (!settings.panning) { - return; - } - setTransform((prev) => ({ - ...prev, - pan: { - x: - panning.panStart.x + - (panning.cursorStart.x - pointer.spaces.screen.x) / transform.zoom, - y: - panning.panStart.y + - (panning.cursorStart.y - pointer.spaces.screen.y) / transform.zoom, - }, - })); } else if (dragging.element === ObjectType.TABLE && dragging.id !== null) { const table = tables.find((t) => t.id === dragging.id); if (table.locked) return; @@ -430,7 +428,10 @@ export default function Canvas() { ) return; - if (!settings.panning) { + const isMouseLeftButton = e.button === 0; + const isMouseMiddleButton = e.button === 1; + + if (isMouseLeftButton) { setBulkSelectRectPts({ x1: pointer.spaces.diagram.x, y1: pointer.spaces.diagram.y, @@ -439,7 +440,7 @@ export default function Canvas() { show: true, }); pointer.setStyle("crosshair"); - } else { + } else if (isMouseMiddleButton) { setPanning({ isPanning: true, panStart: transform.pan, @@ -488,6 +489,8 @@ export default function Canvas() { if (!e.isPrimary) return; + let bulkMoved = false; + if (coordsDidUpdate({ id: dragging.id, type: dragging.element })) { if (bulkSelectedElements.length) { setUndoStack((prev) => [ @@ -505,12 +508,7 @@ export default function Canvas() { })), }, ]); - setSelectedElement((prev) => ({ - ...prev, - element: ObjectType.NONE, - id: -1, - open: false, - })); + bulkMoved = true; } else { const element = getElement({ id: dragging.id, @@ -553,18 +551,13 @@ export default function Canvas() { y2: pointer.spaces.diagram.y, show: false, })); - collectSelectedElements(); + if (!bulkMoved) { + collectSelectedElements(); + } } if (panning.isPanning && didPan()) { setSaveState(State.SAVING); - setSelectedElement((prev) => ({ - ...prev, - element: ObjectType.NONE, - id: -1, - open: false, - })); - setBulkSelectedElements([]); } setPanning((old) => ({ ...old, isPanning: false })); pointer.setStyle("default"); diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index 657b86b..0bea7ed 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -1396,15 +1396,6 @@ export default function ControlPanel({ function: () => setSettings((prev) => ({ ...prev, autosave: !prev.autosave })), }, - panning: { - state: settings.panning ? ( - - ) : ( - - ), - function: () => - setSettings((prev) => ({ ...prev, panning: !prev.panning })), - }, table_width: { function: () => setModal(MODAL.TABLE_WIDTH), }, @@ -1603,23 +1594,6 @@ export default function ControlPanel({ - - -