2019-05-31 22:09:05 -04:00
|
|
|
import './ViewerMain.css';
|
|
|
|
|
|
2019-05-29 08:39:54 -04:00
|
|
|
import { Component } from 'react';
|
2019-10-11 12:03:59 -04:00
|
|
|
import { ConnectedViewportGrid } from './../components/ViewportGrid/index.js';
|
2019-05-31 22:09:05 -04:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
|
import React from 'react';
|
2020-03-24 00:01:39 +05:30
|
|
|
import memoize from 'lodash/memoize';
|
|
|
|
|
import _values from 'lodash/values';
|
|
|
|
|
|
|
|
|
|
var values = memoize(_values);
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
class ViewerMain extends Component {
|
|
|
|
|
static propTypes = {
|
2019-05-31 22:09:05 -04:00
|
|
|
activeViewportIndex: PropTypes.number.isRequired,
|
2019-06-06 11:11:26 -03:00
|
|
|
studies: PropTypes.array,
|
2019-06-15 14:26:09 +02:00
|
|
|
viewportSpecificData: PropTypes.object.isRequired,
|
|
|
|
|
layout: PropTypes.object.isRequired,
|
2019-05-02 17:12:06 -04:00
|
|
|
setViewportSpecificData: PropTypes.func.isRequired,
|
2019-05-27 11:31:39 -04:00
|
|
|
clearViewportSpecificData: PropTypes.func.isRequired,
|
2019-05-29 08:39:54 -04:00
|
|
|
};
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-01-31 05:55:05 -02:00
|
|
|
constructor(props) {
|
2019-05-29 08:39:54 -04:00
|
|
|
super(props);
|
2019-05-27 11:31:39 -04:00
|
|
|
|
2019-05-02 17:12:06 -04:00
|
|
|
this.state = {
|
2019-05-27 11:31:39 -04:00
|
|
|
displaySets: [],
|
2019-05-29 08:39:54 -04:00
|
|
|
};
|
2019-01-31 05:55:05 -02:00
|
|
|
}
|
|
|
|
|
|
2019-01-30 09:34:55 +00:00
|
|
|
getDisplaySets(studies) {
|
2019-05-29 08:39:54 -04:00
|
|
|
const displaySets = [];
|
2019-01-31 05:55:05 -02:00
|
|
|
studies.forEach(study => {
|
2019-01-17 17:00:21 +01:00
|
|
|
study.displaySets.forEach(dSet => {
|
2019-05-02 17:12:06 -04:00
|
|
|
if (!dSet.plugin) {
|
2019-05-29 08:39:54 -04:00
|
|
|
dSet.plugin = 'cornerstone';
|
2019-05-02 17:12:06 -04:00
|
|
|
}
|
2019-05-29 08:39:54 -04:00
|
|
|
displaySets.push(dSet);
|
|
|
|
|
});
|
|
|
|
|
});
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-05-29 08:39:54 -04:00
|
|
|
return displaySets;
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
2020-03-09 19:03:23 +00:00
|
|
|
findDisplaySet(studies, StudyInstanceUID, displaySetInstanceUID) {
|
2019-01-17 17:00:21 +01:00
|
|
|
const study = studies.find(study => {
|
2020-03-09 19:03:23 +00:00
|
|
|
return study.StudyInstanceUID === StudyInstanceUID;
|
2019-05-29 08:39:54 -04:00
|
|
|
});
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
if (!study) {
|
2019-05-29 08:39:54 -04:00
|
|
|
return;
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return study.displaySets.find(displaySet => {
|
2020-03-09 19:03:23 +00:00
|
|
|
return displaySet.displaySetInstanceUID === displaySetInstanceUID;
|
2019-05-29 08:39:54 -04:00
|
|
|
});
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
|
// Add beforeUnload event handler to check for unsaved changes
|
|
|
|
|
//window.addEventListener('beforeunload', unloadHandlers.beforeUnload);
|
|
|
|
|
|
|
|
|
|
// Get all the display sets for the viewer studies
|
2019-06-06 11:11:26 -03:00
|
|
|
if (this.props.studies) {
|
|
|
|
|
const displaySets = this.getDisplaySets(this.props.studies);
|
2019-10-26 01:00:34 -03:00
|
|
|
this.setState({ displaySets }, this.fillEmptyViewportPanes);
|
2019-06-06 11:11:26 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentDidUpdate(prevProps) {
|
2019-10-23 11:27:22 -04:00
|
|
|
const prevViewportAmount = prevProps.layout.viewports.length;
|
|
|
|
|
const viewportAmount = this.props.layout.viewports.length;
|
|
|
|
|
const isVtk = this.props.layout.viewports.some(vp => !!vp.vtk);
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
this.props.studies !== prevProps.studies ||
|
|
|
|
|
(viewportAmount !== prevViewportAmount && !isVtk)
|
|
|
|
|
) {
|
2019-06-06 11:11:26 -03:00
|
|
|
const displaySets = this.getDisplaySets(this.props.studies);
|
2019-10-26 01:00:34 -03:00
|
|
|
this.setState({ displaySets }, this.fillEmptyViewportPanes);
|
2019-06-06 11:11:26 -03:00
|
|
|
}
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
2019-10-23 11:27:22 -04:00
|
|
|
fillEmptyViewportPanes = () => {
|
2020-03-13 16:45:26 -03:00
|
|
|
// TODO: Here is the entry point for filling viewports on load.
|
2019-10-23 11:27:22 -04:00
|
|
|
const dirtyViewportPanes = [];
|
2019-05-29 08:39:54 -04:00
|
|
|
const { layout, viewportSpecificData } = this.props;
|
2019-10-23 11:27:22 -04:00
|
|
|
const { displaySets } = this.state;
|
2019-05-02 17:12:06 -04:00
|
|
|
|
2019-10-23 11:27:22 -04:00
|
|
|
if (!displaySets || !displaySets.length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-10-18 15:29:00 -03:00
|
|
|
|
2019-10-23 11:27:22 -04:00
|
|
|
for (let i = 0; i < layout.viewports.length; i++) {
|
|
|
|
|
const viewportPane = viewportSpecificData[i];
|
|
|
|
|
const isNonEmptyViewport =
|
|
|
|
|
viewportPane &&
|
2020-03-09 19:03:23 +00:00
|
|
|
viewportPane.StudyInstanceUID &&
|
|
|
|
|
viewportPane.displaySetInstanceUID;
|
2019-10-23 11:27:22 -04:00
|
|
|
|
|
|
|
|
if (isNonEmptyViewport) {
|
|
|
|
|
dirtyViewportPanes.push({
|
2020-03-09 19:03:23 +00:00
|
|
|
StudyInstanceUID: viewportPane.StudyInstanceUID,
|
|
|
|
|
displaySetInstanceUID: viewportPane.displaySetInstanceUID,
|
2019-10-23 11:27:22 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
continue;
|
2019-05-28 19:02:33 -04:00
|
|
|
}
|
|
|
|
|
|
2019-10-23 11:27:22 -04:00
|
|
|
const foundDisplaySet =
|
|
|
|
|
displaySets.find(
|
2019-05-27 11:31:39 -04:00
|
|
|
ds =>
|
2019-10-23 11:27:22 -04:00
|
|
|
!dirtyViewportPanes.some(
|
2020-03-09 19:03:23 +00:00
|
|
|
v => v.displaySetInstanceUID === ds.displaySetInstanceUID
|
2019-05-27 11:31:39 -04:00
|
|
|
)
|
2019-10-23 11:27:22 -04:00
|
|
|
) || displaySets[displaySets.length - 1];
|
2019-05-28 19:02:33 -04:00
|
|
|
|
2019-10-23 11:27:22 -04:00
|
|
|
dirtyViewportPanes.push(foundDisplaySet);
|
|
|
|
|
}
|
2019-10-19 17:00:51 -04:00
|
|
|
|
2019-10-23 11:27:22 -04:00
|
|
|
dirtyViewportPanes.forEach((vp, i) => {
|
2020-03-09 19:03:23 +00:00
|
|
|
if (vp && vp.StudyInstanceUID) {
|
2019-10-23 11:27:22 -04:00
|
|
|
this.setViewportData({
|
|
|
|
|
viewportIndex: i,
|
2020-03-09 19:03:23 +00:00
|
|
|
StudyInstanceUID: vp.StudyInstanceUID,
|
|
|
|
|
displaySetInstanceUID: vp.displaySetInstanceUID,
|
2019-10-23 11:27:22 -04:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
2019-05-29 08:39:54 -04:00
|
|
|
};
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-10-11 12:03:59 -04:00
|
|
|
setViewportData = ({
|
|
|
|
|
viewportIndex,
|
2020-03-09 19:03:23 +00:00
|
|
|
StudyInstanceUID,
|
|
|
|
|
displaySetInstanceUID,
|
2019-10-11 12:03:59 -04:00
|
|
|
}) => {
|
2019-01-31 05:55:05 -02:00
|
|
|
const displaySet = this.findDisplaySet(
|
|
|
|
|
this.props.studies,
|
2020-03-09 19:03:23 +00:00
|
|
|
StudyInstanceUID,
|
|
|
|
|
displaySetInstanceUID
|
2019-05-29 08:39:54 -04:00
|
|
|
);
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-05-29 08:39:54 -04:00
|
|
|
this.props.setViewportSpecificData(viewportIndex, displaySet);
|
|
|
|
|
};
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
render() {
|
2019-10-23 11:27:22 -04:00
|
|
|
const { viewportSpecificData } = this.props;
|
2020-03-24 00:01:39 +05:30
|
|
|
const viewportData = values(viewportSpecificData);
|
2019-10-23 11:27:22 -04:00
|
|
|
|
2019-01-17 17:00:21 +01:00
|
|
|
return (
|
|
|
|
|
<div className="ViewerMain">
|
2019-06-06 11:11:26 -03:00
|
|
|
{this.state.displaySets.length && (
|
2019-10-11 12:03:59 -04:00
|
|
|
<ConnectedViewportGrid
|
2019-07-04 14:09:13 -04:00
|
|
|
studies={this.props.studies}
|
2019-10-23 11:27:22 -04:00
|
|
|
viewportData={viewportData}
|
2019-07-04 14:09:13 -04:00
|
|
|
setViewportData={this.setViewportData}
|
2019-06-06 11:11:26 -03:00
|
|
|
>
|
|
|
|
|
{/* Children to add to each viewport that support children */}
|
2019-10-11 12:03:59 -04:00
|
|
|
</ConnectedViewportGrid>
|
2019-06-06 11:11:26 -03:00
|
|
|
)}
|
2019-01-17 17:00:21 +01:00
|
|
|
</div>
|
2019-05-29 08:39:54 -04:00
|
|
|
);
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
2019-05-02 17:12:06 -04:00
|
|
|
// Clear the entire viewport specific data
|
2019-05-29 08:39:54 -04:00
|
|
|
const { viewportSpecificData } = this.props;
|
2019-05-27 11:31:39 -04:00
|
|
|
Object.keys(viewportSpecificData).forEach(viewportIndex => {
|
2019-05-29 08:39:54 -04:00
|
|
|
this.props.clearViewportSpecificData(viewportIndex);
|
|
|
|
|
});
|
2019-05-02 17:12:06 -04:00
|
|
|
|
2019-06-03 13:22:05 -04:00
|
|
|
// TODO: These don't have to be viewer specific?
|
|
|
|
|
// Could qualify for other routes?
|
|
|
|
|
// hotkeys.destroy();
|
2019-05-31 22:09:05 -04:00
|
|
|
|
2019-01-17 17:00:21 +01:00
|
|
|
// Remove beforeUnload event handler...
|
|
|
|
|
//window.removeEventListener('beforeunload', unloadHandlers.beforeUnload);
|
|
|
|
|
// Destroy the synchronizer used to update reference lines
|
2019-02-06 14:46:06 +01:00
|
|
|
//OHIF.viewer.updateImageSynchronizer.destroy();
|
2019-01-17 17:00:21 +01:00
|
|
|
// TODO: Instruct all plugins to clean up themselves
|
|
|
|
|
//
|
|
|
|
|
// Clear references to all stacks in the StackManager
|
|
|
|
|
//StackManager.clearStacks();
|
|
|
|
|
// @TypeSafeStudies
|
|
|
|
|
// Clears OHIF.viewer.Studies collection
|
|
|
|
|
//OHIF.viewer.Studies.removeAll();
|
|
|
|
|
// @TypeSafeStudies
|
|
|
|
|
// Clears OHIF.viewer.StudyMetadataList collection
|
|
|
|
|
//OHIF.viewer.StudyMetadataList.removeAll();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-29 08:39:54 -04:00
|
|
|
export default ViewerMain;
|