From 7f770e4fb6563a33d9ecb45f7ec65da5f9fac76c Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 7 Oct 2022 00:32:28 -0400 Subject: [PATCH] fix: cine scrolling was broken when navigating back to studylist (#2974) * fix: cine clean up when exited * fix: make cine work while dragging and dropping another displayset --- .../viewports/TrackedCornerstoneViewport.tsx | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx b/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx index 2f00602d2..011981c2a 100644 --- a/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx +++ b/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx @@ -10,6 +10,7 @@ import { useViewportDialog, } from '@ohif/ui'; +import { eventTarget, Enums } from '@cornerstonejs/core'; import { annotation } from '@cornerstonejs/tools'; import { useTrackedMeasurements } from './../getContextModule'; @@ -64,6 +65,26 @@ function TrackedCornerstoneViewport(props) { ManufacturerModelName, } = displaySet.images[0]; + const cineHandler = () => { + if (!cines || !cines[viewportIndex] || !element) { + return; + } + + const cine = cines[viewportIndex]; + const isPlaying = cine.isPlaying || false; + const frameRate = cine.frameRate || 24; + + const validFrameRate = Math.max(frameRate, 1); + + if (isPlaying) { + cineService.playClip(element, { + framesPerSecond: validFrameRate, + }); + } else { + cineService.stopClip(element); + } + }; + useEffect(() => { if (isTracked) { annotation.config.style.setViewportToolStyles(viewportId, { @@ -92,25 +113,33 @@ function TrackedCornerstoneViewport(props) { }; }, [isTracked]); + // unmount cleanup useEffect(() => { - if (!cines || !cines[viewportIndex]) { + eventTarget.addEventListener( + Enums.Events.STACK_VIEWPORT_NEW_STACK, + cineHandler + ); + + return () => { + cineService.setCine({ id: viewportIndex, isPlaying: false }); + eventTarget.removeEventListener( + Enums.Events.STACK_VIEWPORT_NEW_STACK, + cineHandler + ); + }; + }, [element]); + + useEffect(() => { + if (!cines || !cines[viewportIndex] || !element) { return; } - const cine = cines[viewportIndex]; - const isPlaying = (cine && cine.isPlaying) || false; - const frameRate = (cine && cine.frameRate) || 24; + cineHandler(); - const validFrameRate = Math.max(frameRate, 1); - - if (isPlaying) { - cineService.playClip(element, { - framesPerSecond: validFrameRate, - }); - } else { + return () => { cineService.stopClip(element); - } - }, [cines, viewportIndex, cineService, element, displaySet]); + }; + }, [cines, viewportIndex, cineService, element]); if (trackedSeries.includes(SeriesInstanceUID) !== isTracked) { setIsTracked(!isTracked);