wip on react transition 2

This commit is contained in:
Erik Ziegler 2018-11-30 14:28:15 -05:00
parent 7425c2beb8
commit f821ea2b80
9 changed files with 51 additions and 113 deletions

View File

@ -1,6 +1,8 @@
import viewer from './viewer/index.js'; import viewer from './viewer/index.js';
export { const components = {
viewer viewer
}; };
export default components;

View File

@ -14,6 +14,7 @@ import './CornerstoneViewport.css';
import cloneDeep from 'lodash.clonedeep'; import cloneDeep from 'lodash.clonedeep';
import debounce from 'lodash.debounce'; import debounce from 'lodash.debounce';
import {StackManager} from "../../lib/StackManager";
const EVENT_RESIZE = 'resize'; const EVENT_RESIZE = 'resize';
const loadIndicatorDelay = 45; const loadIndicatorDelay = 45;
@ -42,11 +43,22 @@ class CornerstoneViewport extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
const stack = props.viewportData.stack; const { displaySetInstanceUid, studyInstanceUid } = this.props.viewportData;
// Create shortcut to displaySet
const study = OHIF.viewer.Studies.findBy({ studyInstanceUid });
const displaySet = study.displaySets.find(set => {
return set.displaySetInstanceUid === displaySetInstanceUid;
});
// Get stack from Stack Manager
const stack = StackManager.findOrCreateStack(study, displaySet);
// TODO: Allow viewport as a prop // TODO: Allow viewport as a prop
this.state = { this.state = {
stack, stack,
displaySetInstanceUid,
imageId: stack.imageIds[0], imageId: stack.imageIds[0],
viewportHeight: '100%', viewportHeight: '100%',
isLoading: true, isLoading: true,
@ -388,10 +400,10 @@ class CornerstoneViewport extends Component {
componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {
// TODO: Add a real object shallow comparison here? // TODO: Add a real object shallow comparison here?
if ( if (
this.state.stack.imageIds[0] !== this.props.viewportData.stack.imageIds[0] this.state.displaySetInstanceUid !== this.props.viewportData.displaySetInstanceUid
) { ) {
this.setState({ this.setState({
stack: this.props.viewportData.stack displaySetInstanceUid: this.props.viewportData.displaySetInstanceUid
}); });
const stackData = cornerstoneTools.getToolState(this.element, 'stack'); const stackData = cornerstoneTools.getToolState(this.element, 'stack');
@ -413,7 +425,7 @@ class CornerstoneViewport extends Component {
const imageId = currentStack.imageIds[currentStack.currentImageIdIndex]; const imageId = currentStack.imageIds[currentStack.currentImageIdIndex];
cornerstone.loadAndCacheImage(imageId).then(image => { /*cornerstone.loadAndCacheImage(imageId).then(image => {
try { try {
cornerstone.getEnabledElement(this.element); cornerstone.getEnabledElement(this.element);
} catch (error) { } catch (error) {
@ -426,7 +438,7 @@ class CornerstoneViewport extends Component {
cornerstoneTools.stackPrefetch.disable(this.element); cornerstoneTools.stackPrefetch.disable(this.element);
cornerstoneTools.stackPrefetch.enable(this.element); cornerstoneTools.stackPrefetch.enable(this.element);
}); });*/
} }
if (this.props.activeTool !== prevProps.activeTool) { if (this.props.activeTool !== prevProps.activeTool) {
@ -438,54 +450,6 @@ class CornerstoneViewport extends Component {
isTouchActive: true isTouchActive: true
}); });
} }
if (this.props.currentLesion !== prevProps.currentLesion) {
const currentToolData = this.props.toolData[this.props.currentLesion - 1];
if (currentToolData) {
const { imageId } = currentToolData;
const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState();
const toolData = toolState[imageId][currentToolData.toolType].data;
toolData.forEach(data => {
if (data._id === currentToolData._id) {
data.active = true;
} else {
data.active = false;
}
});
cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(
toolState
);
if (this.state.imageId === imageId) {
cornerstone.setViewport(this.element, currentToolData.viewport);
cornerstone.updateImage(this.element);
} else {
cornerstone.loadAndCacheImage(imageId).then(image => {
try {
cornerstone.getEnabledElement(this.element);
} catch (error) {
// Handle cases where the user ends the session before the image is displayed.
console.error(error);
return;
}
cornerstone.displayImage(
this.element,
image,
currentToolData.viewport
);
this.setState({
imageId
});
});
}
} else {
cornerstone.updateImage(this.element);
}
}
} }
setActiveTool = activeTool => { setActiveTool = activeTool => {
@ -636,9 +600,9 @@ class CornerstoneViewport extends Component {
} }
CornerstoneViewport.propTypes = { CornerstoneViewport.propTypes = {
measurementsAddedOrRemoved: PropTypes.func.isRequired, measurementsAddedOrRemoved: PropTypes.func,
measurementsChanged: PropTypes.func.isRequired, measurementsChanged: PropTypes.func,
activeTool: PropTypes.string.isRequired, activeTool: PropTypes.string,
viewportData: PropTypes.object.isRequired viewportData: PropTypes.object.isRequired
}; };

View File

@ -74,40 +74,44 @@ class GridLayout extends Component {
viewportData = viewportData.slice(0, numViewports); viewportData = viewportData.slice(0, numViewports);
} }
const viewports = viewportData.map((viewport, index) => { const viewports = viewportData.map((data, index) => {
const className = `viewportContainer ${this.getClass(index)} ${getActiveClass(index)}`; const className = `viewportContainer ${this.getClass(index)} ${this.getActiveClass(index)}`;
const styles = { const styles = {
height: `${height}%`, height: `${height}%`,
width: `${width}%`, width: `${width}%`,
}; };
const cornerstoneViewport = (viewport) => ( const cornerstoneViewport = (data) => (
<div className="removable"> <div className="removable">
<CornerstoneViewport/> <CornerstoneViewport viewportData={data}/>
</div> </div>
); );
const pluginViewport = (viewport) => ( const pluginViewport = (data) => (
<div className={`viewport-plugin-${viewport.plugin}`} style="height:100%; width: 100%"> <div className={`viewport-plugin-${data.plugin}`} style="height:100%; width: 100%">
</div> </div>
); );
return ( return (
<div className={className} style={styles}> <div key={index} className={className} style={styles}>
{viewport.plugin === 'cornerstone' ? {data.plugin === 'cornerstone' ?
cornerstoneViewport(viewport) : cornerstoneViewport(data) :
pluginViewport(viewport) pluginViewport(data)
} }
{/*{>seriesQuickSwitch (clone this viewport=viewport viewportIndex=@index)}*/} {/*{>seriesQuickSwitch (clone this viewport=viewport viewportIndex=@index)}*/}
</div> </div>
) )
}) })
const layoutClass = `layout-${rows}-${columns}`;
return ( return (
<div id='imageViewerViewports'> <div id='imageViewerViewports'>
<div id='layoutManagerTarget' className={layoutClass}>
{ viewports } { viewports }
</div> </div>
</div>
) )
} }
} }

