|
@@ -46,6 +46,7 @@ export const bindOrUnbindLinearElement = (
|
|
|
bindOrUnbindLinearElementEdge(
|
|
|
linearElement,
|
|
|
startBindingElement,
|
|
|
+ endBindingElement,
|
|
|
"start",
|
|
|
boundToElementIds,
|
|
|
unboundFromElementIds,
|
|
@@ -53,6 +54,7 @@ export const bindOrUnbindLinearElement = (
|
|
|
bindOrUnbindLinearElementEdge(
|
|
|
linearElement,
|
|
|
endBindingElement,
|
|
|
+ startBindingElement,
|
|
|
"end",
|
|
|
boundToElementIds,
|
|
|
unboundFromElementIds,
|
|
@@ -75,6 +77,7 @@ export const bindOrUnbindLinearElement = (
|
|
|
const bindOrUnbindLinearElementEdge = (
|
|
|
linearElement: NonDeleted<ExcalidrawLinearElement>,
|
|
|
bindableElement: ExcalidrawBindableElement | null | "keep",
|
|
|
+ otherEdgeBindableElement: ExcalidrawBindableElement | null | "keep",
|
|
|
startOrEnd: "start" | "end",
|
|
|
// Is mutated
|
|
|
boundToElementIds: Set<ExcalidrawBindableElement["id"]>,
|
|
@@ -83,8 +86,22 @@ const bindOrUnbindLinearElementEdge = (
|
|
|
): void => {
|
|
|
if (bindableElement !== "keep") {
|
|
|
if (bindableElement != null) {
|
|
|
- bindLinearElement(linearElement, bindableElement, startOrEnd);
|
|
|
- boundToElementIds.add(bindableElement.id);
|
|
|
+ // Don't bind if we're trying to bind or are already bound to the same
|
|
|
+ // element on the other edge already ("start" edge takes precedence).
|
|
|
+ if (
|
|
|
+ otherEdgeBindableElement == null ||
|
|
|
+ (otherEdgeBindableElement === "keep"
|
|
|
+ ? !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(
|
|
|
+ linearElement,
|
|
|
+ bindableElement,
|
|
|
+ startOrEnd,
|
|
|
+ )
|
|
|
+ : startOrEnd === "start" ||
|
|
|
+ otherEdgeBindableElement.id !== bindableElement.id)
|
|
|
+ ) {
|
|
|
+ bindLinearElement(linearElement, bindableElement, startOrEnd);
|
|
|
+ boundToElementIds.add(bindableElement.id);
|
|
|
+ }
|
|
|
} else {
|
|
|
const unbound = unbindLinearElement(linearElement, startOrEnd);
|
|
|
if (unbound != null) {
|
|
@@ -110,7 +127,7 @@ export const bindOrUnbindSelectedElements = (
|
|
|
});
|
|
|
};
|
|
|
|
|
|
-export const maybeBindBindableElement = (
|
|
|
+const maybeBindBindableElement = (
|
|
|
bindableElement: NonDeleted<ExcalidrawBindableElement>,
|
|
|
): void => {
|
|
|
getElligibleElementsForBindableElementAndWhere(
|
|
@@ -134,7 +151,14 @@ export const maybeBindLinearElement = (
|
|
|
bindLinearElement(linearElement, appState.startBoundElement, "start");
|
|
|
}
|
|
|
const hoveredElement = getHoveredElementForBinding(pointerCoords, scene);
|
|
|
- if (hoveredElement != null) {
|
|
|
+ if (
|
|
|
+ hoveredElement != null &&
|
|
|
+ !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(
|
|
|
+ linearElement,
|
|
|
+ hoveredElement,
|
|
|
+ "end",
|
|
|
+ )
|
|
|
+ ) {
|
|
|
bindLinearElement(linearElement, hoveredElement, "end");
|
|
|
}
|
|
|
};
|
|
@@ -144,15 +168,6 @@ const bindLinearElement = (
|
|
|
hoveredElement: ExcalidrawBindableElement,
|
|
|
startOrEnd: "start" | "end",
|
|
|
): void => {
|
|
|
- if (
|
|
|
- isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(
|
|
|
- linearElement,
|
|
|
- hoveredElement,
|
|
|
- startOrEnd,
|
|
|
- )
|
|
|
- ) {
|
|
|
- return;
|
|
|
- }
|
|
|
mutateElement(linearElement, {
|
|
|
[startOrEnd === "start" ? "startBinding" : "endBinding"]: {
|
|
|
elementId: hoveredElement.id,
|
|
@@ -442,40 +457,10 @@ const getElligibleElementForBindingElement = (
|
|
|
linearElement: NonDeleted<ExcalidrawLinearElement>,
|
|
|
startOrEnd: "start" | "end",
|
|
|
): NonDeleted<ExcalidrawBindableElement> | null => {
|
|
|
- return getElligibleElementForBindingElementAtCoors(
|
|
|
- linearElement,
|
|
|
- startOrEnd,
|
|
|
+ return getHoveredElementForBinding(
|
|
|
getLinearElementEdgeCoors(linearElement, startOrEnd),
|
|
|
- );
|
|
|
-};
|
|
|
-
|
|
|
-export const getElligibleElementForBindingElementAtCoors = (
|
|
|
- linearElement: NonDeleted<ExcalidrawLinearElement>,
|
|
|
- startOrEnd: "start" | "end",
|
|
|
- pointerCoords: {
|
|
|
- x: number;
|
|
|
- y: number;
|
|
|
- },
|
|
|
-): NonDeleted<ExcalidrawBindableElement> | null => {
|
|
|
- const bindableElement = getHoveredElementForBinding(
|
|
|
- pointerCoords,
|
|
|
Scene.getScene(linearElement)!,
|
|
|
);
|
|
|
- if (bindableElement == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- // Note: We could push this check inside a version of
|
|
|
- // `getHoveredElementForBinding`, but it's unlikely this is needed.
|
|
|
- if (
|
|
|
- isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(
|
|
|
- linearElement,
|
|
|
- bindableElement,
|
|
|
- startOrEnd,
|
|
|
- )
|
|
|
- ) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- return bindableElement;
|
|
|
};
|
|
|
|
|
|
const getLinearElementEdgeCoors = (
|