From 3e019e4e218134bd1eafd678e35cb503f5822d80 Mon Sep 17 00:00:00 2001 From: Felix Hungenberg <30648730+shiftgeist@users.noreply.github.com> Date: Thu, 22 Jan 2026 23:26:26 +0100 Subject: [PATCH] feat: don't move graph on right click drag --- .../lib/graph-interface/graph-state.svelte.ts | 22 +++-- .../lib/graph-interface/graph/Graph.svelte | 85 +++++++++---------- .../lib/graph-interface/graph/mouse.events.ts | 24 ++++-- app/src/lib/graph-interface/keymaps.ts | 4 +- 4 files changed, 74 insertions(+), 61 deletions(-) diff --git a/app/src/lib/graph-interface/graph-state.svelte.ts b/app/src/lib/graph-interface/graph-state.svelte.ts index c75d4f7..aaf1f7c 100644 --- a/app/src/lib/graph-interface/graph-state.svelte.ts +++ b/app/src/lib/graph-interface/graph-state.svelte.ts @@ -58,7 +58,9 @@ export class GraphState { wrapper = $state(null!); rect: DOMRect = $derived( - (this.wrapper && this.width && this.height) ? this.wrapper.getBoundingClientRect() : new DOMRect(0, 0, 0, 0) + (this.wrapper && this.width && this.height) + ? this.wrapper.getBoundingClientRect() + : new DOMRect(0, 0, 0, 0) ); camera = $state(null!); @@ -187,13 +189,13 @@ export class GraphState { } const height = 5 + 10 - * Object.keys(node.inputs).filter( - (p) => - p !== 'seed' - && node?.inputs - && !('setting' in node?.inputs?.[p]) - && node.inputs[p].hidden !== true - ).length; + * Object.keys(node.inputs).filter( + (p) => + p !== 'seed' + && node?.inputs + && !('setting' in node?.inputs?.[p]) + && node.inputs[p].hidden !== true + ).length; this.nodeHeightCache[nodeTypeId] = height; return height; } @@ -333,4 +335,8 @@ export class GraphState { && node.position[1] < this.cameraBounds[3] ); } + + openNodePalette() { + this.addMenuPosition = [this.mousePosition[0], this.mousePosition[1]]; + } } diff --git a/app/src/lib/graph-interface/graph/Graph.svelte b/app/src/lib/graph-interface/graph/Graph.svelte index 052af80..d0dbd5f 100644 --- a/app/src/lib/graph-interface/graph/Graph.svelte +++ b/app/src/lib/graph-interface/graph/Graph.svelte @@ -1,23 +1,23 @@ mouseEvents.handleMouseMove(ev)} - onmouseup={(ev) => mouseEvents.handleMouseUp(ev)} + onmousemove={(ev) => mouseEvents.handleWindowMouseMove(ev)} + onmouseup={(ev) => mouseEvents.handleWindowMouseUp(ev)} />
mouseEvents.handleMouseScroll(ev)} bind:this={graphState.wrapper} class="graph-wrapper" - style="height: 100%;" + style="height: 100%" class:is-panning={graphState.isPanning} class:is-hovering={graphState.hoveredNodeId !== -1} aria-label="Graph" @@ -115,6 +113,7 @@ bind:clientHeight={graphState.height} onkeydown={(ev) => keymap.handleKeyboardEvent(ev)} onmousedown={(ev) => mouseEvents.handleMouseDown(ev)} + oncontextmenu={(ev) => mouseEvents.handleContextMenu(ev)} {...fileDropEvents.getEventListenerProps()} > {/if} - {#if graph.status === "idle"} + {#if graph.status === 'idle'} {#if graphState.addMenuPosition} {/if} @@ -207,9 +204,9 @@ {/each}
- {:else if graph.status === "loading"} + {:else if graph.status === 'loading'} Loading - {:else if graph.status === "error"} + {:else if graph.status === 'error'} Error {/if} diff --git a/app/src/lib/graph-interface/graph/mouse.events.ts b/app/src/lib/graph-interface/graph/mouse.events.ts index c856a77..c70d36f 100644 --- a/app/src/lib/graph-interface/graph/mouse.events.ts +++ b/app/src/lib/graph-interface/graph/mouse.events.ts @@ -1,7 +1,7 @@ import { animate, lerp } from '$lib/helpers'; import { type NodeInstance } from '@nodarium/types'; import type { GraphManager } from '../graph-manager.svelte'; -import type { GraphState } from '../graph-state.svelte'; +import { type GraphState } from '../graph-state.svelte'; import { snapToGrid as snapPointToGrid } from '../helpers'; import { maxZoom, minZoom, zoomSpeed } from './constants'; import { EdgeInteractionManager } from './edge.events'; @@ -16,7 +16,7 @@ export class MouseEventManager { this.edgeInteractionManager = new EdgeInteractionManager(graph, state); } - handleMouseUp(event: MouseEvent) { + handleWindowMouseUp(event: MouseEvent) { this.edgeInteractionManager.handleMouseUp(); this.state.isPanning = false; if (!this.state.mouseDown) return; @@ -151,7 +151,19 @@ export class MouseEventManager { this.state.addMenuPosition = null; } + handleContextMenu(event: MouseEvent) { + if (!this.state.addMenuPosition) { + event.preventDefault(); + this.state.openNodePalette(); + } + } + handleMouseDown(event: MouseEvent) { + // Right click + if (event.button === 2) { + return; + } + if (this.state.mouseDown) return; this.state.edgeEndPosition = null; @@ -229,7 +241,7 @@ export class MouseEventManager { this.state.edgeEndPosition = null; } - handleMouseMove(event: MouseEvent) { + handleWindowMouseMove(event: MouseEvent) { let mx = event.clientX - this.state.rect.x; let my = event.clientY - this.state.rect.y; @@ -245,7 +257,7 @@ export class MouseEventManager { for (const socket of this.state.possibleSockets) { const dist = Math.sqrt( (socket.position[0] - this.state.mousePosition[0]) ** 2 - + (socket.position[1] - this.state.mousePosition[1]) ** 2 + + (socket.position[1] - this.state.mousePosition[1]) ** 2 ); if (dist < smallestDist) { smallestDist = dist; @@ -377,9 +389,9 @@ export class MouseEventManager { // Update camera position and zoom level this.state.cameraPosition[0] = this.state.mousePosition[0] - (this.state.mousePosition[0] - this.state.cameraPosition[0]) - / zoomRatio; + / zoomRatio; this.state.cameraPosition[1] = this.state.mousePosition[1] - (this.state.mousePosition[1] - this.state.cameraPosition[1]) - / zoomRatio, this.state.cameraPosition[2] = newZoom; + / zoomRatio, this.state.cameraPosition[2] = newZoom; } } diff --git a/app/src/lib/graph-interface/keymaps.ts b/app/src/lib/graph-interface/keymaps.ts index 9fd9b54..44d98f4 100644 --- a/app/src/lib/graph-interface/keymaps.ts +++ b/app/src/lib/graph-interface/keymaps.ts @@ -59,9 +59,7 @@ export function setupKeymaps(keymap: Keymap, graph: GraphManager, graphState: Gr key: 'A', shift: true, description: 'Add new Node', - callback: () => { - graphState.addMenuPosition = [graphState.mousePosition[0], graphState.mousePosition[1]]; - } + callback: () => graphState.openNodePalette() }); keymap.addShortcut({