2019-05-27 17:09:11 +02:00
|
|
|
import { Component } from 'react';
|
|
|
|
|
import React from 'react';
|
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
|
import { OHIF } from 'ohif-core';
|
|
|
|
|
import ConnectedLayoutManager from './ConnectedLayoutManager.js';
|
|
|
|
|
import './ViewerMain.css';
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
class ViewerMain extends Component {
|
|
|
|
|
static propTypes = {
|
2019-05-02 23:12:06 +02:00
|
|
|
studies: PropTypes.array.isRequired,
|
|
|
|
|
setViewportSpecificData: PropTypes.func.isRequired,
|
2019-05-27 17:09:11 +02:00
|
|
|
clearViewportSpecificData: PropTypes.func.isRequired
|
|
|
|
|
};
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-01-31 08:55:05 +01:00
|
|
|
constructor(props) {
|
2019-05-27 17:09:11 +02:00
|
|
|
super(props);
|
|
|
|
|
OHIF.hotkeysUtil.setup('viewer');
|
2019-05-02 23:12:06 +02:00
|
|
|
|
|
|
|
|
this.state = {
|
2019-05-27 17:09:11 +02:00
|
|
|
displaySets: []
|
2019-05-02 23:12:06 +02:00
|
|
|
}
|
2019-01-31 08:55:05 +01:00
|
|
|
}
|
|
|
|
|
|
2019-01-30 10:34:55 +01:00
|
|
|
getDisplaySets(studies) {
|
2019-05-27 17:09:11 +02:00
|
|
|
const displaySets = [];
|
2019-01-31 08:55:05 +01:00
|
|
|
studies.forEach(study => {
|
2019-01-17 17:00:21 +01:00
|
|
|
study.displaySets.forEach(dSet => {
|
2019-05-02 23:12:06 +02:00
|
|
|
if (!dSet.plugin) {
|
2019-05-27 17:09:11 +02:00
|
|
|
dSet.plugin = 'cornerstone';
|
2019-05-02 23:12:06 +02:00
|
|
|
}
|
2019-05-27 17:09:11 +02:00
|
|
|
displaySets.push(dSet);
|
|
|
|
|
});
|
|
|
|
|
});
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-05-27 17:09:11 +02:00
|
|
|
return displaySets;
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
findDisplaySet(studies, studyInstanceUid, displaySetInstanceUid) {
|
|
|
|
|
const study = studies.find(study => {
|
2019-05-27 17:09:11 +02:00
|
|
|
return study.studyInstanceUid === studyInstanceUid;
|
|
|
|
|
});
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
if (!study) {
|
2019-05-27 17:09:11 +02:00
|
|
|
return;
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return study.displaySets.find(displaySet => {
|
2019-05-27 17:09:11 +02:00
|
|
|
return displaySet.displaySetInstanceUid === displaySetInstanceUid;
|
|
|
|
|
});
|
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-05-27 17:09:11 +02:00
|
|
|
const displaySets = this.getDisplaySets(this.props.studies);
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
this.setState({
|
2019-05-27 17:09:11 +02:00
|
|
|
displaySets
|
|
|
|
|
});
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
2019-05-02 23:12:06 +02:00
|
|
|
getViewportData = () => {
|
2019-05-27 17:09:11 +02:00
|
|
|
const viewportData = [];
|
|
|
|
|
const { layout, viewportSpecificData } = this.props;
|
2019-05-02 23:12:06 +02:00
|
|
|
|
2019-05-27 17:09:11 +02:00
|
|
|
for (let viewportIndex = 0; viewportIndex < layout.viewports.length; viewportIndex++) {
|
|
|
|
|
let displaySet = viewportSpecificData[viewportIndex];
|
2019-05-02 23:12:06 +02:00
|
|
|
|
|
|
|
|
// If the viewport is empty, get one available in study
|
|
|
|
|
if (!displaySet || !displaySet.displaySetInstanceUid) {
|
2019-05-27 17:09:11 +02:00
|
|
|
const { displaySets } = this.state;
|
|
|
|
|
displaySet = displaySets.find(ds => !viewportData.some(v => v.displaySetInstanceUid === ds.displaySetInstanceUid));
|
2019-05-02 23:12:06 +02:00
|
|
|
}
|
|
|
|
|
|
2019-05-27 17:09:11 +02:00
|
|
|
viewportData.push(displaySet);
|
2019-05-02 23:12:06 +02:00
|
|
|
}
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-05-27 17:09:11 +02:00
|
|
|
return viewportData;
|
|
|
|
|
};
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-05-02 23:12:06 +02:00
|
|
|
setViewportData = ({ viewportIndex, item }) => {
|
2019-01-31 08:55:05 +01:00
|
|
|
const displaySet = this.findDisplaySet(
|
|
|
|
|
this.props.studies,
|
|
|
|
|
item.studyInstanceUid,
|
|
|
|
|
item.displaySetInstanceUid
|
2019-05-27 17:09:11 +02:00
|
|
|
);
|
2019-01-17 17:00:21 +01:00
|
|
|
|
2019-05-27 17:09:11 +02:00
|
|
|
this.props.setViewportSpecificData(viewportIndex, displaySet);
|
|
|
|
|
};
|
2019-01-17 17:00:21 +01:00
|
|
|
|
|
|
|
|
render() {
|
|
|
|
|
return (
|
|
|
|
|
<div className="ViewerMain">
|
|
|
|
|
<ConnectedLayoutManager
|
|
|
|
|
studies={this.props.studies}
|
2019-05-02 23:12:06 +02:00
|
|
|
viewportData={this.getViewportData()}
|
2019-01-17 17:00:21 +01:00
|
|
|
setViewportData={this.setViewportData}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2019-05-27 17:09:11 +02:00
|
|
|
);
|
2019-01-17 17:00:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
2019-05-02 23:12:06 +02:00
|
|
|
// Clear the entire viewport specific data
|
2019-05-27 17:09:11 +02:00
|
|
|
const { viewportSpecificData } = this.props;
|
|
|
|
|
Object.keys(viewportSpecificData).forEach((viewportIndex) => {
|
|
|
|
|
this.props.clearViewportSpecificData(viewportIndex);
|
|
|
|
|
});
|
2019-05-02 23:12:06 +02: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-27 17:09:11 +02:00
|
|
|
export default ViewerMain;
|