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';
|
2020-05-15 04:27:55 +02:00
|
|
|
import { ViewportGrid, ViewportPane } from '@ohif/ui';
|
2020-05-14 21:58:06 +02:00
|
|
|
// import DefaultViewport from './DefaultViewport.js';
|
|
|
|
|
// import EmptyViewport from './EmptyViewport.js';
|
|
|
|
|
|
2020-05-15 04:27:55 +02:00
|
|
|
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-19 13:55:38 +02:00
|
|
|
const displaySet = DisplaySetService.activeDisplaySets[0]
|
|
|
|
|
const 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
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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(
|
2020-05-19 10:59:50 +02:00
|
|
|
DisplaySetService.EVENTS.DISPLAY_SETS_ADDED,
|
2020-05-18 17:21:57 +02:00
|
|
|
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}
|
2020-05-20 05:28:41 +02:00
|
|
|
/>
|
2020-05-15 19:07:21 +02:00
|
|
|
);
|
|
|
|
|
}
|
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}
|
2020-05-15 04:27:55 +02:00
|
|
|
className="m-1"
|
2020-05-20 05:28:41 +02:00
|
|
|
acceptDropsFor="displayset"
|
2020-05-20 05:34:56 +02:00
|
|
|
onDrop={droppedItem => {
|
|
|
|
|
console.warn('DROPPED ITEM:', droppedItem);
|
2020-05-14 22:39:57 +02:00
|
|
|
}}
|
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 (
|
2020-05-15 04:27:55 +02:00
|
|
|
<ViewportGrid numRows={viewportGrid.numRows} numCols={viewportGrid.numCols}>
|
2020-05-14 22:39:57 +02:00
|
|
|
{ViewportPanes}
|
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-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,
|
2020-05-15 04:27:55 +02:00
|
|
|
// numRows: PropTypes.number.isRequired,
|
|
|
|
|
// numColumns: PropTypes.number.isRequired,
|
2020-05-14 21:58:06 +02:00
|
|
|
};
|
|
|
|
|
|
2020-05-15 04:27:55 +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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-15 04:27:55 +02:00
|
|
|
export default ViewerViewportGrid;
|