From de9cf60adc941535482466f385298d08d04d3aa7 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 11 Aug 2025 10:58:22 +0100 Subject: [PATCH] refactor context menu and keyboard navigation handling for improved clarity and maintainability --- dicom-viewer/src/App.tsx | 263 ++++++++++++++++++++------------------- 1 file changed, 134 insertions(+), 129 deletions(-) diff --git a/dicom-viewer/src/App.tsx b/dicom-viewer/src/App.tsx index 323b5f6..d586fb8 100644 --- a/dicom-viewer/src/App.tsx +++ b/dicom-viewer/src/App.tsx @@ -1174,17 +1174,17 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer }; }, []); -useEffect(() => { - const el = appRootRef.current; - if (!el) return; - const handleContextMenu = (e: MouseEvent) => { - e.preventDefault(); - }; - el.addEventListener("contextmenu", handleContextMenu); - return () => { - el.removeEventListener("contextmenu", handleContextMenu); - }; -}, []); + useEffect(() => { + const el = appRootRef.current; + if (!el) return; + const handleContextMenu = (e: MouseEvent) => { + e.preventDefault(); + }; + el.addEventListener("contextmenu", handleContextMenu); + return () => { + el.removeEventListener("contextmenu", handleContextMenu); + }; + }, []); useEffect(() => { if (!referenceLinesEnabled) return; @@ -1926,6 +1926,8 @@ useEffect(() => { useEffect(() => { + const el = appRootRef.current; + if (!el) return; function handleArrowKeyNavigation(e: KeyboardEvent) { console.log("Handling arrow key navigation", e.key); console.log("activeViewport", activeViewport); @@ -1975,8 +1977,11 @@ useEffect(() => { } } - window.addEventListener("keydown", handleArrowKeyNavigation); - return () => window.removeEventListener("keydown", handleArrowKeyNavigation); + el.addEventListener("keydown", handleArrowKeyNavigation); + + return () => { + el.removeEventListener("keydown", handleArrowKeyNavigation); + }; }, [activeViewport, viewportModes, viewportImageIds, updateOverlay]); @@ -2401,98 +2406,98 @@ useEffect(() => { {/* Preset menu (bottom right of viewport) */} -
-
e.stopPropagation()} // <-- prevent bubbling to viewport - > -
{ - e.stopPropagation(); // <-- prevent bubbling to viewport - setPresetsOpenArr(prev => { - const next = [...prev]; - next[i] = !next[i]; - return next; - }); - }} - > - Presets - - {presetsOpenArr[i] ? "▲" : "▼"} - -
- {presetsOpenArr[i] && ( -
e.stopPropagation()} // <-- prevent bubbling to viewport - > - {WINDOW_LEVEL_PRESETS.map((preset) => ( - - ))} -
- )} -
-
+
{ + e.stopPropagation(); // <-- prevent bubbling to viewport + setPresetsOpenArr(prev => { + const next = [...prev]; + next[i] = !next[i]; + return next; + }); + }} + > + Presets + + {presetsOpenArr[i] ? "▲" : "▼"} + +
+ {presetsOpenArr[i] && ( +
e.stopPropagation()} // <-- prevent bubbling to viewport + > + {WINDOW_LEVEL_PRESETS.map((preset) => ( + + ))} +
+ )} + + {/* Position bar inside each viewport */} {viewportModes[i] === "stack" && viewportImageIds[i] && (
{ return ( // App root -
+
{/* Loading overlay */} {loadingState && (
{ ? "Disable Alt Key for Reference Cursors" : "Enable Alt Key for Reference Cursors"} - + {/* Add more menu items here if needed */}