fix(viewport): Reset viewport state and fix CINE looping, thumbnail resolution, and dynamic tool settings (#4037)

This commit is contained in:
Alireza authored and GitHub committed 2024-04-16 11:04:48 -04:00
1 parent a6c6fff43a
commit f99a0bfb31
80 files changed
+1129 -801

No files matched your search

@@ -28,6 +28,7 @@ interface Layout {
interface DefaultState {
activeViewportId: string | null;
layout: Layout;
isHangingProtocolLayout: boolean;
viewports: Map<string, Viewport>;
}
@@ -38,6 +39,16 @@ const DEFAULT_STATE: DefaultState = {
numCols: 0,
layoutType: 'grid',
},
// this flag is used to determine if the hanging protocol layout is active
// so that we can inherit the viewport options from the previous state
// otherwise we will not allow that. Basically the issue is that we need
// to be able to come out of the hanging protocol layout and go back to the
// regular layout e.g., if we are in the MPR hanging protocol, and someone use
// 1x1 layout by custom layout selector, there is no way to drag and drop
// a non-reconstructible series to the viewport since it will always
// inherit the hanging protocol layout options (volume viewport),
// so we need to be able to switch back to the regular layout.
isHangingProtocolLayout: false,
// Viewports structure has been changed to Map (previously it was
// tied to the viewportIndex which caused multiple issues. Now we have
// moved completely to viewportId which is unique for each viewport.
@@ -152,7 +163,7 @@ export function ViewportGridProvider({ children, service }) {
// Use the newly provide viewportOptions and display set options
// when provided, and otherwise fall back to the previous ones.
// That allows for easy updates of just the display set.
const viewportOptions = merge(
let viewportOptions = merge(
{},
previousViewport?.viewportOptions,
updatedViewport?.viewportOptions
@@ -161,18 +172,29 @@ export function ViewportGridProvider({ children, service }) {
const displaySetOptions = updatedViewport.displaySetOptions || [];
if (!displaySetOptions.length) {
// Copy all the display set options, assuming a full set of displaySet UID's is provided.
displaySetOptions.push(...previousViewport.displaySetOptions);
if (state.isHangingProtocolLayout) {
displaySetOptions.push(...(previousViewport.displaySetOptions || []));
}
if (!displaySetOptions.length) {
displaySetOptions.push({});
}
}
// if it is not part of the hanging protocol layout, we should remove the toolGroupId
// and viewportType from the viewportOptions so that it doesn't
// inherit the hanging protocol layout options
if (!state.isHangingProtocolLayout) {
viewportOptions = {
viewportId: viewportOptions.viewportId,
};
}
const newViewport = {
...previousViewport,
displaySetInstanceUIDs,
viewportOptions,
displaySetOptions,
viewportLabel: getViewportLabel(viewports, viewportId),
// viewportLabel: getViewportLabel(viewports, viewportId),
};
viewportOptions.presentationIds = ViewportGridService.getPresentationIds(
@@ -196,6 +218,7 @@ export function ViewportGridProvider({ children, service }) {
layoutType = 'grid',
activeViewportId,
findOrCreateViewport,
isHangingProtocolLayout,
} = action.payload;
// If empty viewportOptions, we use numRow and numCols to calculate number of viewports
@@ -283,6 +306,7 @@ export function ViewportGridProvider({ children, service }) {
layoutType,
},
viewports,
isHangingProtocolLayout,
};
return ret;
}
@@ -373,6 +397,7 @@ export function ViewportGridProvider({ children, service }) {
layoutOptions = [],
activeViewportId,
findOrCreateViewport,
isHangingProtocolLayout,
}) =>
dispatch({
type: 'SET_LAYOUT',
@@ -383,6 +408,7 @@ export function ViewportGridProvider({ children, service }) {
layoutOptions,
activeViewportId,
findOrCreateViewport,
isHangingProtocolLayout,
},
}),
[dispatch]