Files
ohif-viewer/platform/viewer/src/connectedComponents/ViewerMain.js
T

192 lines
5.4 KiB
JavaScript
Raw Normal View History

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);
class ViewerMain extends Component {
static propTypes = {
2019-05-31 22:09:05 -04:00
activeViewportIndex: PropTypes.number.isRequired,
studies: PropTypes.array,
viewportSpecificData: PropTypes.object.isRequired,
layout: PropTypes.object.isRequired,
2019-05-02 17:12:06 -04:00
setViewportSpecificData: PropTypes.func.isRequired,
clearViewportSpecificData: PropTypes.func.isRequired,
2019-05-29 08:39:54 -04:00
};
constructor(props) {
2019-05-29 08:39:54 -04:00
super(props);
2019-05-02 17:12:06 -04:00
this.state = {
displaySets: [],
2019-05-29 08:39:54 -04:00
};
}
getDisplaySets(studies) {
2019-05-29 08:39:54 -04:00
const displaySets = [];
studies.forEach(study => {
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-05-29 08:39:54 -04:00
return displaySets;
}
findDisplaySet(studies, StudyInstanceUID, displaySetInstanceUID) {
const study = studies.find(study => {
return study.StudyInstanceUID === StudyInstanceUID;
2019-05-29 08:39:54 -04:00
});
if (!study) {
2019-05-29 08:39:54 -04:00
return;
}
return study.displaySets.find(displaySet => {
return displaySet.displaySetInstanceUID === displaySetInstanceUID;
2019-05-29 08:39:54 -04: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
if (this.props.studies) {
const displaySets = this.getDisplaySets(this.props.studies);
this.setState({ displaySets }, this.fillEmptyViewportPanes);
}
}
componentDidUpdate(prevProps) {
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)
) {
const displaySets = this.getDisplaySets(this.props.studies);
this.setState({ displaySets }, this.fillEmptyViewportPanes);
}
}
fillEmptyViewportPanes = () => {
// TODO: Here is the entry point for filling viewports on load.
const dirtyViewportPanes = [];
2019-05-29 08:39:54 -04:00
const { layout, viewportSpecificData } = this.props;
const { displaySets } = this.state;
2019-05-02 17:12:06 -04:00
if (!displaySets || !displaySets.length) {
return;
}
2019-10-18 15:29:00 -03:00
for (let i = 0; i < layout.viewports.length; i++) {
const viewportPane = viewportSpecificData[i];
const isNonEmptyViewport =
viewportPane &&
viewportPane.StudyInstanceUID &&
viewportPane.displaySetInstanceUID;
if (isNonEmptyViewport) {
dirtyViewportPanes.push({
StudyInstanceUID: viewportPane.StudyInstanceUID,
displaySetInstanceUID: viewportPane.displaySetInstanceUID,
});
continue;
}
const foundDisplaySet =
displaySets.find(
ds =>
!dirtyViewportPanes.some(
v => v.displaySetInstanceUID === ds.displaySetInstanceUID
)
) || displaySets[displaySets.length - 1];
dirtyViewportPanes.push(foundDisplaySet);
}
dirtyViewportPanes.forEach((vp, i) => {
if (vp && vp.StudyInstanceUID) {
this.setViewportData({
viewportIndex: i,
StudyInstanceUID: vp.StudyInstanceUID,
displaySetInstanceUID: vp.displaySetInstanceUID,
});
}
});
2019-05-29 08:39:54 -04:00
};
2019-10-11 12:03:59 -04:00
setViewportData = ({
viewportIndex,
StudyInstanceUID,
displaySetInstanceUID,
2019-10-11 12:03:59 -04:00
}) => {
const displaySet = this.findDisplaySet(
this.props.studies,
StudyInstanceUID,
displaySetInstanceUID
2019-05-29 08:39:54 -04:00
);
2019-05-29 08:39:54 -04:00
this.props.setViewportSpecificData(viewportIndex, displaySet);
};
render() {
const { viewportSpecificData } = this.props;
2020-03-24 00:01:39 +05:30
const viewportData = values(viewportSpecificData);
return (
<div className="ViewerMain">
{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}
viewportData={viewportData}
2019-07-04 14:09:13 -04:00
setViewportData={this.setViewportData}
>
{/* Children to add to each viewport that support children */}
2019-10-11 12:03:59 -04:00
</ConnectedViewportGrid>
)}
</div>
2019-05-29 08:39:54 -04: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;
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
// Remove beforeUnload event handler...
//window.removeEventListener('beforeunload', unloadHandlers.beforeUnload);
// Destroy the synchronizer used to update reference lines
//OHIF.viewer.updateImageSynchronizer.destroy();
// 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;