2020-05-14 21:58:06 +02:00
|
|
|
/**
|
|
|
|
|
* CSS Grid Reference: http://grid.malven.co/
|
|
|
|
|
*/
|
2020-05-24 04:15:21 +02:00
|
|
|
import React from 'react';
|
2020-05-14 21:58:06 +02:00
|
|
|
import PropTypes from 'prop-types';
|
2020-05-24 04:15:21 +02:00
|
|
|
import { ViewportGrid, ViewportPane, useViewportGrid } from '@ohif/ui';
|
|
|
|
|
import EmptyViewport from './EmptyViewport';
|
2020-05-14 21:58:06 +02:00
|
|
|
|
2020-05-15 04:27:55 +02:00
|
|
|
function ViewerViewportGrid(props) {
|
2020-05-24 04:15:21 +02:00
|
|
|
const { servicesManager, viewportComponents, dataSource } = props;
|
|
|
|
|
const [
|
|
|
|
|
{ numCols, numRows, activeViewportIndex, viewports },
|
|
|
|
|
dispatch,
|
|
|
|
|
] = useViewportGrid();
|
2020-06-03 19:12:13 +02:00
|
|
|
|
2020-05-25 04:34:01 +02:00
|
|
|
const setActiveViewportIndex = index => {
|
|
|
|
|
dispatch({ type: 'SET_ACTIVE_VIEWPORT_INDEX', payload: index });
|
2020-05-28 04:21:25 +02:00
|
|
|
};
|
2020-05-14 21:58:06 +02:00
|
|
|
|
2020-05-18 17:21:57 +02:00
|
|
|
// TODO -> Need some way of selecting which displaySets hit the viewports.
|
|
|
|
|
const { DisplaySetService } = servicesManager.services;
|
|
|
|
|
|
|
|
|
|
// TODO -> Make a HangingProtocolService
|
|
|
|
|
const HangingProtocolService = displaySets => {
|
2020-05-20 07:26:44 +02:00
|
|
|
let displaySetInstanceUID;
|
|
|
|
|
|
|
|
|
|
// Fallback
|
2020-05-24 04:15:21 +02:00
|
|
|
if (!displaySets || !displaySets.length) {
|
|
|
|
|
const displaySet = DisplaySetService.activeDisplaySets[0];
|
2020-05-20 07:26:44 +02:00
|
|
|
displaySetInstanceUID = displaySet.displaySetInstanceUID;
|
|
|
|
|
} else {
|
|
|
|
|
const displaySet = displaySets[0];
|
|
|
|
|
displaySetInstanceUID = displaySet.displaySetInstanceUID;
|
|
|
|
|
}
|
2020-05-18 20:05:26 +02:00
|
|
|
|
2020-05-18 17:21:57 +02:00
|
|
|
return {
|
|
|
|
|
numRows: 1,
|
|
|
|
|
numCols: 1,
|
|
|
|
|
activeViewportIndex: 0,
|
|
|
|
|
viewports: [
|
|
|
|
|
{
|
2020-05-18 23:40:28 +02:00
|
|
|
displaySetInstanceUID,
|
2020-05-18 17:21:57 +02:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2020-05-24 04:15:21 +02:00
|
|
|
// TODO:
|
|
|
|
|
// Hmm... Should a "displaySet" being added update the viewport based on HP?
|
|
|
|
|
// I guess it might.
|
|
|
|
|
// This is where you would likely "fill" emptyViewports if none had content
|
|
|
|
|
// Or to recheck best placement/priority based on all activeDisplaySets
|
|
|
|
|
// useEffect(() => {
|
|
|
|
|
// const { unsubscribe } = DisplaySetService.subscribe(
|
|
|
|
|
// DisplaySetService.EVENTS.DISPLAY_SETS_ADDED,
|
|
|
|
|
// displaySets => {
|
|
|
|
|
// displaySets.forEach(ds => console.log(`VPG:ADD::${ds.StudyInstanceUID}`));
|
|
|
|
|
// const hp = HangingProtocolService(displaySets);
|
|
|
|
|
// viewportGrid.setViewportGrid(hp);
|
|
|
|
|
// },
|
|
|
|
|
// );
|
|
|
|
|
|
|
|
|
|
// return unsubscribe;
|
|
|
|
|
// }, []);
|
2020-05-18 17:21:57 +02:00
|
|
|
|
2020-05-28 04:21:25 +02:00
|
|
|
// const droppedDisplaySet = DisplaySetService.getDisplaySetByUID(
|
|
|
|
|
// displaySetInstanceUID
|
|
|
|
|
// );
|
|
|
|
|
// const updatedViewportGridState = HangingProtocolService([
|
|
|
|
|
// droppedDisplaySet,
|
|
|
|
|
// ]);
|
2020-05-25 15:56:05 +02:00
|
|
|
const onDropHandler = (viewportIndex, { displaySetInstanceUID }) => {
|
|
|
|
|
console.warn(`DROPPED: ${displaySetInstanceUID}`);
|
2020-05-28 04:21:25 +02:00
|
|
|
dispatch({
|
|
|
|
|
type: 'SET_DISPLAYSET_FOR_VIEWPORT',
|
|
|
|
|
payload: {
|
2020-05-25 15:56:05 +02:00
|
|
|
viewportIndex,
|
2020-05-28 04:21:25 +02:00
|
|
|
displaySetInstanceUID,
|
|
|
|
|
},
|
2020-05-25 15:56:05 +02:00
|
|
|
});
|
2020-05-24 04:15:21 +02:00
|
|
|
};
|
2020-05-20 07:26:44 +02:00
|
|
|
|
2020-05-24 04:15:21 +02:00
|
|
|
const getViewportPanes = () => {
|
|
|
|
|
const viewportPanes = [];
|
|
|
|
|
const numViewportPanes = numCols * numRows;
|
2020-05-18 17:21:57 +02:00
|
|
|
|
2020-05-24 04:15:21 +02:00
|
|
|
for (let i = 0; i < numViewportPanes; i++) {
|
|
|
|
|
const viewportIndex = i;
|
2020-05-26 03:12:37 +02:00
|
|
|
const paneMetadata = viewports[i] || {};
|
|
|
|
|
const { displaySetInstanceUID } = paneMetadata;
|
2020-06-03 19:12:13 +02:00
|
|
|
|
2020-05-28 04:21:25 +02:00
|
|
|
const displaySet =
|
|
|
|
|
DisplaySetService.getDisplaySetByUID(displaySetInstanceUID) || {};
|
|
|
|
|
const ViewportComponent = _getViewportComponent(
|
2020-05-26 03:12:37 +02:00
|
|
|
displaySet.SOPClassHandlerId,
|
|
|
|
|
viewportComponents
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
viewportPanes[i] = (
|
|
|
|
|
<ViewportPane
|
|
|
|
|
key={viewportIndex}
|
|
|
|
|
className="m-1"
|
|
|
|
|
acceptDropsFor="displayset"
|
|
|
|
|
onDrop={onDropHandler.bind(null, viewportIndex)}
|
2020-05-28 04:21:25 +02:00
|
|
|
onInteraction={() => {
|
|
|
|
|
setActiveViewportIndex(viewportIndex);
|
|
|
|
|
}}
|
2020-05-26 03:12:37 +02:00
|
|
|
isActive={activeViewportIndex === viewportIndex}
|
|
|
|
|
>
|
|
|
|
|
<ViewportComponent
|
|
|
|
|
displaySet={displaySet}
|
|
|
|
|
viewportIndex={viewportIndex}
|
|
|
|
|
dataSource={dataSource}
|
|
|
|
|
/>
|
|
|
|
|
</ViewportPane>
|
|
|
|
|
);
|
2020-05-24 04:15:21 +02:00
|
|
|
}
|
2020-05-14 21:58:06 +02:00
|
|
|
|
2020-05-24 04:15:21 +02:00
|
|
|
return viewportPanes;
|
|
|
|
|
};
|
2020-05-14 21:58:06 +02:00
|
|
|
|
2020-05-20 07:26:44 +02:00
|
|
|
// const ViewportPanes = React.useMemo(getViewportPanes, [
|
2020-05-26 15:03:58 +02:00
|
|
|
// viewportComponents,
|
2020-05-20 07:26:44 +02:00
|
|
|
// activeViewportIndex,
|
|
|
|
|
// viewportGrid,
|
|
|
|
|
// ]);
|
2020-05-14 21:58:06 +02:00
|
|
|
|
|
|
|
|
return (
|
2020-05-24 04:15:21 +02:00
|
|
|
<ViewportGrid numRows={numRows} numCols={numCols}>
|
2020-05-20 07:26:44 +02:00
|
|
|
{/* {ViewportPanes} */}
|
|
|
|
|
{getViewportPanes()}
|
2020-05-15 04:27:55 +02:00
|
|
|
</ViewportGrid>
|
2020-05-14 21:58:06 +02:00
|
|
|
);
|
2020-05-14 22:39:57 +02:00
|
|
|
}
|
2020-05-14 21:58:06 +02:00
|
|
|
|
2020-05-15 04:27:55 +02:00
|
|
|
ViewerViewportGrid.propTypes = {
|
2020-05-15 19:07:21 +02:00
|
|
|
viewportComponents: PropTypes.array.isRequired,
|
2020-05-14 21:58:06 +02:00
|
|
|
};
|
|
|
|
|
|
2020-05-15 04:27:55 +02:00
|
|
|
ViewerViewportGrid.defaultProps = {
|
2020-05-15 19:07:21 +02:00
|
|
|
viewportComponents: [],
|
2020-05-14 21:58:06 +02:00
|
|
|
};
|
|
|
|
|
|
2020-05-26 03:12:37 +02:00
|
|
|
function _getViewportComponent(SOPClassHandlerId, viewportComponents) {
|
|
|
|
|
if (!SOPClassHandlerId) {
|
|
|
|
|
return EmptyViewport;
|
|
|
|
|
}
|
2020-05-15 19:07:21 +02:00
|
|
|
|
|
|
|
|
for (let i = 0; i < viewportComponents.length; i++) {
|
|
|
|
|
if (
|
|
|
|
|
viewportComponents[i].displaySetsToDisplay.includes(SOPClassHandlerId)
|
|
|
|
|
) {
|
|
|
|
|
const { component } = viewportComponents[i];
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-15 04:27:55 +02:00
|
|
|
export default ViewerViewportGrid;
|