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

160 lines
4.1 KiB
React
Raw Normal View History

2020-05-14 21:58:06 +02:00
/**
* CSS Grid Reference: http://grid.malven.co/
*/
2020-05-18 19:49:32 +02:00
import React, { useState, useCallback, useEffect } from 'react';
2020-05-14 21:58:06 +02:00
import PropTypes from 'prop-types';
import { ViewportGrid, ViewportPane } from '@ohif/ui';
2020-05-14 21:58:06 +02:00
// import DefaultViewport from './DefaultViewport.js';
// import EmptyViewport from './EmptyViewport.js';
function ViewerViewportGrid(props) {
2020-05-15 19:07:21 +02:00
const {
activeViewportIndex,
2020-05-18 17:21:57 +02:00
servicesManager,
2020-05-15 19:07:21 +02:00
viewportComponents,
dataSource,
} = props;
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-18 23:40:28 +02:00
const displaySetInstanceUID = displaySets[Object.keys(displaySets)[0]][0].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
},
],
};
};
const handleDisplaySetSubscription = useCallback(displaySets => {
setViewportGrid(HangingProtocolService(displaySets));
2020-05-14 22:39:57 +02:00
});
2020-05-18 17:21:57 +02:00
useEffect(() => {
const { unsubscribe } = DisplaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SET_ADDED,
handleDisplaySetSubscription
);
return unsubscribe;
}, []);
// From ViewportGridService and/or ContextProvider
2020-05-18 19:49:32 +02:00
const [viewportGrid, setViewportGrid] = useState({
numCols: 1,
numRows: 1,
viewports: []
});
2020-05-18 17:21:57 +02:00
2020-05-14 21:58:06 +02:00
// viewportData --> displaySets
const getViewportPanes = () =>
2020-05-14 22:39:57 +02:00
viewportGrid.viewports.map((viewport, viewportIndex) => {
2020-05-18 23:40:28 +02:00
const displaySetInstanceUID = viewport.displaySetInstanceUID;
if (!displaySetInstanceUID) {
2020-05-18 20:05:26 +02:00
return null;
}
2020-05-18 23:40:28 +02:00
const displaySet = DisplaySetService.getDisplaySetByUID(displaySetInstanceUID);
2020-05-15 19:07:21 +02:00
if (!displaySet) {
return (
<ViewportPane
key={viewportIndex}
className="m-1"
2020-05-18 17:21:57 +02:00
// Pass in as prop?
acceptDropsFor="displayset"
onDrop={droppedItem => {
console.warn('DROPPED ITEM:', droppedItem);
2020-05-15 19:07:21 +02:00
}}
isActive={activeViewportIndex === viewportIndex}
></ViewportPane>
);
}
2020-05-14 21:58:06 +02:00
2020-05-14 22:39:57 +02:00
// if (!displaySet) {
// // TODO: Empty Viewport
// return null;
// }
2020-05-14 21:58:06 +02:00
// const pluginName =
// !layout.plugin && displaySet && displaySet.plugin
// ? displaySet.plugin
// : layout.plugin;
2020-05-15 19:07:21 +02:00
// TODO -> Need way for other viewport e.g. vtk to be used.
2020-05-14 21:58:06 +02:00
2020-05-15 19:07:21 +02:00
const ViewportComponent = _getViewportComponent(
displaySet,
viewportComponents
);
2020-05-14 21:58:06 +02:00
return (
<ViewportPane
key={viewportIndex}
className="m-1"
2020-05-14 22:39:57 +02:00
onDrop={() => {
/* setDisplaySet for Viewport */
}}
2020-05-14 21:58:06 +02:00
isActive={activeViewportIndex === viewportIndex}
>
2020-05-15 19:07:21 +02:00
<ViewportComponent
displaySet={displaySet}
viewportIndex={viewportIndex}
dataSource={dataSource}
/>
2020-05-14 21:58:06 +02:00
</ViewportPane>
);
});
2020-05-14 22:39:57 +02:00
const ViewportPanes = React.useMemo(getViewportPanes, [
2020-05-15 19:07:21 +02:00
viewportComponents,
2020-05-14 22:39:57 +02:00
activeViewportIndex,
2020-05-18 20:05:26 +02:00
viewportGrid
2020-05-14 22:39:57 +02:00
]);
2020-05-14 21:58:06 +02:00
return (
<ViewportGrid numRows={viewportGrid.numRows} numCols={viewportGrid.numCols}>
2020-05-14 22:39:57 +02:00
{ViewportPanes}
</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-14 22:39:57 +02:00
// viewports: PropTypes.array.isRequired,
2020-05-14 21:58:06 +02:00
activeViewportIndex: PropTypes.number.isRequired,
2020-05-15 19:07:21 +02:00
viewportComponents: PropTypes.array.isRequired,
// numRows: PropTypes.number.isRequired,
// numColumns: PropTypes.number.isRequired,
2020-05-14 21:58:06 +02:00
};
ViewerViewportGrid.defaultProps = {
// numRows: 1,
// numColumns: 1,
2020-05-15 19:07:21 +02:00
viewportData: [],
viewportComponents: [],
2020-05-14 21:58:06 +02:00
activeViewportIndex: 0,
};
2020-05-15 19:07:21 +02:00
function _getViewportComponent(displaySet, viewportComponents) {
const { SOPClassHandlerId } = displaySet;
for (let i = 0; i < viewportComponents.length; i++) {
if (
viewportComponents[i].displaySetsToDisplay.includes(SOPClassHandlerId)
) {
const { component } = viewportComponents[i];
return component;
}
}
}
export default ViewerViewportGrid;