migrate pane
This commit is contained in:
@@ -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}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user