From 02286465079be6c6af646f41317fbc5178c8dc4d Mon Sep 17 00:00:00 2001 From: David Luzar Date: Sat, 5 Nov 2022 11:35:53 +0100 Subject: [PATCH] fix: line editor points rendering below elements (#5781) * fix: line editor points rendering below elements * add test --- src/renderer/renderScene.ts | 20 ++++++---- src/tests/linearElementEditor.test.tsx | 51 ++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/renderer/renderScene.ts b/src/renderer/renderScene.ts index 8aebcdcb..7c089ed5 100644 --- a/src/renderer/renderScene.ts +++ b/src/renderer/renderScene.ts @@ -406,6 +406,8 @@ export const _renderScene = ({ }), ); + let editingLinearElement: NonDeleted | undefined = + undefined; visibleElements.forEach((element) => { try { renderElement(element, rc, context, renderConfig); @@ -414,15 +416,10 @@ export const _renderScene = ({ // correct element from visible elements if (appState.editingLinearElement?.elementId === element.id) { if (element) { - renderLinearPointHandles( - context, - appState, - renderConfig, - element as NonDeleted, - ); + editingLinearElement = + element as NonDeleted; } } - if (!isExporting) { renderLinkIcon(element, context, appState); } @@ -431,6 +428,15 @@ export const _renderScene = ({ } }); + if (editingLinearElement) { + renderLinearPointHandles( + context, + appState, + renderConfig, + editingLinearElement, + ); + } + // Paint selection element if (appState.selectionElement) { try { diff --git a/src/tests/linearElementEditor.test.tsx b/src/tests/linearElementEditor.test.tsx index 122bd135..56993b72 100644 --- a/src/tests/linearElementEditor.test.tsx +++ b/src/tests/linearElementEditor.test.tsx @@ -16,7 +16,7 @@ const renderScene = jest.spyOn(Renderer, "renderScene"); const { h } = window; -describe(" Test Linear Elements", () => { +describe("Test Linear Elements", () => { let container: HTMLElement; let canvas: HTMLCanvasElement; @@ -89,8 +89,15 @@ describe(" Test Linear Elements", () => { mouse.clickAt(p1[0], p1[1]); }; - const enterLineEditingMode = (line: ExcalidrawLinearElement) => { - mouse.clickAt(p1[0], p1[1]); + const enterLineEditingMode = ( + line: ExcalidrawLinearElement, + selectProgrammatically = false, + ) => { + if (selectProgrammatically) { + API.setSelectedElements([line]); + } else { + mouse.clickAt(p1[0], p1[1]); + } Keyboard.keyPress(KEYS.ENTER); expect(h.state.editingLinearElement?.elementId).toEqual(line.id); }; @@ -604,5 +611,43 @@ describe(" Test Linear Elements", () => { `); }); }); + + it("in-editor dragging a line point covered by another element", () => { + createTwoPointerLinearElement("line"); + const line = h.elements[0] as ExcalidrawLinearElement; + h.elements = [ + line, + API.createElement({ + type: "rectangle", + x: line.x - 50, + y: line.y - 50, + width: 100, + height: 100, + backgroundColor: "red", + fillStyle: "solid", + }), + ]; + + const origPoints = line.points.map((point) => [...point]); + const dragEndPositionOffset = [100, 100] as const; + API.setSelectedElements([line]); + enterLineEditingMode(line, true); + drag( + [line.points[0][0] + line.x, line.points[0][1] + line.y], + [dragEndPositionOffset[0] + line.x, dragEndPositionOffset[1] + line.y], + ); + expect(line.points).toMatchInlineSnapshot(` + Array [ + Array [ + 0, + 0, + ], + Array [ + ${origPoints[1][0] - dragEndPositionOffset[0]}, + ${origPoints[1][1] - dragEndPositionOffset[1]}, + ], + ] + `); + }); }); });