From 4441102c662da51dc668d623d06dfbe1e813dbfc Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 12 Aug 2022 20:41:27 +0530 Subject: [PATCH] Add PanZoom --- package.json | 3 ++- src/lib/components/view.svelte | 36 ++++++++++++++++++++++++++++++++-- src/routes/edit.svelte | 27 ++++++++++++------------- yarn.lock | 5 +++++ 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 9a44508d..837d04af 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,8 @@ "monaco-editor": "0.34.0", "monaco-mermaid": "1.0.6", "pako": "2.0.4", - "random-word-slugs": "0.1.6" + "random-word-slugs": "0.1.6", + "svg-pan-zoom": "^3.6.1" }, "lint-staged": { "*.{ts,svelte,js,css,md,json}": [ diff --git a/src/lib/components/view.svelte b/src/lib/components/view.svelte index a4036093..3579723d 100644 --- a/src/lib/components/view.svelte +++ b/src/lib/components/view.svelte @@ -2,6 +2,7 @@ import { inputStateStore, stateStore } from '$lib/util/state'; import { onMount } from 'svelte'; import mermaid from 'mermaid'; + import panzoom from 'svg-pan-zoom'; let code = ''; let config = ''; @@ -9,7 +10,11 @@ let view: HTMLDivElement; let error = false; let outOfSync = false; + let hide = false; let manualUpdate = true; + let pan: SvgPanZoom.Point; + let zoom: number; + let pzoom: SvgPanZoom.Instance; onMount(() => { stateStore.subscribe((state) => { if (state.error !== undefined) { @@ -35,8 +40,31 @@ mermaid.initialize(Object.assign({}, JSON.parse(state.mermaid))); mermaid.render('graph-div', code, (svgCode) => { if (svgCode.length > 0) { - console.log(svgCode); + let oldPan = pan ? { ...pan } : undefined; + let oldZoom = zoom; + pzoom?.destroy(); + hide = true; container.innerHTML = svgCode; + setTimeout(() => { + pzoom = panzoom('#graph-div', { + onPan: (p) => { + pan = p; + zoom = pzoom.getZoom(); + }, + onZoom: (z) => { + zoom = z; + pan = pzoom.getPan(); + }, + zoomEnabled: true, + panEnabled: true, + controlIconsEnabled: true + }); + if (oldPan !== undefined && oldZoom !== undefined) { + pzoom.zoom(oldZoom); + pzoom.pan(oldPan); + } + hide = false; + }, 0); } }); view.parentElement.scrollTop = scroll; @@ -59,7 +87,7 @@ {/if}
-
+
diff --git a/src/routes/edit.svelte b/src/routes/edit.svelte index 9db0e8aa..e420bfea 100644 --- a/src/routes/edit.svelte +++ b/src/routes/edit.svelte @@ -64,13 +64,6 @@ let docURL = docURLBase; let language: Languages = 'mermaid'; $: language = languageMap[selectedMode]; - $: { - if (selectedMode === 'code') { - text = $stateStore.code; - } else { - text = $stateStore.mermaid; - } - } stateStore.subscribe((state: State) => { if (state.updateEditor) { @@ -100,15 +93,19 @@ } ]; + let debounce: { [key: string]: any } = {}; const updateHandler = (message: CustomEvent) => { - const code = message.detail.text; - if (selectedMode === 'code') { - updateCode(code, { - updateEditor: false - }); - } else { - updateConfig(code, false); - } + clearTimeout(debounce[selectedMode]); + debounce[selectedMode] = setTimeout(() => { + const code = message.detail.text; + if (selectedMode === 'code') { + updateCode(code, { + updateEditor: false + }); + } else { + updateConfig(code, false); + } + }, 300); }; onMount(async () => { diff --git a/yarn.lock b/yarn.lock index 6057b6d2..2df48f38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4807,6 +4807,11 @@ svelte@3.49.0: resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.49.0.tgz#5baee3c672306de1070c3b7888fc2204e36a4029" integrity sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA== +svg-pan-zoom@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/svg-pan-zoom/-/svg-pan-zoom-3.6.1.tgz#f880a1bb32d18e9c625d7715350bebc269b450cf" + integrity sha512-JaKkGHHfGvRrcMPdJWkssLBeWqM+Isg/a09H7kgNNajT1cX5AztDTNs+C8UzpCxjCTRrG34WbquwaovZbmSk9g== + svgo@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"