Arrow dragging gets a little drag to avoid accidental unbinding

This commit is contained in:
Mark Tolmacs
2025-06-24 20:55:05 +02:00
parent 70d4dd9152
commit b0ac15381b

View File

@ -107,8 +107,21 @@ export const dragSelectedElements = (
); );
elementsToUpdate.forEach((element) => { elementsToUpdate.forEach((element) => {
updateElementCoords(pointerDownState, element, scene, adjustedOffset); const isArrow = !isArrowElement(element);
const isStartBoundElementSelected =
isArrow ||
(element.startBinding
? elementsToUpdateIds.has(element.startBinding.elementId)
: false);
const isEndBoundElementSelected =
isArrow ||
(element.endBinding
? elementsToUpdateIds.has(element.endBinding.elementId)
: false);
if (!isArrowElement(element)) { if (!isArrowElement(element)) {
updateElementCoords(pointerDownState, element, scene, adjustedOffset);
// skip arrow labels since we calculate its position during render // skip arrow labels since we calculate its position during render
const textElement = getBoundTextElement( const textElement = getBoundTextElement(
element, element,
@ -126,13 +139,12 @@ export const dragSelectedElements = (
updateBoundElements(element, scene, { updateBoundElements(element, scene, {
simultaneouslyUpdated: Array.from(elementsToUpdate), simultaneouslyUpdated: Array.from(elementsToUpdate),
}); });
} else { } else if (
const isStartBoundElementSelected = element.startBinding // NOTE: Add a little initial drag to the arrow dragging to avoid
? elementsToUpdateIds.has(element.startBinding.elementId) // accidentally unbinding the arrow when the user just wants to select it.
: false; Math.max(Math.abs(adjustedOffset.x), Math.abs(adjustedOffset.y)) > 1
const isEndBoundElementSelected = element.endBinding ) {
? elementsToUpdateIds.has(element.endBinding.elementId) updateElementCoords(pointerDownState, element, scene, adjustedOffset);
: false;
const shouldUnbindStart = const shouldUnbindStart =
element.startBinding && !isStartBoundElementSelected; element.startBinding && !isStartBoundElementSelected;