fix: OHIF-219 - Viewport Labels should be sequential (#1881)

This commit is contained in:
Rodrigo Antinarelli 2020-07-10 11:06:45 -03:00 committed by GitHub
parent 066ba97bc9
commit b28a70520e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 29 deletions

View File

@ -399,10 +399,7 @@ function OHIFCornerstoneSRViewport({
});
}
const label =
viewports.length > 1
? _viewportLabels[firstViewportIndexWithMatchingDisplaySetUid]
: '';
const label = viewports.length > 1 ? _viewportLabels[viewportIndex] : '';
// TODO -> disabled double click for now: onDoubleClick={_onDoubleClick}

View File

@ -23,7 +23,7 @@ function PanelStudyBrowserTracking({
// Tabs --> Studies --> DisplaySets --> Thumbnails
const [{ StudyInstanceUIDs }, dispatchImageViewer] = useImageViewer();
const [
{ activeViewportIndex, viewports },
{ activeViewportIndex, viewports, numCols, numRows },
viewportGridService,
] = useViewportGrid();
const [
@ -49,6 +49,8 @@ function PanelStudyBrowserTracking({
const activeDisplaySetInstanceUID =
viewports[activeViewportIndex]?.displaySetInstanceUID;
const isSingleViewport = numCols === 1 && numRows === 1;
// TODO: Should this be somewhere else? Feels more like a mode "lifecycle" setup/destroy?
useEffect(() => {
const { unsubscribe } = MeasurementService.subscribe(
@ -133,7 +135,8 @@ function PanelStudyBrowserTracking({
currentDisplaySets,
thumbnailImageSrcMap,
trackedSeries,
viewports
viewports,
isSingleViewport
);
setDisplaySets(mappedDisplaySets);
@ -189,7 +192,8 @@ function PanelStudyBrowserTracking({
changedDisplaySets,
thumbnailImageSrcMap,
trackedSeries,
viewports
viewports,
isSingleViewport
);
setDisplaySets(mappedDisplaySets);
@ -279,7 +283,7 @@ function PanelStudyBrowserTracking({
];
setExpandedStudyInstanceUIDs(updatedExpandedStudyInstanceUIDs);
}
}, [jumpToDisplaySet]);
}, [expandedStudyInstanceUIDs, jumpToDisplaySet, tabs]);
return (
<StudyBrowser
@ -355,21 +359,22 @@ function _mapDisplaySets(
displaySets,
thumbnailImageSrcMap,
trackedSeriesInstanceUIDs,
viewports // TODO: make array of `displaySetInstanceUIDs`?
viewports, // TODO: make array of `displaySetInstanceUIDs`?
isSingleViewport
) {
const thumbnailDisplaySets = [];
const thumbnailNoImageDisplaySets = [];
displaySets.forEach(ds => {
const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID];
const componentType = _getComponentType(ds.Modality);
const firstViewportIndexWithMatchingDisplaySetUid = viewports.findIndex(
vp => vp.displaySetInstanceUID === ds.displaySetInstanceUID
);
const viewportIdentificator =
viewports.length > 1
? _viewportLabels[firstViewportIndexWithMatchingDisplaySetUid]
: '';
const viewportIdentificator = isSingleViewport
? []
: viewports.reduce((acc, viewportData, index) => {
if (viewportData.displaySetInstanceUID === ds.displaySetInstanceUID) {
acc.push(_viewportLabels[index]);
}
return acc;
}, []);
const array =
componentType === 'thumbnailTracked'

View File

@ -245,10 +245,7 @@ function TrackedCornerstoneViewport({
setIsTracked(!isTracked);
}
const label =
viewports.length > 1
? _viewportLabels[firstViewportIndexWithMatchingDisplaySetUid]
: '';
const label = viewports.length > 1 ? _viewportLabels[viewportIndex] : '';
function switchMeasurement(direction) {
if (!element) {

View File

@ -15,7 +15,6 @@ const ThumbnailNoImage = ({
onDoubleClick,
dragData,
isActive,
viewportIdentificator = '',
}) => {
const [collectedProps, drag, dragPreview] = useDrag({
item: { ...dragData },
@ -84,7 +83,6 @@ ThumbnailNoImage.propTypes = {
onClick: PropTypes.func.isRequired,
onDoubleClick: PropTypes.func.isRequired,
isActive: PropTypes.bool.isRequired,
viewportIdentificator: PropTypes.string,
};
export default ThumbnailNoImage;

View File

@ -21,6 +21,35 @@ const ThumbnailTracked = ({
isActive,
}) => {
const trackedIcon = isTracked ? 'circled-checkmark' : 'dotted-circle';
const viewportIdentificatorLabel = viewportIdentificator.join(', ');
const renderViewportLabels = () => {
const MAX_LABELS_PER_COL = 3;
const shouldShowStack = viewportIdentificator.length > MAX_LABELS_PER_COL;
if (shouldShowStack) {
return (
<div>
<div>
{viewportIdentificator.slice(0, MAX_LABELS_PER_COL).map(label => (
<div key={label}>{label}</div>
))}
</div>
<Tooltip
position="right"
content={
<div className="text-left max-w-40">
Series is displayed <br /> in viewport{' '}
{viewportIdentificatorLabel}
</div>
}
>
<Icon name="tool-more-menu" className="text-white py-2" />
</Tooltip>
</div>
);
}
return viewportIdentificator.map(label => <div key={label}>{label}</div>);
};
return (
<div
@ -48,11 +77,11 @@ const ThumbnailTracked = ({
{isTracked ? ' tracked' : ' untracked'}
</span>
</span>
{viewportIdentificator && (
{!!viewportIdentificator.length && (
<span>
in viewport
<span className="ml-1 text-white">
{viewportIdentificator}
{viewportIdentificatorLabel}
</span>
</span>
)}
@ -64,10 +93,10 @@ const ThumbnailTracked = ({
}
>
<Icon name={trackedIcon} className="w-4 mb-2 text-primary-light" />
<div className="h-5 text-xl leading-tight text-white">
{viewportIdentificator}
</div>
</Tooltip>
<div className="text-xl leading-tight text-white text-center">
{renderViewportLabels()}
</div>
</div>
{isTracked && (
<div onClick={onClickUntrack}>
@ -113,7 +142,7 @@ ThumbnailTracked.propTypes = {
onClick: PropTypes.func.isRequired,
onDoubleClick: PropTypes.func.isRequired,
onClickUntrack: PropTypes.func.isRequired,
viewportIdentificator: PropTypes.string,
viewportIdentificator: PropTypes.array,
isTracked: PropTypes.bool,
isActive: PropTypes.bool.isRequired,
};

View File

@ -88,6 +88,8 @@ export function ViewportGridProvider({ children, service }) {
DEFAULT_STATE
);
console.log('viewportGridState',viewportGridState)
const getState = useCallback(() => viewportGridState, [viewportGridState]);
const setActiveViewportIndex = useCallback(
index => dispatch({ type: 'SET_ACTIVE_VIEWPORT_INDEX', payload: index }),