UNPKG

@cornerstonejs/core

Version:
75 lines (74 loc) 3.05 kB
import { Events } from '../enums/index.js'; import StackViewport from '../RenderingEngine/StackViewport.js'; import VolumeViewport from '../RenderingEngine/VolumeViewport.js'; import getVolumeViewportScrollInfo from './getVolumeViewportScrollInfo.js'; import snapFocalPointToSlice from './snapFocalPointToSlice.js'; import getEnabledElement from '../getEnabledElement.js'; import triggerEvent from './triggerEvent.js'; import eventTarget from '../eventTarget.js'; export default function scroll(viewport, options) { const enabledElement = getEnabledElement(viewport.element); if (!enabledElement) { throw new Error('Scroll::Viewport is not enabled (it might be disabled)'); } if (viewport instanceof StackViewport && viewport.getImageIds().length === 0) { throw new Error('Scroll::Stack Viewport has no images'); } const { volumeId, delta, scrollSlabs } = options; if (viewport instanceof VolumeViewport) { scrollVolume(viewport, volumeId, delta, scrollSlabs); } else { if (typeof viewport.getCurrentImageIdIndex !== 'function' || typeof viewport.scroll !== 'function') { return; } const imageIdIndex = viewport.getCurrentImageIdIndex(); if (imageIdIndex + delta > viewport.getImageIds().length - 1 || imageIdIndex + delta < 0) { const eventData = { imageIdIndex, direction: delta, }; triggerEvent(eventTarget, Events.STACK_SCROLL_OUT_OF_BOUNDS, eventData); } viewport.scroll(delta, options.debounceLoading, options.loop); } } export function scrollVolume(viewport, volumeId, delta, scrollSlabs = false) { const useSlabThickness = scrollSlabs; const { numScrollSteps, currentStepIndex, sliceRangeInfo } = getVolumeViewportScrollInfo(viewport, volumeId, useSlabThickness); if (numScrollSteps === 0) return; if (!sliceRangeInfo) { return; } const { sliceRange, spacingInNormalDirection, camera } = sliceRangeInfo; const { focalPoint, viewPlaneNormal, position } = camera; const { newFocalPoint, newPosition } = snapFocalPointToSlice(focalPoint, position, sliceRange, viewPlaneNormal, spacingInNormalDirection, delta); viewport.setCamera({ focalPoint: newFocalPoint, position: newPosition, }); viewport.render(); const desiredStepIndex = currentStepIndex + delta; const VolumeScrollEventDetail = { volumeId, viewport, delta, desiredStepIndex, currentStepIndex, numScrollSteps, currentImageId: viewport.getCurrentImageId(), }; if ((desiredStepIndex > numScrollSteps || desiredStepIndex < 0) && viewport.getCurrentImageId()) { triggerEvent(eventTarget, Events.VOLUME_VIEWPORT_SCROLL_OUT_OF_BOUNDS, VolumeScrollEventDetail); } else { triggerEvent(eventTarget, Events.VOLUME_VIEWPORT_SCROLL, VolumeScrollEventDetail); } }