From 58d8f10e409e66e24e187044f396415f549f4417 Mon Sep 17 00:00:00 2001 From: filtered <176114999+webfiltered@users.noreply.github.com> Date: Tue, 22 Apr 2025 02:10:27 +1000 Subject: [PATCH] [API] Add disconnect links method to LinkConnector (#956) Provides a simple API for consumers to drag & drop links into a bin / void, in order to disconnect them. --- src/canvas/LinkConnector.ts | 23 ++++++++++++----------- src/canvas/MovingInputLink.ts | 4 ++++ src/canvas/MovingLinkBase.ts | 2 ++ src/canvas/MovingOutputLink.ts | 4 ++++ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/canvas/LinkConnector.ts b/src/canvas/LinkConnector.ts index a885f4acf..f7f86f7ac 100644 --- a/src/canvas/LinkConnector.ts +++ b/src/canvas/LinkConnector.ts @@ -440,17 +440,18 @@ export class LinkConnector { const mayContinue = this.events.dispatch("dropped-on-canvas", event) if (mayContinue === false) return - if (this.state.connectingTo === "input") { - for (const link of this.renderLinks) { - if (link instanceof MovingInputLink) { - link.inputNode.disconnectInput(link.inputIndex, true) - } - } - } else if (this.state.connectingTo === "output") { - for (const link of this.renderLinks) { - if (link instanceof MovingOutputLink) { - link.outputNode.disconnectOutput(link.outputIndex, link.inputNode) - } + this.disconnectLinks() + } + + /** + * Disconnects all moving links. + * @remarks This is called when the links are dropped on the canvas. + * May be called by consumers to e.g. drag links into a bin / void. + */ + disconnectLinks(): void { + for (const link of this.renderLinks) { + if (link instanceof MovingLinkBase) { + link.disconnect() } } } diff --git a/src/canvas/MovingInputLink.ts b/src/canvas/MovingInputLink.ts index 38da438fb..02cf4229b 100644 --- a/src/canvas/MovingInputLink.ts +++ b/src/canvas/MovingInputLink.ts @@ -76,4 +76,8 @@ export class MovingInputLink extends MovingLinkBase { connectToRerouteOutput(): never { throw new Error("MovingInputLink cannot connect to an output.") } + + disconnect(): boolean { + return this.inputNode.disconnectInput(this.inputIndex, true) + } } diff --git a/src/canvas/MovingLinkBase.ts b/src/canvas/MovingLinkBase.ts index 5f25541cd..9e79c6e31 100644 --- a/src/canvas/MovingLinkBase.ts +++ b/src/canvas/MovingLinkBase.ts @@ -83,4 +83,6 @@ export abstract class MovingLinkBase implements RenderLink { abstract connectToOutput(node: LGraphNode, output: INodeOutputSlot, events?: LinkConnectorEventTarget): void abstract connectToRerouteInput(reroute: Reroute, { node, input, link }: { node: LGraphNode, input: INodeInputSlot, link: LLink }, events: LinkConnectorEventTarget, originalReroutes: Reroute[]): void abstract connectToRerouteOutput(reroute: Reroute, outputNode: LGraphNode, output: INodeOutputSlot, events: LinkConnectorEventTarget): void + + abstract disconnect(): boolean } diff --git a/src/canvas/MovingOutputLink.ts b/src/canvas/MovingOutputLink.ts index 289fc7ffe..a10fee79d 100644 --- a/src/canvas/MovingOutputLink.ts +++ b/src/canvas/MovingOutputLink.ts @@ -82,4 +82,8 @@ export class MovingOutputLink extends MovingLinkBase { events.dispatch("output-moved", this) } + + disconnect(): boolean { + return this.outputNode.disconnectOutput(this.outputIndex, this.inputNode) + } }