* Update props for new react-cornerstone-viewport implementation * Create an preRegistration hook for the cornerstone extension to setup cornerstone tools (takes configuration) * Isolate measurements panel logic * reorder extension registration * remove unused setupTools * Restore CINE connection * fix stack prefetcher toggling * Cleanup OHIFCornerstoneViewport props * updated yarn lock * bust yarn.lock to get updated react-cornerstone-viewport * fix review comment; us isActive to better show it's influence on prefetch * refactor: remove pass through method * review performance optimization * review; comment out unused variable * shift tool under correct comment * Use alternative csTools config, if provided * Note regarding config options
104 lines
2.9 KiB
JavaScript
104 lines
2.9 KiB
JavaScript
import CornerstoneViewport from 'react-cornerstone-viewport';
|
|
import OHIF from '@ohif/core';
|
|
import { connect } from 'react-redux';
|
|
import throttle from 'lodash.throttle';
|
|
|
|
const { setViewportActive, setViewportSpecificData } = OHIF.redux.actions;
|
|
const {
|
|
onAdded,
|
|
onRemoved,
|
|
onModified,
|
|
} = OHIF.measurements.MeasurementHandlers;
|
|
|
|
// TODO: Transition to enums for the action names so that we can ensure they stay up to date
|
|
// everywhere they're used.
|
|
const MEASUREMENT_ACTION_MAP = {
|
|
added: onAdded,
|
|
removed: onRemoved,
|
|
modified: throttle(event => {
|
|
return onModified(event);
|
|
}, 300),
|
|
};
|
|
|
|
const mapStateToProps = (state, ownProps) => {
|
|
let dataFromStore;
|
|
|
|
// TODO: This may not be updated anymore :thinking:
|
|
if (state.extensions && state.extensions.cornerstone) {
|
|
dataFromStore = state.extensions.cornerstone;
|
|
}
|
|
|
|
// If this is the active viewport, enable prefetching.
|
|
const { viewportIndex } = ownProps; //.viewportData;
|
|
const isActive = viewportIndex === state.viewports.activeViewportIndex;
|
|
const viewportSpecificData =
|
|
state.viewports.viewportSpecificData[viewportIndex] || {};
|
|
|
|
// CINE
|
|
let isPlaying = false;
|
|
let frameRate = 24;
|
|
|
|
if (viewportSpecificData && viewportSpecificData.cine) {
|
|
const cine = viewportSpecificData.cine;
|
|
|
|
isPlaying = cine.isPlaying === true;
|
|
frameRate = cine.cineFrameRate || frameRate;
|
|
}
|
|
|
|
return {
|
|
// layout: state.viewports.layout,
|
|
isActive,
|
|
// TODO: Need a cleaner and more versatile way.
|
|
// Currently justing using escape hatch + commands
|
|
// activeTool: activeButton && activeButton.command,
|
|
...dataFromStore,
|
|
isStackPrefetchEnabled: isActive,
|
|
isPlaying,
|
|
frameRate,
|
|
//stack: viewportSpecificData.stack,
|
|
// viewport: viewportSpecificData.viewport,
|
|
};
|
|
};
|
|
|
|
const mapDispatchToProps = (dispatch, ownProps) => {
|
|
const { viewportIndex } = ownProps;
|
|
|
|
return {
|
|
setViewportActive: () => {
|
|
dispatch(setViewportActive(viewportIndex));
|
|
},
|
|
|
|
setViewportSpecificData: data => {
|
|
dispatch(setViewportSpecificData(viewportIndex, data));
|
|
},
|
|
|
|
/**
|
|
* Our component "enables" the underlying dom element on "componentDidMount"
|
|
* It listens for that event, and then emits the enabledElement. We can grab
|
|
* a reference to it here, to make playing with cornerstone's native methods
|
|
* easier.
|
|
*/
|
|
onElementEnabled: event => {
|
|
const enabledElement = event.detail.element;
|
|
dispatch(
|
|
setViewportSpecificData(viewportIndex, {
|
|
// TODO: Hack to make sure our plugin info is available from the outset
|
|
plugin: 'cornerstone',
|
|
dom: enabledElement,
|
|
})
|
|
);
|
|
},
|
|
|
|
onMeasurementsChanged: (event, action) => {
|
|
return MEASUREMENT_ACTION_MAP[action](event);
|
|
},
|
|
};
|
|
};
|
|
|
|
const ConnectedCornerstoneViewport = connect(
|
|
mapStateToProps,
|
|
mapDispatchToProps
|
|
)(CornerstoneViewport);
|
|
|
|
export default ConnectedCornerstoneViewport;
|