import React, { ReactElement, useCallback, useEffect, useState, useRef } from 'react'; import { VolumeShiftProps } from '../../types/ViewportPresets'; import { Numeric } from '@ohif/ui-next'; export function VolumeShift({ viewportId, commandsManager, servicesManager, }: VolumeShiftProps): ReactElement { const { cornerstoneViewportService } = servicesManager.services; const [minShift, setMinShift] = useState(null); const [maxShift, setMaxShift] = useState(null); const [shift, setShift] = useState( cornerstoneViewportService.getCornerstoneViewport(viewportId)?.shiftedBy || 0 ); const [step, setStep] = useState(null); const [isBlocking, setIsBlocking] = useState(false); const prevShiftRef = useRef(shift); const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const { actor } = viewport.getActors()[0]; const ofun = actor.getProperty().getScalarOpacity(0); useEffect(() => { if (isBlocking) { return; } const range = ofun.getRange(); const transferFunctionWidth = range[1] - range[0]; const minShift = -transferFunctionWidth; const maxShift = transferFunctionWidth; setMinShift(minShift); setMaxShift(maxShift); setStep(Math.pow(10, Math.floor(Math.log10(transferFunctionWidth / 500)))); }, [cornerstoneViewportService, viewportId, actor, ofun, isBlocking]); const onChangeRange = useCallback( newShift => { const shiftDifference = newShift - prevShiftRef.current; prevShiftRef.current = newShift; viewport.shiftedBy = newShift; commandsManager.runCommand('shiftVolumeOpacityPoints', { viewportId, shift: shiftDifference, }); setShift(newShift); }, [commandsManager, viewportId, viewport] ); return (
{step !== null && minShift !== null && maxShift !== null && (
setIsBlocking(true)} onMouseUp={() => setIsBlocking(false)} >
Shift
)}
); }