/** * CSS Grid Reference: http://grid.malven.co/ */ import React, { useState, useCallback, useEffect } from 'react'; import PropTypes from 'prop-types'; import { ViewportGrid, ViewportPane } from '@ohif/ui'; // import DefaultViewport from './DefaultViewport.js'; // import EmptyViewport from './EmptyViewport.js'; function ViewerViewportGrid(props) { const { activeViewportIndex, servicesManager, viewportComponents, dataSource, } = props; // TODO -> Need some way of selecting which displaySets hit the viewports. const { DisplaySetService } = servicesManager.services; // TODO -> Make a HangingProtocolService const HangingProtocolService = displaySets => { let displaySetInstanceUID; // Fallback if(!displaySets || !displaySets.length) { const displaySet = DisplaySetService.activeDisplaySets[0] displaySetInstanceUID = displaySet.displaySetInstanceUID; } else { const displaySet = displaySets[0]; displaySetInstanceUID = displaySet.displaySetInstanceUID; } return { numRows: 1, numCols: 1, activeViewportIndex: 0, viewports: [ { displaySetInstanceUID, }, ], }; }; // From ViewportGridService and/or ContextProvider const [viewportGrid, setViewportGrid] = useState({ numCols: 1, numRows: 1, viewports: [] }); useEffect(() => { const { unsubscribe } = DisplaySetService.subscribe( DisplaySetService.EVENTS.DISPLAY_SETS_ADDED, displaySets => { setViewportGrid(HangingProtocolService(displaySets)); }, ); return unsubscribe; }, []); // TODO: either need hover to change "active viewport" // so we can use it as our target for setting the displaySet, // or the dropHandler needs to know which viewport was dropped on // in event data const onDropHandler = ({displaySetInstanceUID}) => { const droppedDisplaySet = DisplaySetService.getDisplaySetByUID(displaySetInstanceUID); const updatedViewportGridState = HangingProtocolService([droppedDisplaySet]); console.warn('DROPPED: ', displaySetInstanceUID, droppedDisplaySet, updatedViewportGridState); // This is not updating the displayed DisplaySet setViewportGrid(updatedViewportGridState); } // viewportData --> displaySets const getViewportPanes = () => viewportGrid.viewports.map((viewport, viewportIndex) => { const displaySetInstanceUID = viewport.displaySetInstanceUID; if (!displaySetInstanceUID) { return null; } const displaySet = DisplaySetService.getDisplaySetByUID(displaySetInstanceUID); // TODO: Better Empty Viewport if (!displaySet) { return ( ); } // TODO -> Need way for other viewport e.g. vtk to be used. const ViewportComponent = _getViewportComponent( displaySet, viewportComponents ); return ( ); }); // const ViewportPanes = React.useMemo(getViewportPanes, [ // viewportComp'onents, // activeViewportIndex, // viewportGrid, // ]); return ( {/* {ViewportPanes} */} {getViewportPanes()} ); } ViewerViewportGrid.propTypes = { // viewports: PropTypes.array.isRequired, activeViewportIndex: PropTypes.number.isRequired, viewportComponents: PropTypes.array.isRequired, // numRows: PropTypes.number.isRequired, // numColumns: PropTypes.number.isRequired, }; ViewerViewportGrid.defaultProps = { // numRows: 1, // numColumns: 1, viewportData: [], viewportComponents: [], activeViewportIndex: 0, }; 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;