Initial commit from prod-batam
This commit is contained in:
102
extensions/default/src/findViewportsByPosition.ts
Normal file
102
extensions/default/src/findViewportsByPosition.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { useViewportsByPositionStore } from './stores/useViewportsByPositionStore';
|
||||
|
||||
/**
|
||||
* This find or create viewport is paired with the reduce results from
|
||||
* below, and the action of this viewport is to look for previously filled
|
||||
* viewports, and to reuse by position id. If there is no filled viewport,
|
||||
* then one can be re-used from the display set if it isn't going to be displayed.
|
||||
* @param hangingProtocolService - bound parameter supplied before using this
|
||||
* @param viewportsByPosition - bound parameter supplied before using this
|
||||
* @param position - the position in the grid to retrieve
|
||||
* @param positionId - the current position on screen to retrieve
|
||||
* @param options - the set of options used, so that subsequent calls can
|
||||
* store state that is reset by the setLayout.
|
||||
* This class uses the options to store the already viewed
|
||||
* display sets, filling it initially with the pre-existing viewports.
|
||||
*/
|
||||
export const findOrCreateViewport = (
|
||||
hangingProtocolService,
|
||||
isHangingProtocolLayout,
|
||||
viewportsByPosition,
|
||||
position: number,
|
||||
positionId: string,
|
||||
options: Record<string, unknown>
|
||||
) => {
|
||||
const byPositionViewport = viewportsByPosition?.[positionId];
|
||||
if (byPositionViewport) {
|
||||
return { ...byPositionViewport };
|
||||
}
|
||||
const { protocolId, stageIndex } = hangingProtocolService.getState();
|
||||
|
||||
// Setup the initial in display correctly for initial view/select
|
||||
if (!options.inDisplay) {
|
||||
options.inDisplay = [...viewportsByPosition.initialInDisplay];
|
||||
}
|
||||
|
||||
// See if there is a default viewport for new views
|
||||
const missing = hangingProtocolService.getMissingViewport(
|
||||
isHangingProtocolLayout ? protocolId : 'default',
|
||||
stageIndex,
|
||||
options
|
||||
);
|
||||
if (missing) {
|
||||
const displaySetInstanceUIDs = missing.displaySetsInfo.map(it => it.displaySetInstanceUID);
|
||||
options.inDisplay.push(...displaySetInstanceUIDs);
|
||||
return {
|
||||
displaySetInstanceUIDs,
|
||||
displaySetOptions: missing.displaySetsInfo.map(it => it.displaySetOptions),
|
||||
viewportOptions: {
|
||||
...missing.viewportOptions,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
// and lastly if there is no default viewport, then we see if we can grab the
|
||||
// viewportsByPosition at the position index and use that
|
||||
// const candidate = Object.values(viewportsByPosition)[position];
|
||||
|
||||
// // if it has something to display, then we can use it
|
||||
// return candidate?.displaySetInstanceUIDs ? candidate : {};
|
||||
return {};
|
||||
};
|
||||
|
||||
/**
|
||||
* Records the information on what viewports are displayed in which position.
|
||||
* Also records what instances from the existing positions are going to be in
|
||||
* view initially.
|
||||
* @param state is the viewport grid state
|
||||
* @param syncService is the state sync service to use for getting existing state
|
||||
* @returns Set of states that can be applied to the state sync to remember
|
||||
* the current view state.
|
||||
*/
|
||||
const findViewportsByPosition = (state, { numRows, numCols }) => {
|
||||
const { viewports } = state;
|
||||
const { setViewportsByPosition, addInitialInDisplay } = useViewportsByPositionStore.getState();
|
||||
const initialInDisplay = [];
|
||||
|
||||
const viewportsByPosition = {};
|
||||
viewports.forEach(viewport => {
|
||||
if (viewport.positionId) {
|
||||
const storedViewport = {
|
||||
...viewport,
|
||||
viewportOptions: { ...viewport.viewportOptions },
|
||||
};
|
||||
viewportsByPosition[viewport.positionId] = storedViewport;
|
||||
setViewportsByPosition(viewport.positionId, storedViewport);
|
||||
}
|
||||
});
|
||||
|
||||
for (let row = 0; row < numRows; row++) {
|
||||
for (let col = 0; col < numCols; col++) {
|
||||
const positionId = `${col}-${row}`;
|
||||
const viewport = viewportsByPosition[positionId];
|
||||
if (viewport?.displaySetInstanceUIDs) {
|
||||
initialInDisplay.push(...viewport.displaySetInstanceUIDs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initialInDisplay.forEach(displaySetInstanceUID => addInitialInDisplay(displaySetInstanceUID));
|
||||
};
|
||||
|
||||
export default findViewportsByPosition;
|
||||
Reference in New Issue
Block a user