ohif-viewer/platform/viewer/src/components/ViewportGrid.jsx

160 lines
4.4 KiB
React
Raw Normal View History

2020-05-14 21:58:06 +02:00
/**
* CSS Grid Reference: http://grid.malven.co/
*/
import React from 'react';
2020-05-14 21:58:06 +02:00
import PropTypes from 'prop-types';
import { ViewportGrid, ViewportPane, useViewportGrid } from '@ohif/ui';
import EmptyViewport from './EmptyViewport';
2020-05-14 21:58:06 +02:00
function ViewerViewportGrid(props) {
const { servicesManager, viewportComponents, dataSource } = props;
const [
{ numCols, numRows, activeViewportIndex, viewports },
dispatch,
] = useViewportGrid();
2020-06-03 19:12:13 +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
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
},
],
};
};
// 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,
// ]);
const onDropHandler = (viewportIndex, { displaySetInstanceUID }) => {
console.warn(`DROPPED: ${displaySetInstanceUID}`);
2020-05-28 04:21:25 +02:00
dispatch({
type: 'SET_DISPLAYSET_FOR_VIEWPORT',
payload: {
viewportIndex,
2020-05-28 04:21:25 +02:00
displaySetInstanceUID,
},
});
};
2020-05-20 07:26:44 +02:00
const getViewportPanes = () => {
const viewportPanes = [];
const numViewportPanes = numCols * numRows;
2020-05-18 17:21:57 +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-14 21:58:06 +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 (
<ViewportGrid numRows={numRows} numCols={numCols}>
2020-05-20 07:26:44 +02:00
{/* {ViewportPanes} */}
{getViewportPanes()}
</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
ViewerViewportGrid.propTypes = {
2020-05-15 19:07:21 +02:00
viewportComponents: PropTypes.array.isRequired,
2020-05-14 21:58:06 +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;
}
}
}
export default ViewerViewportGrid;