diff --git a/dicom-viewer/src/App.tsx b/dicom-viewer/src/App.tsx index 630271b..734edce 100644 --- a/dicom-viewer/src/App.tsx +++ b/dicom-viewer/src/App.tsx @@ -1603,7 +1603,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer ) { console.log("Restoring volume slice index for viewport", i, state.volumeSliceIndices[i]); setTimeout(() => { - csUtilities.jumpToSlice(viewport.element, { imageIndex: state.volumeSliceIndices[i] }); + csUtilities.jumpToSlice(viewport.element, { imageIndex: state.volumeSliceIndices[i] }); }, 100); } @@ -1645,8 +1645,8 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer delete propsToRestore.colormap; } setTimeout(() => { - viewport.setProperties(propsToRestore); - viewport.render(); + viewport.setProperties(propsToRestore); + viewport.render(); }, 100); } else { console.warn("No properties to restore for viewport", i); @@ -1661,7 +1661,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer viewport.setCamera(state.cam[i]); viewport.render(); } - // --- Restore slice index if present --- + // --- Restore slice index if present --- } restoringStateRef.current = false; } @@ -1941,10 +1941,10 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer if (!imageIds || imageIds.length === 0) return; if (e.key === "ArrowUp" || e.key === "ArrowRight") { - csUtilities.scroll(viewport, { delta: -1}); + csUtilities.scroll(viewport, { delta: -1 }); e.preventDefault(); } else if (e.key === "ArrowDown" || e.key === "ArrowLeft") { - csUtilities.scroll(viewport, { delta: 1}); + csUtilities.scroll(viewport, { delta: 1 }); e.preventDefault(); } } @@ -1959,10 +1959,10 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer const numSlices = viewport.getNumberOfSlices(); if (numSlices > 1) { if (e.key === "ArrowUp" || e.key === "ArrowRight") { - csUtilities.scroll(viewport, { delta: -1}); + csUtilities.scroll(viewport, { delta: -1 }); e.preventDefault(); } else if (e.key === "ArrowDown" || e.key === "ArrowLeft") { - csUtilities.scroll(viewport, { delta: 1}); + csUtilities.scroll(viewport, { delta: 1 }); e.preventDefault(); } } @@ -2577,6 +2577,103 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer )} + {viewportModes[i] === "volume" && (() => { + const renderingEngine = renderingEngineRef.current; + const viewport = renderingEngine?.getViewport(`CT_${i}`); + let numSlices = 0; + let currentSlice = 0; + if (viewport && typeof viewport.getNumberOfSlices === "function" && typeof viewport.getSliceIndex === "function") { + numSlices = viewport.getNumberOfSlices(); + currentSlice = viewport.getSliceIndex(); + } + if (numSlices > 1) { + return ( +
+
{ + // Calculate the clicked slice index + const bar = e.currentTarget as HTMLDivElement; + const rect = bar.getBoundingClientRect(); + const y = e.clientY - rect.top; + const sliceIdx = Math.floor((y / rect.height) * numSlices); + const renderingEngine = renderingEngineRef.current; + const viewport = renderingEngine?.getViewport(`CT_${i}`); + if ( + viewport + ) { + csUtilities.jumpToSlice(viewport.element, { imageIndex: sliceIdx }); + viewport.render(); + updateOverlay(i, viewport); + } + }} + > + {Array.from({ length: numSlices }).map((_, idx) => { + const isCurrent = idx === currentSlice; + return ( +
+ ); + })} +
+
+ ); + } + return null; + })()} {isVisible && (availableStacks.length > 1 || !viewportImageIds[i] || viewportImageIds[i].length === 0) && (