View File

@ -89,7 +89,7 @@ class LoadingIndicator extends Component {
return (<> return (<>
<div className="imageViewerLoadingIndicator loadingIndicator"> <div className="imageViewerLoadingIndicator loadingIndicator">
<div className="indicatorContents"> <div className="indicatorContents">
<p>Loading... <i className="fa fa-spin fa-circle-o-notch fa-fw"></i> {{percComplete}}</p> <p>Loading... <i className="fa fa-spin fa-circle-o-notch fa-fw"></i> {percComplete}</p>
</div> </div>
</div> </div>
<div className="imageViewerErrorLoadingIndicator loadingIndicator"> <div className="imageViewerErrorLoadingIndicator loadingIndicator">
@ -104,7 +104,7 @@ class LoadingIndicator extends Component {
} }
LoadingIndicator.propTypes = { LoadingIndicator.propTypes = {
percentComplete: PropTypes.number.isRequired percentComplete: PropTypes.number
}; };
export default LoadingIndicator; export default LoadingIndicator;

View File

@ -59,9 +59,8 @@ class ViewerMain extends Component {
Session.set('OHIFViewerMainRendered', Math.random()); Session.set('OHIFViewerMainRendered', Math.random());
} }
setContents(component, data) { setContents(Component, props) {
const Comp = this.props.component; const contents = (<Component {...props}/>);
const contents = (<Comp data={data}/>);
this.setState({ this.setState({
contents contents

View File

@ -6,7 +6,7 @@ import ImageScrollbar from './ImageScrollbar.js';
import ToolContextMenu from './ToolContextMenu.js'; import ToolContextMenu from './ToolContextMenu.js';
import ViewportOverlay from './ViewportOverlay.js'; import ViewportOverlay from './ViewportOverlay.js';
export { const viewer = {
ViewerMain, ViewerMain,
GridLayout, GridLayout,
LoadingIndicator, LoadingIndicator,
@ -14,4 +14,7 @@ export {
ImageScrollbar, ImageScrollbar,
ToolContextMenu, ToolContextMenu,
ViewportOverlay, ViewportOverlay,
test: 'test2'
}; };
export default viewer;

View File

@ -8,7 +8,7 @@ import { $ } from 'meteor/jquery';
import { OHIF } from 'meteor/ohif:core'; import { OHIF } from 'meteor/ohif:core';
import viewer from '../../components/viewer'; import viewerComponents from '../../components/viewer/index.js';
const PLUGIN_CORNERSTONE = 'cornerstone'; const PLUGIN_CORNERSTONE = 'cornerstone';
@ -27,7 +27,7 @@ Meteor.startup(() => {
export class LayoutManager { export class LayoutManager {
/** /**
* Constructor: initializes a Layout Manager object. * Constructor: initializes a Layout Manager object.
* @param {DOM element} parentNode DOM element representing the parent node, which wraps the Layout Manager content * @param {Function}
* @param {Array} studies Array of studies objects that will be rendered in the Viewer. Each object will be rendered in a div.imageViewerViewport * @param {Array} studies Array of studies objects that will be rendered in the Viewer. Each object will be rendered in a div.imageViewerViewport
*/ */
constructor(setContents, studies) { constructor(setContents, studies) {
@ -35,15 +35,13 @@ export class LayoutManager {
this.setContents = setContents; this.setContents = setContents;
this.observer = new Tracker.Dependency(); this.observer = new Tracker.Dependency();
this.parentNode = parentNode;
this.studies = studies; this.studies = studies;
this.viewportData = []; this.viewportData = [];
this.layoutTemplate = viewer.GridLayout; this.layoutTemplate = viewerComponents.GridLayout;
this.layoutProps = { this.layoutProps = {
rows: 1, rows: 1,
columns: 1 columns: 1
}; };
this.layoutClassName = this.getLayoutClass();
this.isZoomed = false; this.isZoomed = false;
@ -148,36 +146,6 @@ export class LayoutManager {
} }
} }
/**
* Returns the name of the class to be added to the parentNode
* @return {string} class name following the pattern layout-<rows>-<columns>. Ex: layout-1-1, layout-2-2
*/
getLayoutClass() {
const { rows, columns } = this.layoutProps;
const layoutClass = `layout-${rows}-${columns}`;
return layoutClass;
}
/**
* Add a class to the parentNode based on the layout configuration.
* This function is helpful to style the layout of viewports.
* Besides that, each inner div.viewportContainer will have helpful classes
* as well. See viewer/components/gridLayout/ component in this ohif-viewerbase package.
*/
updateLayoutClass() {
const newLayoutClass = this.getLayoutClass();
// If layout has changed, change its class
if (this.layoutClassName !== newLayoutClass) {
this.parentNode.classList.remove(this.layoutClassName);
}
this.layoutClassName = newLayoutClass;
this.parentNode.classList.add(newLayoutClass);
}
/** /**
* Updates the grid with the new layout props. * Updates the grid with the new layout props.
* It iterates over all viewportData to render the studies * It iterates over all viewportData to render the studies
@ -212,9 +180,7 @@ export class LayoutManager {
data.viewportData.push(viewportDataAndLayoutProps); data.viewportData.push(viewportDataAndLayoutProps);
}); });
this.updateLayoutClass(); const component = viewerComponents.GridLayout;
const component = GridLayout;
this.setContents(component, data) this.setContents(component, data)
this.updateSession(); this.updateSession();
@ -318,7 +284,7 @@ export class LayoutManager {
columns: 1 columns: 1
}; };
const component = GridLayout; const component = viewerComponents.GridLayout;
this.setContents(component, data) this.setContents(component, data)
this.isZoomed = true; this.isZoomed = true;