migrate pane

This commit is contained in:
peterkogo
2024-11-13 15:36:09 +01:00
parent 2c2b456036
commit 52a4b310d4
3 changed files with 42 additions and 35 deletions
@@ -26,7 +26,6 @@
</script> </script>
<script lang="ts"> <script lang="ts">
import { createEventDispatcher } from 'svelte';
import { import {
SelectionMode, SelectionMode,
getEventPosition, getEventPosition,
@@ -37,24 +36,18 @@
import { useStore } from '$lib/store'; import { useStore } from '$lib/store';
import type { Node, Edge, InternalNode } from '$lib/types'; import type { Node, Edge, InternalNode } from '$lib/types';
import type { PaneProps } from './types'; import type { PaneProps } from './types';
let {
type $$Props = PaneProps; panOnDrag,
selectionOnDrag,
export let panOnDrag: $$Props['panOnDrag'] = undefined; onpaneclick,
export let selectionOnDrag: $$Props['selectionOnDrag'] = undefined; onpanecontextmenu,
const dispatch = createEventDispatcher<{
paneclick: {
event: MouseEvent | TouchEvent;
};
panecontextmenu: {
event: MouseEvent;
};
}>();
const {
nodes, nodes,
nodeLookup,
edges, edges,
children
}: PaneProps = $props();
const {
nodeLookup,
viewport, viewport,
dragging, dragging,
elementsSelectable, elementsSelectable,
@@ -70,10 +63,13 @@
let containerBounds: DOMRect | null = null; let containerBounds: DOMRect | null = null;
let selectedNodes: InternalNode[] = []; let selectedNodes: InternalNode[] = [];
$: _panOnDrag = $panActivationKeyPressed || panOnDrag; let panOnDragActive = $derived($panActivationKeyPressed || panOnDrag);
$: isSelecting = let isSelecting = $derived(
$selectionKeyPressed || $selectionRect || (selectionOnDrag && _panOnDrag !== true); $selectionKeyPressed || $selectionRect || (selectionOnDrag && panOnDragActive !== true)
$: hasActiveSelection = $elementsSelectable && (isSelecting || $selectionRectMode === 'user'); );
let hasActiveSelection = $derived(
$elementsSelectable && (isSelecting || $selectionRectMode === 'user')
);
// Used to prevent click events when the user lets go of the selectionKey during a selection // Used to prevent click events when the user lets go of the selectionKey during a selection
let selectionInProgress = false; let selectionInProgress = false;
@@ -85,7 +81,7 @@
return; return;
} }
dispatch('paneclick', { event }); onpaneclick?.({ event });
unselectNodesAndEdges(); unselectNodesAndEdges();
selectionRectMode.set(null); selectionRectMode.set(null);
} }
@@ -198,30 +194,30 @@
} }
const onContextMenu = (event: MouseEvent) => { const onContextMenu = (event: MouseEvent) => {
if (Array.isArray(_panOnDrag) && _panOnDrag?.includes(2)) { if (Array.isArray(panOnDragActive) && panOnDragActive.includes(2)) {
event.preventDefault(); event.preventDefault();
return; return;
} }
dispatch('panecontextmenu', { event }); onpanecontextmenu?.({ event });
}; };
</script> </script>
<!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y_no_static_element_interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y_click_events_have_key_events -->
<div <div
bind:this={container} bind:this={container}
class="svelte-flow__pane" class="svelte-flow__pane"
class:draggable={panOnDrag === true || (Array.isArray(panOnDrag) && panOnDrag.includes(0))} class:draggable={panOnDrag === true || (Array.isArray(panOnDrag) && panOnDrag.includes(0))}
class:dragging={$dragging} class:dragging={$dragging}
class:selection={isSelecting} class:selection={isSelecting}
on:click={hasActiveSelection ? undefined : wrapHandler(onClick, container)} onclick={hasActiveSelection ? undefined : wrapHandler(onClick, container)}
on:pointerdown={hasActiveSelection ? onPointerDown : undefined} onpointerdown={hasActiveSelection ? onPointerDown : undefined}
on:pointermove={hasActiveSelection ? onPointerMove : undefined} onpointermove={hasActiveSelection ? onPointerMove : undefined}
on:pointerup={hasActiveSelection ? onPointerUp : undefined} onpointerup={hasActiveSelection ? onPointerUp : undefined}
on:contextmenu={wrapHandler(onContextMenu, container)} oncontextmenu={wrapHandler(onContextMenu, container)}
> >
<slot /> {@render children()}
</div> </div>
<style> <style>
@@ -1,4 +1,11 @@
import type { Snippet } from 'svelte';
import type { Writable } from 'svelte/store';
import type { Edge, Node, PaneEvents } from '$lib/types';
export type PaneProps = { export type PaneProps = {
panOnDrag?: boolean | number[]; panOnDrag?: boolean | number[];
selectionOnDrag?: boolean; selectionOnDrag?: boolean;
}; nodes: Writable<Node[]>;
edges: Writable<Edge[]>;
children: Snippet;
} & PaneEvents;
@@ -100,6 +100,8 @@
onedgecontextmenu, onedgecontextmenu,
onedgemouseenter, onedgemouseenter,
onedgemouseleave, onedgemouseleave,
onpaneclick,
onpanecontextmenu,
...rest ...rest
}: SvelteFlowProps = $props(); }: SvelteFlowProps = $props();
@@ -250,8 +252,10 @@
paneClickDistance={paneClickDistance === undefined ? 0 : paneClickDistance} paneClickDistance={paneClickDistance === undefined ? 0 : paneClickDistance}
> >
<Pane <Pane
on:paneclick {nodes}
on:panecontextmenu {edges}
{onpaneclick}
{onpanecontextmenu}
panOnDrag={panOnDrag === undefined ? true : panOnDrag} panOnDrag={panOnDrag === undefined ? true : panOnDrag}
{selectionOnDrag} {selectionOnDrag}
> >