import React, { ReactElement, useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import classNames from 'classnames'; import { AllInOneMenu, useViewportGrid } from '@ohif/ui'; import { Colormap } from './Colormap'; import { Colorbar } from './Colorbar'; import { setViewportColorbar } from './Colorbar'; import { WindowLevelPreset } from '../../types/WindowLevel'; import { ColorbarProperties } from '../../types/Colorbar'; import { VolumeRenderingQualityRange } from '../../types/ViewportPresets'; import { WindowLevel } from './WindowLevel'; import { VolumeRenderingPresets } from './VolumeRenderingPresets'; import { VolumeRenderingOptions } from './VolumeRenderingOptions'; import { ViewportPreset } from '../../types/ViewportPresets'; import { VolumeViewport3D } from '@cornerstonejs/core'; import { utilities } from '@cornerstonejs/core'; export type WindowLevelActionMenuProps = { viewportId: string; element: HTMLElement; presets: Array>>; verticalDirection: AllInOneMenu.VerticalDirection; horizontalDirection: AllInOneMenu.HorizontalDirection; colorbarProperties: ColorbarProperties; displaySets: Array; volumeRenderingPresets: Array; volumeRenderingQualityRange: VolumeRenderingQualityRange; }; export function WindowLevelActionMenu({ viewportId, element, presets, verticalDirection, horizontalDirection, commandsManager, servicesManager, colorbarProperties, displaySets, volumeRenderingPresets, volumeRenderingQualityRange, }: withAppTypes): ReactElement { const { colormaps, colorbarContainerPosition, colorbarInitialColormap, colorbarTickPosition, width: colorbarWidth, } = colorbarProperties; const { colorbarService, cornerstoneViewportService } = servicesManager.services; const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const backgroundColor = viewportInfo.getViewportOptions().background; const isLight = backgroundColor ? utilities.isEqual(backgroundColor, [1, 1, 1]) : false; const nonImageModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE']; const { t } = useTranslation('WindowLevelActionMenu'); const [viewportGrid] = useViewportGrid(); const { activeViewportId } = viewportGrid; const [vpHeight, setVpHeight] = useState(element?.clientHeight); const [menuKey, setMenuKey] = useState(0); const [is3DVolume, setIs3DVolume] = useState(false); const onSetColorbar = useCallback(() => { setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, { colormaps, ticks: { position: colorbarTickPosition, }, width: colorbarWidth, position: colorbarContainerPosition, activeColormapName: colorbarInitialColormap, }); }, [commandsManager]); useEffect(() => { const newVpHeight = element?.clientHeight; if (vpHeight !== newVpHeight) { setVpHeight(newVpHeight); } }, [element, vpHeight]); useEffect(() => { if (!colorbarService.hasColorbar(viewportId)) { return; } window.setTimeout(() => { colorbarService.removeColorbar(viewportId); onSetColorbar(); }, 0); }, [viewportId, displaySets, viewport]); useEffect(() => { setMenuKey(menuKey + 1); const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); if (viewport instanceof VolumeViewport3D) { setIs3DVolume(true); } else { setIs3DVolume(false); } }, [ displaySets, viewportId, presets, volumeRenderingQualityRange, volumeRenderingPresets, colorbarProperties, activeViewportId, viewportGrid, ]); return ( { setVpHeight(element.clientHeight); }} menuKey={menuKey} > {!is3DVolume && ( !nonImageModalities.includes(ds.Modality))} commandsManager={commandsManager} servicesManager={servicesManager} colorbarProperties={colorbarProperties} /> )} {colormaps && !is3DVolume && ( !nonImageModalities.includes(ds.Modality))} commandsManager={commandsManager} servicesManager={servicesManager} /> )} {presets && presets.length > 0 && !is3DVolume && ( )} {volumeRenderingPresets && is3DVolume && ( )} {volumeRenderingQualityRange && is3DVolume && ( )} ); }