Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(grid): remove viewportIndex and only rely on viewportId #3591

Merged
merged 33 commits into from
Aug 30, 2023
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
66198d8
invert sync bug
sedghi Jul 27, 2023
35c2f95
fix the custom load strategy
sedghi Jul 27, 2023
51d06d8
fix disable element by id
sedghi Jul 27, 2023
0da10b1
remove unnecessary code from viewportGrid
sedghi Jul 27, 2023
c3c72bc
cleanup
sedghi Jul 27, 2023
d3d6f90
Added an example hanging protocol to the test extension
wayfarer3130 Aug 2, 2023
53458f5
Fix the positioning names on the viewports so they are re-used
wayfarer3130 Aug 2, 2023
77018bc
Additional HP for working with viewports
wayfarer3130 Aug 2, 2023
9a9a1ec
Merge branch 'master' of github.com:OHIF/Viewers into fix/remove-view…
sedghi Aug 9, 2023
b08a519
render something initially
sedghi Aug 9, 2023
27d715c
working tmtv
sedghi Aug 9, 2023
3b4267f
fix drag and drop
sedghi Aug 9, 2023
6ef26cf
fix navigation
sedghi Aug 9, 2023
14baf5e
Merge branch 'master' of github.com:OHIF/Viewers into fix/remove-view…
sedghi Aug 14, 2023
b38dc77
fix viewportlabel
sedghi Aug 14, 2023
8e67863
fix mpr
sedghi Aug 14, 2023
4918ce8
fix 2x2 to 2x3 layout change
sedghi Aug 14, 2023
f45a400
fix double click
sedghi Aug 14, 2023
1aef2dc
fix active ViewportId when switching layout
sedghi Aug 14, 2023
0f84637
fix deploy preview
sedghi Aug 15, 2023
db10f82
applied review comments
sedghi Aug 22, 2023
c79bceb
Merge branch 'master' of github.com:OHIF/Viewers into fix/remove-view…
sedghi Aug 22, 2023
fb65076
fix various bugs
sedghi Aug 23, 2023
53a588c
fix bugs for seg and rt
sedghi Aug 23, 2023
ade4118
fix e2e
sedghi Aug 23, 2023
1a236cd
applied review comments
sedghi Aug 23, 2023
eaeb7fe
apply review comments
sedghi Aug 23, 2023
8cbb36f
Merge branch 'master' of github.com:OHIF/Viewers into fix/remove-view…
sedghi Aug 23, 2023
b25c9af
apply review comments
sedghi Aug 24, 2023
dc3c9e6
apply review comments
sedghi Aug 24, 2023
0c3b037
apply review comments
sedghi Aug 25, 2023
494e2fd
Merge branch 'master' of github.com:OHIF/Viewers into fix/remove-view…
sedghi Aug 30, 2023
50d0d1e
apply review comments
sedghi Aug 30, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion extensions/_example/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ const getSopClassHandlerModule = (/* ... */) => {

const getToolbarModule = () => {};

// displaySet, viewportIndex, dataSource
// displaySet, dataSource
const getViewportModule = () => {
const wrappedViewport = props => {
return (
Expand Down
17 changes: 12 additions & 5 deletions extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
async function _hydrateRTDisplaySet({
rtDisplaySet,
viewportIndex,
viewportId,
servicesManager,
}) {
const {
Expand All @@ -27,7 +27,7 @@ async function _hydrateRTDisplaySet({
const { viewports } = viewportGridService.getState();

const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(
viewportIndex,
viewportId,
displaySetInstanceUID
);

Expand All @@ -39,8 +39,8 @@ async function _hydrateRTDisplaySet({
// is being displayed, if so we need to update the viewport to use volume viewport
// (if already is not using it) since Cornerstone3D currently only supports
// volume viewport for segmentation
viewports.forEach((viewport, index) => {
if (index === viewportIndex) {
viewports.forEach(viewport => {
if (viewport.viewportId === viewportId) {
return;
}

Expand All @@ -51,9 +51,16 @@ async function _hydrateRTDisplaySet({

if (shouldDisplaySeg) {
updatedViewports.push({
viewportIndex: index,
viewportId: viewport.viewportId,
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
viewportOptions: {
// Note: This is a hack to get the grid to re-render the OHIFCornerstoneViewport component
// Used for segmentation hydration right now, since the logic to decide whether
// a viewport needs to render a segmentation lives inside the CornerstoneViewportService
// so we need to re-render (force update via change of the needsRerendering) so that React
// does the diffing and decides we should render this again (although the id and element has not changed)
// so that the CornerstoneViewportService can decide whether to render the segmentation or not.
needsRerendering: true,
initialImageOptions: {
preset: 'middle',
},
Expand Down
13 changes: 5 additions & 8 deletions extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,14 @@ const RESPONSE = {
function promptHydrateRT({
servicesManager,
rtDisplaySet,
viewportIndex,
viewportId,
toolGroupId = 'default',
preHydrateCallbacks,
}) {
const { uiViewportDialogService } = servicesManager.services;

return new Promise(async function(resolve, reject) {
const promptResult = await _askHydrate(
uiViewportDialogService,
viewportIndex
);
const promptResult = await _askHydrate(uiViewportDialogService, viewportId);

if (promptResult === RESPONSE.HYDRATE_SEG) {
preHydrateCallbacks?.forEach(callback => {
Expand All @@ -29,7 +26,7 @@ function promptHydrateRT({

const isHydrated = await hydrateRTDisplaySet({
rtDisplaySet,
viewportIndex,
viewportId,
toolGroupId,
servicesManager,
});
Expand All @@ -39,7 +36,7 @@ function promptHydrateRT({
});
}

function _askHydrate(uiViewportDialogService, viewportIndex) {
function _askHydrate(uiViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
const message = 'Do you want to open this Segmentation?';
const actions = [
Expand All @@ -60,7 +57,7 @@ function _askHydrate(uiViewportDialogService, viewportIndex) {
};

uiViewportDialogService.show({
viewportIndex,
viewportId,
type: 'info',
message,
actions,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ function OHIFCornerstoneRTViewport(props) {
children,
displaySets,
viewportOptions,
viewportIndex,
viewportLabel,
servicesManager,
extensionManager,
Expand All @@ -36,7 +35,9 @@ function OHIFCornerstoneRTViewport(props) {
customizationService,
} = servicesManager.services;

const toolGroupId = `${RT_TOOLGROUP_BASE_NAME}-${viewportIndex}`;
const viewportId = viewportOptions.viewportId;

const toolGroupId = `${RT_TOOLGROUP_BASE_NAME}-${viewportId}`;

// RT viewport will always have a single display set
if (displaySets.length > 1) {
Expand Down Expand Up @@ -67,7 +68,7 @@ function OHIFCornerstoneRTViewport(props) {
// refs
const referencedDisplaySetRef = useRef(null);

const { viewports, activeViewportIndex } = viewportGrid;
const { viewports, activeViewportId } = viewportGrid;

const referencedDisplaySet = rtDisplaySet.getReferenceDisplaySet();
const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(
Expand All @@ -93,9 +94,9 @@ function OHIFCornerstoneRTViewport(props) {
};

const storePresentationState = useCallback(() => {
viewportGrid?.viewports.forEach(({ viewportIndex }) => {
viewportGrid?.viewports.forEach(({ viewportId }) => {
commandsManager.runCommand('storePresentation', {
viewportIndex,
viewportId,
});
});
}, [viewportGrid]);
Expand Down Expand Up @@ -124,7 +125,7 @@ function OHIFCornerstoneRTViewport(props) {
onElementDisabled={onElementDisabled}
></Component>
);
}, [viewportIndex, rtDisplaySet, toolGroupId]);
}, [viewportId, rtDisplaySet, toolGroupId]);

const onSegmentChange = useCallback(
direction => {
Expand Down Expand Up @@ -162,15 +163,15 @@ function OHIFCornerstoneRTViewport(props) {

promptHydrateRT({
servicesManager,
viewportIndex,
viewportId,
rtDisplaySet,
preHydrateCallbacks: [storePresentationState],
}).then(isHydrated => {
if (isHydrated) {
setIsHydrated(true);
}
});
}, [servicesManager, viewportIndex, rtDisplaySet, rtIsLoading]);
}, [servicesManager, viewportId, rtDisplaySet, rtIsLoading]);

useEffect(() => {
const { unsubscribe } = segmentationService.subscribe(
Expand Down Expand Up @@ -222,12 +223,12 @@ function OHIFCornerstoneRTViewport(props) {
const onDisplaySetsRemovedSubscription = displaySetService.subscribe(
displaySetService.EVENTS.DISPLAY_SETS_REMOVED,
({ displaySetInstanceUIDs }) => {
const activeViewport = viewports[activeViewportIndex];
const activeViewport = viewports.get(activeViewportId);
if (
displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)
) {
viewportGridService.setDisplaySetsForViewport({
viewportIndex: activeViewportIndex,
viewportId: activeViewportId,
displaySetInstanceUIDs: [],
});
}
Expand Down Expand Up @@ -292,7 +293,7 @@ function OHIFCornerstoneRTViewport(props) {
return (
child &&
React.cloneElement(child, {
viewportIndex,
viewportId,
key: index,
})
);
Expand Down Expand Up @@ -322,7 +323,7 @@ function OHIFCornerstoneRTViewport(props) {
storePresentationState();
const isHydrated = await _hydrateRTDisplaySet({
rtDisplaySet,
viewportIndex,
viewportId,
servicesManager,
});

Expand Down Expand Up @@ -384,7 +385,7 @@ function OHIFCornerstoneRTViewport(props) {

OHIFCornerstoneRTViewport.propTypes = {
displaySets: PropTypes.arrayOf(PropTypes.object),
viewportIndex: PropTypes.number.isRequired,
viewportId: PropTypes.string.isRequired,
dataSource: PropTypes.object,
children: PropTypes.node,
customProps: PropTypes.object,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,6 @@ PanelSegmentation.propTypes = {
commandsManager: PropTypes.shape({
runCommand: PropTypes.func.isRequired,
}),
appConfig: PropTypes.object.isRequired,
servicesManager: PropTypes.shape({
services: PropTypes.shape({
segmentationService: PropTypes.shape({
Expand Down
17 changes: 12 additions & 5 deletions extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
async function _hydrateSEGDisplaySet({
segDisplaySet,
viewportIndex,
viewportId: targetViewportId,
servicesManager,
}) {
const {
Expand All @@ -27,7 +27,7 @@ async function _hydrateSEGDisplaySet({
const { viewports } = viewportGridService.getState();

const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(
viewportIndex,
targetViewportId,
displaySetInstanceUID
);

Expand All @@ -37,8 +37,8 @@ async function _hydrateSEGDisplaySet({
// is being displayed, if so we need to update the viewport to use volume viewport
// (if already is not using it) since Cornerstone3D currently only supports
// volume viewport for segmentation
viewports.forEach((viewport, index) => {
if (index === viewportIndex) {
viewports.forEach((viewport, viewportId) => {
if (targetViewportId === viewportId) {
return;
}

Expand All @@ -49,9 +49,16 @@ async function _hydrateSEGDisplaySet({

if (shouldDisplaySeg) {
updatedViewports.push({
viewportIndex: index,
viewportId,
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
viewportOptions: {
// Note: This is a hack to get the grid to re-render the OHIFCornerstoneViewport component
// Used for segmentation hydration right now, since the logic to decide whether
// a viewport needs to render a segmentation lives inside the CornerstoneViewportService
// so we need to re-render (force update via change of the needsRerendering) so that React
// does the diffing and decides we should render this again (although the id and element has not changed)
// so that the CornerstoneViewportService can decide whether to render the segmentation or not.
needsRerendering: true,
initialImageOptions: {
preset: 'middle',
},
Expand Down
13 changes: 5 additions & 8 deletions extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,13 @@ const RESPONSE = {
function promptHydrateSEG({
servicesManager,
segDisplaySet,
viewportIndex,
viewportId,
preHydrateCallbacks,
}) {
const { uiViewportDialogService } = servicesManager.services;

return new Promise(async function(resolve, reject) {
const promptResult = await _askHydrate(
uiViewportDialogService,
viewportIndex
);
const promptResult = await _askHydrate(uiViewportDialogService, viewportId);

if (promptResult === RESPONSE.HYDRATE_SEG) {
preHydrateCallbacks?.forEach(callback => {
Expand All @@ -28,7 +25,7 @@ function promptHydrateSEG({

const isHydrated = await hydrateSEGDisplaySet({
segDisplaySet,
viewportIndex,
viewportId,
servicesManager,
});

Expand All @@ -37,7 +34,7 @@ function promptHydrateSEG({
});
}

function _askHydrate(uiViewportDialogService, viewportIndex) {
function _askHydrate(uiViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
const message = 'Do you want to open this Segmentation?';
const actions = [
Expand All @@ -58,7 +55,7 @@ function _askHydrate(uiViewportDialogService, viewportIndex) {
};

uiViewportDialogService.show({
viewportIndex,
viewportId,
type: 'info',
message,
actions,
Expand Down
Loading