import React, { ReactElement, useEffect, useRef, useState } from 'react'; import { AllInOneMenu, ScrollArea, Switch, Tabs, TabsList, TabsTrigger } from '@ohif/ui-next'; import { useViewportRendering } from '../../hooks/useViewportRendering'; import { WindowLevelPreset } from '../../types/WindowLevel'; import { useTranslation } from 'react-i18next'; export function WindowLevel({ viewportId }: { viewportId?: string } = {}): ReactElement { const { t } = useTranslation('WindowLevelActionMenu'); const { viewportDisplaySets } = useViewportRendering(viewportId); const [activeDisplaySetUID, setActiveDisplaySetUID] = useState( viewportDisplaySets?.[0]?.displaySetInstanceUID ); // Use the hook with the active display set const { windowLevelPresets, setWindowLevel } = useViewportRendering(viewportId, { displaySetInstanceUID: activeDisplaySetUID, }); const [showPreview, setShowPreview] = useState(false); const [prePreviewPreset, setPrePreviewPreset] = useState(null); const [currentPreset, setCurrentPreset] = useState(null); const showPreviewRef = useRef(showPreview); showPreviewRef.current = showPreview; const prePreviewPresetRef = useRef(prePreviewPreset); prePreviewPresetRef.current = prePreviewPreset; const currentPresetRef = useRef(currentPreset); currentPresetRef.current = currentPreset; // Reset presets when active display set changes useEffect(() => { setCurrentPreset(null); setPrePreviewPreset(null); }, [activeDisplaySetUID]); // Handle applying window level preset const handleSetWindowLevel = (preset: WindowLevelPreset, immediate = false) => { setWindowLevel({ windowWidth: Number(preset.window), windowCenter: Number(preset.level), immediate, }); }; return ( <> {viewportDisplaySets && viewportDisplaySets.length > 1 && (
{ setActiveDisplaySetUID(displaySetUID); }} > {viewportDisplaySets.map(ds => ( {ds.Modality} ))}
)}
setShowPreview(!showPreview)} > {t('Preview in viewport')} { setShowPreview(checked); // When turning off preview, restore the current preset if one exists if (!checked && currentPresetRef.current) { handleSetWindowLevel(currentPresetRef.current, true); } }} />
{windowLevelPresets.map((preset, index) => ( { setCurrentPreset(preset); handleSetWindowLevel(preset, true); setPrePreviewPreset(null); }} onMouseEnter={() => { if (showPreviewRef.current) { if (!prePreviewPresetRef.current) { setPrePreviewPreset(currentPresetRef.current || preset); } handleSetWindowLevel(preset, true); } }} onMouseLeave={() => { if (showPreviewRef.current && prePreviewPresetRef.current) { handleSetWindowLevel(prePreviewPresetRef.current, true); } }} /> ))}
); }