From c1d4ac10149d3dca47de084208cf92b73ff53fea Mon Sep 17 00:00:00 2001 From: Philip Molares Date: Fri, 9 Oct 2020 19:32:06 +0200 Subject: [PATCH] Markmap make mouse input toggle (#655) Signed-off-by: Tilman Vatteroth Co-authored-by: Tilman Vatteroth --- public/locales/en.json | 4 ++ .../common/lock-button/lock-button.tsx | 20 ++++++++++ .../markmap/markmap-frame.tsx | 37 ++++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/components/common/lock-button/lock-button.tsx diff --git a/public/locales/en.json b/public/locales/en.json index 46cb74edb..30799384a 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -7,6 +7,10 @@ "highlightCode": { "copyCode": "Copy code to clipboard" }, + "markmap": { + "locked": "Mouse input locked", + "unlocked": "Mouse input unlocked" + }, "flowchart": { "invalidSyntax": "Invalid flowchart.js syntax!" }, diff --git a/src/components/common/lock-button/lock-button.tsx b/src/components/common/lock-button/lock-button.tsx new file mode 100644 index 000000000..537c22359 --- /dev/null +++ b/src/components/common/lock-button/lock-button.tsx @@ -0,0 +1,20 @@ +import React from 'react' +import { Button } from 'react-bootstrap' +import { ForkAwesomeIcon } from '../fork-awesome/fork-awesome-icon' + +export interface LockButtonProps { + locked: boolean, + onLockedChanged: (newState: boolean) => void + title: string +} + +export const LockButton: React.FC = ({ locked, onLockedChanged, title }) => { + return ( + + ) +} diff --git a/src/components/markdown-renderer/replace-components/markmap/markmap-frame.tsx b/src/components/markdown-renderer/replace-components/markmap/markmap-frame.tsx index 3297d8c10..d5ea091c8 100644 --- a/src/components/markdown-renderer/replace-components/markmap/markmap-frame.tsx +++ b/src/components/markdown-renderer/replace-components/markmap/markmap-frame.tsx @@ -1,11 +1,37 @@ -import React, { useEffect, useRef } from 'react' +import React, { Fragment, useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { LockButton } from '../../../common/lock-button/lock-button' export interface MarkmapFrameProps { code: string } +const blockHandler = (event: Event): void => { + event.stopPropagation() +} + export const MarkmapFrame: React.FC = ({ code }) => { + const { t } = useTranslation() const diagramContainer = useRef(null) + const [disablePanAndZoom, setDisablePanAndZoom] = useState(true) + + useEffect(() => { + if (diagramContainer.current) { + if (disablePanAndZoom) { + diagramContainer.current.addEventListener('wheel', blockHandler, true) + diagramContainer.current.addEventListener('mousedown', blockHandler, true) + diagramContainer.current.addEventListener('click', blockHandler, true) + diagramContainer.current.addEventListener('dblclick', blockHandler, true) + diagramContainer.current.addEventListener('touchstart', blockHandler, true) + } else { + diagramContainer.current.removeEventListener('wheel', blockHandler, true) + diagramContainer.current.removeEventListener('mousedown', blockHandler, true) + diagramContainer.current.removeEventListener('click', blockHandler, true) + diagramContainer.current.removeEventListener('dblclick', blockHandler, true) + diagramContainer.current.removeEventListener('touchstart', blockHandler, true) + } + } + }, [diagramContainer, disablePanAndZoom]) useEffect(() => { if (!diagramContainer.current) { @@ -33,5 +59,12 @@ export const MarkmapFrame: React.FC = ({ code }) => { }).catch(() => { console.error('error while loading markmap') }) }, [code]) - return
+ return ( + +
+
+ setDisablePanAndZoom(newState))} title={ disablePanAndZoom ? t('renderer.markmap.locked') : t('renderer.markmap.unlocked')}/> +
+ + ) }