diff --git a/packages/element/src/binding.ts b/packages/element/src/binding.ts index bf36ba09ee..4fc4cc66e6 100644 --- a/packages/element/src/binding.ts +++ b/packages/element/src/binding.ts @@ -149,7 +149,8 @@ export const bindOrUnbindBindingElement = ( scene: Scene, appState: AppState, opts?: { - newArrow: boolean; + newArrow?: boolean; + altKey?: boolean; }, ) => { const { start, end } = getBindingStrategyForDraggingBindingElementEndpoints( @@ -554,6 +555,7 @@ export const getBindingStrategyForDraggingBindingElementEndpoints = ( opts?: { newArrow?: boolean; shiftKey?: boolean; + altKey?: boolean; finalize?: boolean; }, ): { start: BindingStrategy; end: BindingStrategy } => { @@ -587,6 +589,7 @@ const getBindingStrategyForDraggingBindingElementEndpoints_simple = ( opts?: { newArrow?: boolean; shiftKey?: boolean; + altKey?: boolean; finalize?: boolean; }, ): { start: BindingStrategy; end: BindingStrategy } => { @@ -687,14 +690,15 @@ const getBindingStrategyForDraggingBindingElementEndpoints_simple = ( : { mode: "orbit", element: hit, - focusPoint: - projectFixedPointOntoDiagonal( - arrow, - globalPoint, - hit, - startDragged ? "start" : "end", - elementsMap, - ) || globalPoint, + focusPoint: opts?.altKey + ? globalPoint + : projectFixedPointOntoDiagonal( + arrow, + globalPoint, + hit, + startDragged ? "start" : "end", + elementsMap, + ) || globalPoint, } : { mode: null }; const otherBindableElement = otherBinding @@ -707,7 +711,9 @@ const getBindingStrategyForDraggingBindingElementEndpoints_simple = ( startDragged ? -1 : 0, elementsMap, ); + const other: BindingStrategy = + !opts?.altKey && opts?.newArrow && otherBindableElement && !isPointInElement(otherPoint, otherBindableElement, elementsMap) diff --git a/packages/element/src/linearElementEditor.ts b/packages/element/src/linearElementEditor.ts index 7f42cbcad6..0fabe6c194 100644 --- a/packages/element/src/linearElementEditor.ts +++ b/packages/element/src/linearElementEditor.ts @@ -356,6 +356,7 @@ export class LinearElementEditor { elements, app, event.shiftKey, + event.altKey, ); LinearElementEditor.movePoints(element, app.scene, positions, { @@ -520,6 +521,7 @@ export class LinearElementEditor { elements, app, event.shiftKey, + event.altKey, ); LinearElementEditor.movePoints(element, app.scene, positions, { @@ -2058,6 +2060,7 @@ const pointDraggingUpdates = ( elements: readonly Ordered[], app: AppClassProperties, shiftKey: boolean, + altKey: boolean, ): { positions: PointsPositionUpdates; updates?: PointMoveOtherUpdates; @@ -2104,6 +2107,7 @@ const pointDraggingUpdates = ( { newArrow: !!app.state.newElement, shiftKey, + altKey, }, ); diff --git a/packages/excalidraw/actions/actionFinalize.tsx b/packages/excalidraw/actions/actionFinalize.tsx index 8dd45b9698..97d4f5655a 100644 --- a/packages/excalidraw/actions/actionFinalize.tsx +++ b/packages/excalidraw/actions/actionFinalize.tsx @@ -104,6 +104,7 @@ export const actionFinalize = register({ bindOrUnbindBindingElement(element, draggedPoints, scene, appState, { newArrow, + altKey: event.altKey, }); } else if (isLineElement(element)) { if ( diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 964959d54b..4dbb3b151f 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -8616,7 +8616,7 @@ class App extends React.Component { ]), this.scene, this.state, - { newArrow: true }, + { newArrow: true, altKey: event.altKey }, ); }