From 654abaaaf494f9b18c2ac061d0262ad0f3ad3571 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 15 Sep 2025 14:14:47 +0100 Subject: [PATCH] Implement drag-and-drop functionality for stack selection and enhance stack grouping by studyId in the DICOM viewer --- dicom-viewer/src/App.tsx | 102 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 7 deletions(-) diff --git a/dicom-viewer/src/App.tsx b/dicom-viewer/src/App.tsx index ffc7060..59dbc1f 100644 --- a/dicom-viewer/src/App.tsx +++ b/dicom-viewer/src/App.tsx @@ -2073,7 +2073,6 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer const numVisible = viewportGrid.rows * viewportGrid.cols; const viewports = []; - //for (let i = 0; i < MAX_VIEWPORTS; i++) { // Viewports rendering loop for (let i = 0; i < numVisible; i++) { // Determine if this viewport should be visible in the current grid @@ -2095,20 +2094,28 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer gridRow: Math.floor(i / viewportGrid.cols) + 1, gridColumn: (i % viewportGrid.cols) + 1, height: "100%", - //visibility: isVisible ? "visible" : "hidden", - //pointerEvents: isVisible ? "auto" : "none", - // Remove outline, use only boxShadow for indicator boxShadow: activeViewport === i ? "0 0 0 4px #1976d2, 0 0 16px 4px #1976d2cc" : undefined, - // cursor: "pointer", zIndex: activeViewport === i ? 10 : 1, }} onClick={() => { setActiveViewport(i); - setViewportMenuOpen(false); // <-- Add this line to close the grid selector + setViewportMenuOpen(false); }} onDoubleClick={() => handleDoubleClick(i)} + onDragOver={e => { + e.preventDefault(); + e.dataTransfer.dropEffect = 'copy'; + }} + onDrop={e => { + e.preventDefault(); + const idxStr = e.dataTransfer.getData('text/stack-idx'); + const stackIdx = parseInt(idxStr, 10); + if (!isNaN(stackIdx)) { + handleLoadStack(i, stackIdx); + } + }} >