From 6deb4fdbe66eb7c1713ebafac029a2193085f099 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Fri, 16 May 2025 17:01:31 +0200 Subject: [PATCH] Fix the highlight part of the issue --- packages/element/src/binding.ts | 12 +++-- packages/element/src/linearElementEditor.ts | 51 ++++++++++++--------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/packages/element/src/binding.ts b/packages/element/src/binding.ts index 07b7559a3..bf6767edb 100644 --- a/packages/element/src/binding.ts +++ b/packages/element/src/binding.ts @@ -416,7 +416,7 @@ export const maybeSuggestBindingsForLinearElementAtCoords = ( } const suggestedBindings = pointerCoords.reduce( - (acc: NonDeleted[], coords) => { + (acc: Set>, coords) => { const hoveredBindableElement = getHoveredElementForBinding( coords, scene.getNonDeletedElements(), @@ -425,6 +425,7 @@ export const maybeSuggestBindingsForLinearElementAtCoords = ( isElbowArrow(linearElement), isElbowArrow(linearElement), ); + if ( hoveredBindableElement != null && !isLinearElementSimpleAndAlreadyBound( @@ -433,14 +434,15 @@ export const maybeSuggestBindingsForLinearElementAtCoords = ( hoveredBindableElement, ) ) { - acc.push(hoveredBindableElement); + acc.add(hoveredBindableElement); } + return acc; }, - [], + new Set() as Set>, ); - return suggestedBindings; + return Array.from(suggestedBindings); }; export const maybeBindLinearElement = ( @@ -580,7 +582,7 @@ export const isLinearElementSimpleAndAlreadyBound = ( const isLinearElementSimple = ( linearElement: NonDeleted, -): boolean => linearElement.points.length < 3; +): boolean => linearElement.points.length < 3 && !isElbowArrow(linearElement); const unbindLinearElement = ( linearElement: NonDeleted, diff --git a/packages/element/src/linearElementEditor.ts b/packages/element/src/linearElementEditor.ts index f5a2ccde9..b6dcdcef9 100644 --- a/packages/element/src/linearElementEditor.ts +++ b/packages/element/src/linearElementEditor.ts @@ -371,33 +371,40 @@ export class LinearElementEditor { // suggest bindings for first and last point if selected let suggestedBindings: ExcalidrawBindableElement[] = []; if (isBindingElement(element, false)) { + const firstSelectedIndex = selectedPointsIndices[0] === 0; + const lastSelectedIndex = + selectedPointsIndices[selectedPointsIndices.length - 1] === + element.points.length - 1; const coords: { x: number; y: number }[] = []; - const firstSelectedIndex = selectedPointsIndices[0]; - if (firstSelectedIndex === 0) { - coords.push( - tupleToCoors( - LinearElementEditor.getPointGlobalCoordinates( - element, - element.points[0], - elementsMap, + if (!firstSelectedIndex !== !lastSelectedIndex) { + coords.push({ x: scenePointerX, y: scenePointerY }); + } else { + if (firstSelectedIndex) { + coords.push( + tupleToCoors( + LinearElementEditor.getPointGlobalCoordinates( + element, + element.points[0], + elementsMap, + ), ), - ), - ); - } + ); + } - const lastSelectedIndex = - selectedPointsIndices[selectedPointsIndices.length - 1]; - if (lastSelectedIndex === element.points.length - 1) { - coords.push( - tupleToCoors( - LinearElementEditor.getPointGlobalCoordinates( - element, - element.points[lastSelectedIndex], - elementsMap, + if (lastSelectedIndex) { + coords.push( + tupleToCoors( + LinearElementEditor.getPointGlobalCoordinates( + element, + element.points[ + selectedPointsIndices[selectedPointsIndices.length - 1] + ], + elementsMap, + ), ), - ), - ); + ); + } } if (coords.length) {