Merge pull request #1831 from OHIF/feat/ohif-203

OHIF-203: Add new viewport overlay
This commit is contained in:
Danny Brown 2020-06-30 08:41:20 -04:00 committed by GitHub
commit d5d219c271
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 117 additions and 3 deletions

View File

@ -12,8 +12,19 @@ const OHIFCornerstoneViewport = props => {
);
};
function getViewportModule({ commandsManager }) {
return [{ name: 'cornerstone-tracked', component: OHIFCornerstoneViewport }];
function getViewportModule({ servicesManager }) {
const ExtendedOHIFCornerstoneSRViewport = props => {
const { ToolBarService } = servicesManager.services;
return (
<OHIFCornerstoneViewport
ToolBarService={ToolBarService}
{...props}
/>
);
};
return [{ name: 'cornerstone-tracked', component: ExtendedOHIFCornerstoneSRViewport }];
}
export default getViewportModule;

View File

@ -12,6 +12,8 @@ import {
} from '@ohif/ui';
import { useTrackedMeasurements } from './../getContextModule';
import ViewportOverlay from './ViewportOverlay';
const { formatDate } = utils;
// TODO -> Get this list from the list of tracked measurements.
@ -38,6 +40,7 @@ function TrackedCornerstoneViewport({
dataSource,
displaySet,
viewportIndex,
ToolBarService
}) {
const [trackedMeasurements] = useTrackedMeasurements();
const [{ activeViewportIndex, viewports }] = useViewportGrid();
@ -280,7 +283,15 @@ function TrackedCornerstoneViewport({
isStackPrefetchEnabled={true} // todo
isPlaying={false}
frameRate={24}
isOverlayVisible={false}
isOverlayVisible={true}
viewportOverlayComponent={props => {
return (
<ViewportOverlay
{...props}
activeTools={ToolBarService.getActiveTools()}
/>
);
}}
/>
<div className="absolute w-full">
{viewportDialogState.viewportIndex === viewportIndex && (

View File

@ -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;

View File

@ -27,6 +27,15 @@ export default class ToolBarService {
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) {
this.buttons = buttons;
this._broadcastChange(this.EVENTS.TOOL_BAR_MODIFIED, {});

View File

@ -328,6 +328,8 @@ module.exports = {
'0': '0',
auto: 'auto',
full: '100%',
viewport: '0.5rem',
'viewport-scrollbar': '1.3rem'
},
letterSpacing: {
tighter: '-0.05em',