feat(svelte) add fitViewOptions, closes #3440

This commit is contained in:
Peter
2023-09-25 12:58:04 +02:00
parent 339df4c651
commit ada5b94673
9 changed files with 71 additions and 44 deletions
@@ -199,7 +199,7 @@ const OverviewFlow = () => {
onConnect={onConnect} onConnect={onConnect}
onPaneClick={onPaneClick} onPaneClick={onPaneClick}
onPaneScroll={onPaneScroll} onPaneScroll={onPaneScroll}
onPaneContextMenu={onPaneContextMenu} // onPaneContextMenu={onPaneContextMenu}
onNodeDragStart={onNodeDragStart} onNodeDragStart={onNodeDragStart}
onNodeDrag={onNodeDrag} onNodeDrag={onNodeDrag}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
@@ -221,7 +221,7 @@ const OverviewFlow = () => {
onEdgeMouseLeave={onEdgeMouseLeave} onEdgeMouseLeave={onEdgeMouseLeave}
onEdgeDoubleClick={onEdgeDoubleClick} onEdgeDoubleClick={onEdgeDoubleClick}
fitView fitView
fitViewOptions={{ padding: 0.2 }} fitViewOptions={{ padding: 0.1, nodes: [{ id: '1' }] }}
attributionPosition="top-right" attributionPosition="top-right"
maxZoom={Infinity} maxZoom={Infinity}
onNodesDelete={onNodesDelete} onNodesDelete={onNodesDelete}
@@ -130,8 +130,16 @@
{nodeTypes} {nodeTypes}
{edgeTypes} {edgeTypes}
fitView fitView
minZoom={0.1} fitViewOptions={{
maxZoom={2.5} padding: 10,
nodes: [
{
id: '1'
}
]
}}
minZoom={0}
maxZoom={Infinity}
selectionMode={SelectionMode.Full} selectionMode={SelectionMode.Full}
initialViewport={{ x: 100, y: 100, zoom: 2 }} initialViewport={{ x: 100, y: 100, zoom: 2 }}
snapGrid={[25, 25]} snapGrid={[25, 25]}
+8 -9
View File
@@ -80,13 +80,13 @@ const createRFStore = () =>
const nextNodes = updateAbsolutePositions(updatedNodes, nodeOrigin); const nextNodes = updateAbsolutePositions(updatedNodes, nodeOrigin);
const nextFitViewDone = let nextFitViewDone = fitViewDone;
fitViewDone || if (!fitViewDone && fitViewOnInit) {
(fitViewOnInit && nextFitViewDone = fitView({
fitView({ ...fitViewOnInitOptions,
...fitViewOnInitOptions, nodes: fitViewOnInitOptions?.nodes || nextNodes,
nodes: nextNodes, });
})); }
set({ nodes: nextNodes, fitViewDone: nextFitViewDone }); set({ nodes: nextNodes, fitViewDone: nextFitViewDone });
@@ -243,7 +243,6 @@ const createRFStore = () =>
}, },
fitView: (options?: FitViewOptions): boolean => { fitView: (options?: FitViewOptions): boolean => {
const { panZoom, nodes, width, height, minZoom, maxZoom, nodeOrigin } = get(); const { panZoom, nodes, width, height, minZoom, maxZoom, nodeOrigin } = get();
const fitViewNodes = options?.nodes || nodes;
if (!panZoom) { if (!panZoom) {
return false; return false;
@@ -251,7 +250,7 @@ const createRFStore = () =>
return fitViewSystem( return fitViewSystem(
{ {
nodes: fitViewNodes as Node[], nodes,
width, width,
height, height,
panZoom, panZoom,
@@ -23,6 +23,7 @@
export let nodes: $$Props['nodes']; export let nodes: $$Props['nodes'];
export let edges: $$Props['edges']; export let edges: $$Props['edges'];
export let fitView: $$Props['fitView'] = undefined; export let fitView: $$Props['fitView'] = undefined;
export let fitViewOptions: $$Props['fitViewOptions'] = undefined;
export let minZoom: $$Props['minZoom'] = undefined; export let minZoom: $$Props['minZoom'] = undefined;
export let maxZoom: $$Props['maxZoom'] = undefined; export let maxZoom: $$Props['maxZoom'] = undefined;
export let initialViewport: Viewport = { x: 0, y: 0, zoom: 1 }; export let initialViewport: Viewport = { x: 0, y: 0, zoom: 1 };
@@ -79,6 +80,10 @@
store.fitViewOnInit.set(fitView); store.fitViewOnInit.set(fitView);
} }
if (fitViewOptions) {
store.fitViewOptions.set(fitViewOptions);
}
updateStore(store, { updateStore(store, {
nodeTypes, nodeTypes,
edgeTypes, edgeTypes,
@@ -23,7 +23,8 @@ import type {
NodeTypes, NodeTypes,
KeyDefinition, KeyDefinition,
EdgeTypes, EdgeTypes,
DefaultEdgeOptions DefaultEdgeOptions,
FitViewOptions
} from '$lib/types'; } from '$lib/types';
import type { Writable } from 'svelte/store'; import type { Writable } from 'svelte/store';
@@ -37,6 +38,7 @@ export type SvelteFlowProps = DOMAttributes<HTMLDivElement> & {
panActivationKey?: KeyDefinition; panActivationKey?: KeyDefinition;
deleteKey?: KeyDefinition; deleteKey?: KeyDefinition;
fitView?: boolean; fitView?: boolean;
fitViewOptions?: FitViewOptions;
nodeOrigin?: NodeOrigin; nodeOrigin?: NodeOrigin;
minZoom?: number; minZoom?: number;
maxZoom?: number; maxZoom?: number;
+29 -25
View File
@@ -90,13 +90,39 @@ export function createStore(): SvelteFlowStore {
return; return;
} }
const fitViewOnInitDone = if (!get(store.fitViewOnInitDone) && get(store.fitViewOnInit)) {
get(store.fitViewOnInitDone) || (get(store.fitViewOnInit) && fitView({ nodes: nextNodes })); const fitViewOptions = get(store.fitViewOptions);
const fitViewOnInitDone = fitView(nextNodes, {
...fitViewOptions,
nodes: fitViewOptions?.nodes || nextNodes
});
store.fitViewOnInitDone.set(fitViewOnInitDone);
}
store.fitViewOnInitDone.set(fitViewOnInitDone);
store.nodes.set(nextNodes); store.nodes.set(nextNodes);
} }
function fitView(nodes: Node[], options?: FitViewOptions) {
const panZoom = get(store.panZoom);
if (!panZoom) {
return false;
}
return fitViewUtil(
{
nodes,
width: get(store.width),
height: get(store.height),
minZoom: get(store.minZoom),
maxZoom: get(store.maxZoom),
panZoom,
nodeOrigin: get(store.nodeOrigin)
},
options
);
}
function zoomBy(factor: number, options?: ViewportHelperFunctionOptions) { function zoomBy(factor: number, options?: ViewportHelperFunctionOptions) {
const panZoom = get(store.panZoom); const panZoom = get(store.panZoom);
@@ -140,28 +166,6 @@ export function createStore(): SvelteFlowStore {
} }
} }
function fitView(options?: FitViewOptions) {
const panZoom = get(store.panZoom);
const fitViewNodes = options?.nodes || get(store.nodes);
if (!panZoom) {
return false;
}
return fitViewUtil(
{
nodes: fitViewNodes as Node[],
width: get(store.width),
height: get(store.height),
minZoom: get(store.minZoom),
maxZoom: get(store.maxZoom),
panZoom,
nodeOrigin: get(store.nodeOrigin)
},
{}
);
}
function resetSelectedItem<T extends Node | Edge>(item: T) { function resetSelectedItem<T extends Node | Edge>(item: T) {
if (item.selected) { if (item.selected) {
return { return {
@@ -24,7 +24,14 @@ import BezierEdge from '$lib/components/edges/BezierEdge.svelte';
import StraightEdge from '$lib/components/edges/StraightEdge.svelte'; import StraightEdge from '$lib/components/edges/StraightEdge.svelte';
import SmoothStepEdge from '$lib/components/edges/SmoothStepEdge.svelte'; import SmoothStepEdge from '$lib/components/edges/SmoothStepEdge.svelte';
import StepEdge from '$lib/components/edges/StepEdge.svelte'; import StepEdge from '$lib/components/edges/StepEdge.svelte';
import type { ConnectionData, NodeTypes, EdgeTypes, EdgeLayouted, Node } from '$lib/types'; import type {
ConnectionData,
NodeTypes,
EdgeTypes,
EdgeLayouted,
Node,
FitViewOptions
} from '$lib/types';
import { createNodesStore, createEdgesStore } from './utils'; import { createNodesStore, createEdgesStore } from './utils';
export const initConnectionData = { export const initConnectionData = {
@@ -64,6 +71,7 @@ export const getInitialStore = () => ({
autoPanOnConnect: writable<boolean>(true), autoPanOnConnect: writable<boolean>(true),
fitViewOnInit: writable<boolean>(false), fitViewOnInit: writable<boolean>(false),
fitViewOnInitDone: writable<boolean>(false), fitViewOnInitDone: writable<boolean>(false),
fitViewOptions: writable<FitViewOptions>(undefined),
panZoom: writable<PanZoomInstance | null>(null), panZoom: writable<PanZoomInstance | null>(null),
snapGrid: writable<SnapGrid | null>(null), snapGrid: writable<SnapGrid | null>(null),
dragging: writable<boolean>(false), dragging: writable<boolean>(false),
+1 -1
View File
@@ -160,7 +160,7 @@ export const getTransformForBounds = (
height: number, height: number,
minZoom: number, minZoom: number,
maxZoom: number, maxZoom: number,
padding = 0.1 padding: number
): Transform => { ): Transform => {
const xZoom = width / (bounds.width * (1 + padding)); const xZoom = width / (bounds.width * (1 + padding));
const yZoom = height / (bounds.height * (1 + padding)); const yZoom = height / (bounds.height * (1 + padding));
+4 -3
View File
@@ -180,10 +180,11 @@ export function fitView<Params extends FitViewParamsBase<NodeBase>, Options exte
return isVisible; return isVisible;
}); });
const nodesInitialized = filteredNodes.every((n) => n.width && n.height); console.log(filteredNodes);
if (nodes.length > 0 && nodesInitialized) { if (filteredNodes.length > 0) {
const bounds = getRectOfNodes(nodes, nodeOrigin); const bounds = getRectOfNodes(filteredNodes, nodeOrigin);
console.log(bounds);
const [x, y, zoom] = getTransformForBounds( const [x, y, zoom] = getTransformForBounds(
bounds, bounds,