Merge pull request #1831 from OHIF/feat/ohif-203
OHIF-203: Add new viewport overlay
This commit is contained in:
commit
d5d219c271
@ -12,8 +12,19 @@ const OHIFCornerstoneViewport = props => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
function getViewportModule({ commandsManager }) {
|
function getViewportModule({ servicesManager }) {
|
||||||
return [{ name: 'cornerstone-tracked', component: OHIFCornerstoneViewport }];
|
const ExtendedOHIFCornerstoneSRViewport = props => {
|
||||||
|
const { ToolBarService } = servicesManager.services;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<OHIFCornerstoneViewport
|
||||||
|
ToolBarService={ToolBarService}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return [{ name: 'cornerstone-tracked', component: ExtendedOHIFCornerstoneSRViewport }];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default getViewportModule;
|
export default getViewportModule;
|
||||||
|
|||||||
@ -12,6 +12,8 @@ import {
|
|||||||
} from '@ohif/ui';
|
} from '@ohif/ui';
|
||||||
import { useTrackedMeasurements } from './../getContextModule';
|
import { useTrackedMeasurements } from './../getContextModule';
|
||||||
|
|
||||||
|
import ViewportOverlay from './ViewportOverlay';
|
||||||
|
|
||||||
const { formatDate } = utils;
|
const { formatDate } = utils;
|
||||||
|
|
||||||
// TODO -> Get this list from the list of tracked measurements.
|
// TODO -> Get this list from the list of tracked measurements.
|
||||||
@ -38,6 +40,7 @@ function TrackedCornerstoneViewport({
|
|||||||
dataSource,
|
dataSource,
|
||||||
displaySet,
|
displaySet,
|
||||||
viewportIndex,
|
viewportIndex,
|
||||||
|
ToolBarService
|
||||||
}) {
|
}) {
|
||||||
const [trackedMeasurements] = useTrackedMeasurements();
|
const [trackedMeasurements] = useTrackedMeasurements();
|
||||||
const [{ activeViewportIndex, viewports }] = useViewportGrid();
|
const [{ activeViewportIndex, viewports }] = useViewportGrid();
|
||||||
@ -280,7 +283,15 @@ function TrackedCornerstoneViewport({
|
|||||||
isStackPrefetchEnabled={true} // todo
|
isStackPrefetchEnabled={true} // todo
|
||||||
isPlaying={false}
|
isPlaying={false}
|
||||||
frameRate={24}
|
frameRate={24}
|
||||||
isOverlayVisible={false}
|
isOverlayVisible={true}
|
||||||
|
viewportOverlayComponent={props => {
|
||||||
|
return (
|
||||||
|
<ViewportOverlay
|
||||||
|
{...props}
|
||||||
|
activeTools={ToolBarService.getActiveTools()}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<div className="absolute w-full">
|
<div className="absolute w-full">
|
||||||
{viewportDialogState.viewportIndex === viewportIndex && (
|
{viewportDialogState.viewportIndex === viewportIndex && (
|
||||||
|
|||||||
@ -0,0 +1,81 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import cornerstone from 'cornerstone-core';
|
||||||
|
import classnames from 'classnames';
|
||||||
|
|
||||||
|
const ViewportOverlay = ({
|
||||||
|
imageId,
|
||||||
|
scale,
|
||||||
|
windowWidth,
|
||||||
|
windowCenter,
|
||||||
|
imageIndex,
|
||||||
|
stackSize,
|
||||||
|
activeTools
|
||||||
|
}) => {
|
||||||
|
const topLeft = 'top-viewport left-viewport';
|
||||||
|
const topRight = 'top-viewport right-viewport-scrollbar';
|
||||||
|
const bottomRight = 'bottom-viewport right-viewport-scrollbar';
|
||||||
|
const bottomLeft = 'bottom-viewport left-viewport';
|
||||||
|
const overlay = 'absolute pointer-events-none';
|
||||||
|
|
||||||
|
const isZoomActive = activeTools.includes('Zoom');
|
||||||
|
const isWwwcActive = activeTools.includes('Wwwc');
|
||||||
|
|
||||||
|
if (!imageId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const generalImageModule = cornerstone.metaData.get('generalImageModule', imageId) || {};
|
||||||
|
const { instanceNumber } = generalImageModule;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="text-primary-light">
|
||||||
|
<div className={classnames(overlay, topLeft)}>
|
||||||
|
{isZoomActive && (
|
||||||
|
<div className="flex flex-row">
|
||||||
|
<span className="mr-1">Zoom:</span>
|
||||||
|
<span className="font-thin">{scale.toFixed(2)}x</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{isWwwcActive && (
|
||||||
|
<div className="flex flex-row">
|
||||||
|
<span className="mr-1">W:</span>
|
||||||
|
<span className="font-thin ml-1 mr-2">{windowWidth.toFixed(0)}</span>
|
||||||
|
<span className="mr-1">L:</span>
|
||||||
|
<span className="font-thin ml-1">{windowCenter.toFixed(0)}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={classnames(overlay, topRight)}>
|
||||||
|
{stackSize > 1 && (
|
||||||
|
<div className="flex flex-row">
|
||||||
|
<span className="mr-1">I:</span>
|
||||||
|
<span className="font-thin">
|
||||||
|
{`${instanceNumber}/${stackSize}`}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={classnames(overlay, bottomRight)}>
|
||||||
|
</div>
|
||||||
|
<div className={classnames(overlay, bottomLeft)}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ViewportOverlay.propTypes = {
|
||||||
|
scale: PropTypes.number.isRequired,
|
||||||
|
windowWidth: PropTypes.number.isRequired,
|
||||||
|
windowCenter: PropTypes.number.isRequired,
|
||||||
|
imageId: PropTypes.string.isRequired,
|
||||||
|
imageIndex: PropTypes.number.isRequired,
|
||||||
|
stackSize: PropTypes.number.isRequired,
|
||||||
|
activeTools: PropTypes.arrayOf(PropTypes.string)
|
||||||
|
};
|
||||||
|
|
||||||
|
ViewportOverlay.defaultProps = {
|
||||||
|
activeTools: []
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ViewportOverlay;
|
||||||
@ -27,6 +27,15 @@ export default class ToolBarService {
|
|||||||
return this.buttons;
|
return this.buttons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getActiveTools() {
|
||||||
|
return Object.keys(this.buttons).filter(key => {
|
||||||
|
const button = this.buttons[key];
|
||||||
|
if (button && button.props && button.props.isActive) {
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
setButtons(buttons) {
|
setButtons(buttons) {
|
||||||
this.buttons = buttons;
|
this.buttons = buttons;
|
||||||
this._broadcastChange(this.EVENTS.TOOL_BAR_MODIFIED, {});
|
this._broadcastChange(this.EVENTS.TOOL_BAR_MODIFIED, {});
|
||||||
|
|||||||
@ -328,6 +328,8 @@ module.exports = {
|
|||||||
'0': '0',
|
'0': '0',
|
||||||
auto: 'auto',
|
auto: 'auto',
|
||||||
full: '100%',
|
full: '100%',
|
||||||
|
viewport: '0.5rem',
|
||||||
|
'viewport-scrollbar': '1.3rem'
|
||||||
},
|
},
|
||||||
letterSpacing: {
|
letterSpacing: {
|
||||||
tighter: '-0.05em',
|
tighter: '-0.05em',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user