From 0469747b5adb066d5ab4d1ac5095c12de1710018 Mon Sep 17 00:00:00 2001 From: Bruno Alves de Faria Date: Fri, 2 Sep 2016 16:10:54 -0300 Subject: [PATCH] AWV-1: Making the display set navigation buttons move the display sets on all viewports --- Packages/ohif-core/client/lib/viewer.js | 99 ++++++++++++++++++++++-- Packages/viewerbase/lib/layoutManager.js | 17 ++-- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/Packages/ohif-core/client/lib/viewer.js b/Packages/ohif-core/client/lib/viewer.js index 2edf78daf..21ab195f5 100644 --- a/Packages/ohif-core/client/lib/viewer.js +++ b/Packages/ohif-core/client/lib/viewer.js @@ -4,6 +4,9 @@ OHIF.viewer = {}; // Move display sets forward or backward in the given viewport index OHIF.viewer.moveSingleViewportDisplaySets = (viewportIndex, isNext) => { + // Get the setting that allow display set navigation looping over series + const allowLooping = OHIF.uiSettings.displaySetNavigationLoopOverSeries; + // Get the selected viewport data const viewportData = window.layoutManager.viewportData[viewportIndex]; @@ -25,8 +28,8 @@ OHIF.viewer.moveSingleViewportDisplaySets = (viewportIndex, isNext) => { if (isNext) { newIndex++; if (newIndex >= displaySets.length) { - // Stop here if looping is now allowing - if (!OHIF.uiSettings.displaySetNavigationLoopOverSeries) { + // Stop here if looping is not allowed + if (!allowLooping) { return; } @@ -35,8 +38,8 @@ OHIF.viewer.moveSingleViewportDisplaySets = (viewportIndex, isNext) => { } else { newIndex--; if (newIndex < 0) { - // Stop here if looping is now allowing - if (!OHIF.uiSettings.displaySetNavigationLoopOverSeries) { + // Stop here if looping is not allowed + if (!allowLooping) { return; } @@ -53,7 +56,93 @@ OHIF.viewer.moveSingleViewportDisplaySets = (viewportIndex, isNext) => { // Move multiple display sets forward or backward in all viewports OHIF.viewer.moveMultipleViewportDisplaySets = isNext => { - // TODO: implement + // Get the setting that allow display set navigation looping over series + const allowLooping = OHIF.uiSettings.displaySetNavigationLoopOverSeries; + + // Get the viewport data list + const viewportDataList = window.layoutManager.viewportData; + + // Create a map to control the display set movement + const moveMap = new Map(); + + // Iterate over each viewport and register its details on the movement map + viewportDataList.forEach((viewportData, viewportIndex) => { + // Get the current study + const currentStudy = _.findWhere(window.layoutManager.studies, { + studyInstanceUid: viewportData.studyInstanceUid + }) || window.layoutManager.studies[0]; + + // Get the display sets + const displaySets = currentStudy.displaySets; + + // Get the current display set + const displaySet = _.findWhere(displaySets, { + displaySetInstanceUid: viewportData.displaySetInstanceUid + }); + + // Get the current instance index + let displaySetIndex = _.indexOf(displaySets, displaySet); + displaySetIndex = displaySetIndex < 0 ? 9999 : displaySetIndex; + + // Try to get a map entry for current study or create it if not present + let studyViewports = moveMap.get(currentStudy); + if (!studyViewports) { + studyViewports = []; + moveMap.set(currentStudy, studyViewports); + } + + // Register the viewport index and the display set index on the map + studyViewports.push({ + viewportIndex, + displaySetIndex + }); + }); + + // Iterate over the studies map and move its display sets + moveMap.forEach((studyViewports, study) => { + // Sort the viewports on the study by the display set index + studyViewports.sort((a, b) => a.displaySetIndex > b.displaySetIndex); + + // Get the study display sets + const displaySets = study.displaySets; + + // Calculate the base index + const firstIndex = studyViewports[0].displaySetIndex; + const amount = studyViewports.length; + const rest = firstIndex % amount; + let baseIndex = rest ? firstIndex - rest : firstIndex; + const direction = isNext ? 1 : -1; + baseIndex += amount * direction; + + // Check if the base index will be outside the array bounds + if (baseIndex >= displaySets.length) { + // Stop here if looping is not allowed + if (!allowLooping) { + return; + } + + baseIndex = 0; + } else if (baseIndex < 0) { + // Stop here if looping is not allowed + if (!allowLooping) { + return; + } + + baseIndex = (displaySets.length - 1) - ((displaySets.length - 1) % amount); + } + + // Iterate over the current study viewports + studyViewports.forEach(({ viewportIndex }, index) => { + // Get the new displaySet index to be rendered in viewport + const newIndex = baseIndex + index; + + // Get the display set data for the new index + const displaySetData = displaySets[newIndex] || {}; + + // Rerender the viewport using the new display set data + window.layoutManager.rerenderViewportWithNewDisplaySet(viewportIndex, displaySetData); + }); + }); }; // Move display sets forward or backward diff --git a/Packages/viewerbase/lib/layoutManager.js b/Packages/viewerbase/lib/layoutManager.js index 0e1b07a32..a38a423fa 100644 --- a/Packages/viewerbase/lib/layoutManager.js +++ b/Packages/viewerbase/lib/layoutManager.js @@ -29,15 +29,18 @@ LayoutManager = class LayoutManager { var viewportIndex = 0; var self = this; + var oldViewportData = self.viewportData; + var running = true; + self.viewportData = []; this.studies.forEach(function(study) { study.displaySets.forEach(function(displaySet) { - if (!displaySet.images.length) { + if (!displaySet.images.length || !running) { return; } var currentViewportData; - var existingViewportData = self.viewportData[viewportIndex]; - if (self.viewportData[viewportIndex]) { + var existingViewportData = oldViewportData[viewportIndex]; + if (oldViewportData[viewportIndex]) { currentViewportData = { viewportIndex: existingViewportData.viewportIndex, studyInstanceUid: existingViewportData.studyInstanceUid, @@ -48,8 +51,6 @@ LayoutManager = class LayoutManager { imageId: existingViewportData.imageId, currentImageIdIndex: existingViewportData.currentImageIdIndex // TODO Remove this once currentImageIdIndex is removed from imageViewerViewports }; - - self.viewportData[viewportIndex] = currentViewportData; } else { // This tests to make sure there is actually image data in this instance // TODO: Change this when we add PDF and MPEG support @@ -69,18 +70,20 @@ LayoutManager = class LayoutManager { currentImageIdIndex: 0 // TODO Remove this once currentImageIdIndex is removed from imageViewerViewports }; } - - self.viewportData.push(currentViewportData); } + self.viewportData.push(currentViewportData); + viewportIndex++; if (viewportIndex === numViewports) { + running = false; return false; } }); if (viewportIndex === numViewports) { + running = false; return false; } });