@cornerstonejs/tools 0.56.1 → 0.56.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/tools/CrosshairsTool.d.ts +1 -0
- package/dist/cjs/tools/CrosshairsTool.js +4 -1
- package/dist/cjs/tools/CrosshairsTool.js.map +1 -1
- package/dist/esm/tools/CrosshairsTool.d.ts +1 -0
- package/dist/esm/tools/CrosshairsTool.js +4 -1
- package/dist/esm/tools/CrosshairsTool.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +5 -4
- package/src/constants/COLOR_LUT.ts +262 -0
- package/src/constants/index.ts +3 -0
- package/src/cursors/ImageMouseCursor.ts +39 -0
- package/src/cursors/MouseCursor.ts +114 -0
- package/src/cursors/SVGCursorDescriptor.ts +462 -0
- package/src/cursors/SVGMouseCursor.ts +145 -0
- package/src/cursors/elementCursor.ts +69 -0
- package/src/cursors/index.ts +24 -0
- package/src/cursors/setCursorForElement.ts +33 -0
- package/src/drawingSvg/_getHash.ts +9 -0
- package/src/drawingSvg/_setAttributesIfNecessary.ts +13 -0
- package/src/drawingSvg/_setNewAttributesIfValid.ts +10 -0
- package/src/drawingSvg/clearByToolType.ts +26 -0
- package/src/drawingSvg/draw.ts +16 -0
- package/src/drawingSvg/drawArrow.ts +82 -0
- package/src/drawingSvg/drawCircle.ts +62 -0
- package/src/drawingSvg/drawEllipse.ts +71 -0
- package/src/drawingSvg/drawHandles.ts +87 -0
- package/src/drawingSvg/drawLine.ts +70 -0
- package/src/drawingSvg/drawLink.ts +76 -0
- package/src/drawingSvg/drawLinkedTextBox.ts +64 -0
- package/src/drawingSvg/drawPolyline.ts +80 -0
- package/src/drawingSvg/drawRect.ts +70 -0
- package/src/drawingSvg/drawTextBox.ts +213 -0
- package/src/drawingSvg/getSvgDrawingHelper.ts +98 -0
- package/src/drawingSvg/index.ts +23 -0
- package/src/enums/AnnotationStyleStates.ts +22 -0
- package/src/enums/Events.ts +242 -0
- package/src/enums/SegmentationRepresentations.ts +12 -0
- package/src/enums/ToolBindings.ts +37 -0
- package/src/enums/ToolModes.ts +31 -0
- package/src/enums/Touch.ts +8 -0
- package/src/enums/index.js +16 -0
- package/src/eventDispatchers/annotationModifiedEventDispatcher.ts +41 -0
- package/src/eventDispatchers/cameraModifiedEventDispatcher.ts +41 -0
- package/src/eventDispatchers/imageRenderedEventDispatcher.ts +37 -0
- package/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +50 -0
- package/src/eventDispatchers/index.js +15 -0
- package/src/eventDispatchers/keyboardEventHandlers/index.js +4 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +29 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyUp.ts +33 -0
- package/src/eventDispatchers/keyboardToolEventDispatcher.ts +28 -0
- package/src/eventDispatchers/mouseEventHandlers/index.js +19 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseClick.ts +13 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDoubleClick.ts +13 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +196 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDownActivate.ts +35 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDrag.ts +25 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseMove.ts +70 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseUp.ts +9 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseWheel.ts +13 -0
- package/src/eventDispatchers/mouseToolEventDispatcher.ts +64 -0
- package/src/eventDispatchers/shared/customCallbackHandler.ts +73 -0
- package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +58 -0
- package/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +61 -0
- package/src/eventDispatchers/shared/getActiveToolForTouchEvent.ts +64 -0
- package/src/eventDispatchers/shared/getMouseModifier.ts +30 -0
- package/src/eventDispatchers/shared/getToolsWithModesForMouseEvent.ts +56 -0
- package/src/eventDispatchers/shared/getToolsWithModesForTouchEvent.ts +54 -0
- package/src/eventDispatchers/touchEventHandlers/index.js +15 -0
- package/src/eventDispatchers/touchEventHandlers/touchDrag.ts +23 -0
- package/src/eventDispatchers/touchEventHandlers/touchEnd.ts +9 -0
- package/src/eventDispatchers/touchEventHandlers/touchPress.ts +13 -0
- package/src/eventDispatchers/touchEventHandlers/touchStart.ts +174 -0
- package/src/eventDispatchers/touchEventHandlers/touchStartActivate.ts +36 -0
- package/src/eventDispatchers/touchEventHandlers/touchTap.ts +9 -0
- package/src/eventDispatchers/touchToolEventDispatcher.ts +51 -0
- package/src/eventListeners/annotations/annotationModifiedListener.ts +22 -0
- package/src/eventListeners/annotations/annotationSelectionListener.ts +29 -0
- package/src/eventListeners/annotations/index.ts +4 -0
- package/src/eventListeners/index.ts +28 -0
- package/src/eventListeners/keyboard/index.ts +16 -0
- package/src/eventListeners/keyboard/keyDownListener.ts +99 -0
- package/src/eventListeners/mouse/getMouseEventPoints.ts +66 -0
- package/src/eventListeners/mouse/index.ts +55 -0
- package/src/eventListeners/mouse/mouseDoubleClickListener.ts +55 -0
- package/src/eventListeners/mouse/mouseDownListener.ts +519 -0
- package/src/eventListeners/mouse/mouseMoveListener.ts +33 -0
- package/src/eventListeners/segmentation/index.ts +11 -0
- package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +61 -0
- package/src/eventListeners/segmentation/segmentationModifiedEventListener.ts +32 -0
- package/src/eventListeners/segmentation/segmentationRepresentationModifiedEventListener.ts +15 -0
- package/src/eventListeners/segmentation/segmentationRepresentationRemovedEventListener.ts +16 -0
- package/src/eventListeners/touch/getTouchEventPoints.ts +75 -0
- package/src/eventListeners/touch/index.ts +37 -0
- package/src/eventListeners/touch/preventGhostClick.js +72 -0
- package/src/eventListeners/touch/touchStartListener.ts +499 -0
- package/src/eventListeners/wheel/index.ts +27 -0
- package/src/eventListeners/wheel/normalizeWheel.ts +69 -0
- package/src/eventListeners/wheel/wheelListener.ts +51 -0
- package/src/index.ts +133 -0
- package/src/init.ts +187 -0
- package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +399 -0
- package/src/stateManagement/annotation/annotationLocking.ts +178 -0
- package/src/stateManagement/annotation/annotationSelection.ts +163 -0
- package/src/stateManagement/annotation/annotationState.ts +180 -0
- package/src/stateManagement/annotation/annotationVisibility.ts +156 -0
- package/src/stateManagement/annotation/config/ToolStyle.ts +265 -0
- package/src/stateManagement/annotation/config/getFont.ts +36 -0
- package/src/stateManagement/annotation/config/getState.ts +26 -0
- package/src/stateManagement/annotation/config/helpers.ts +55 -0
- package/src/stateManagement/annotation/config/index.ts +5 -0
- package/src/stateManagement/annotation/helpers/state.ts +83 -0
- package/src/stateManagement/annotation/index.ts +15 -0
- package/src/stateManagement/index.js +40 -0
- package/src/stateManagement/segmentation/SegmentationStateManager.ts +491 -0
- package/src/stateManagement/segmentation/activeSegmentation.ts +60 -0
- package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +77 -0
- package/src/stateManagement/segmentation/addSegmentations.ts +27 -0
- package/src/stateManagement/segmentation/config/index.ts +29 -0
- package/src/stateManagement/segmentation/config/segmentationColor.ts +132 -0
- package/src/stateManagement/segmentation/config/segmentationConfig.ts +195 -0
- package/src/stateManagement/segmentation/config/segmentationVisibility.ts +171 -0
- package/src/stateManagement/segmentation/helpers/index.ts +3 -0
- package/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +35 -0
- package/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +41 -0
- package/src/stateManagement/segmentation/index.ts +22 -0
- package/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts +85 -0
- package/src/stateManagement/segmentation/segmentIndex.ts +38 -0
- package/src/stateManagement/segmentation/segmentLocking.ts +72 -0
- package/src/stateManagement/segmentation/segmentationState.ts +429 -0
- package/src/stateManagement/segmentation/triggerSegmentationEvents.ts +157 -0
- package/src/store/SynchronizerManager/Synchronizer.ts +344 -0
- package/src/store/SynchronizerManager/createSynchronizer.ts +41 -0
- package/src/store/SynchronizerManager/destroy.ts +14 -0
- package/src/store/SynchronizerManager/destroySynchronizer.ts +25 -0
- package/src/store/SynchronizerManager/getAllSynchronizers.ts +12 -0
- package/src/store/SynchronizerManager/getSynchronizer.ts +13 -0
- package/src/store/SynchronizerManager/getSynchronizersForViewport.ts +44 -0
- package/src/store/SynchronizerManager/index.js +15 -0
- package/src/store/ToolGroupManager/ToolGroup.ts +679 -0
- package/src/store/ToolGroupManager/createToolGroup.ts +33 -0
- package/src/store/ToolGroupManager/destroy.ts +24 -0
- package/src/store/ToolGroupManager/destroyToolGroup.ts +26 -0
- package/src/store/ToolGroupManager/getAllToolGroups.ts +12 -0
- package/src/store/ToolGroupManager/getToolGroup.ts +14 -0
- package/src/store/ToolGroupManager/getToolGroupForViewport.ts +44 -0
- package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +33 -0
- package/src/store/ToolGroupManager/index.ts +17 -0
- package/src/store/addEnabledElement.ts +137 -0
- package/src/store/addTool.ts +56 -0
- package/src/store/cancelActiveManipulations.ts +30 -0
- package/src/store/filterMoveableAnnotationTools.ts +61 -0
- package/src/store/filterToolsWithAnnotationsForElement.ts +51 -0
- package/src/store/filterToolsWithMoveableHandles.ts +51 -0
- package/src/store/index.ts +29 -0
- package/src/store/removeEnabledElement.ts +132 -0
- package/src/store/state.ts +57 -0
- package/src/store/svgNodeCache.ts +7 -0
- package/src/synchronizers/callbacks/areViewportsCoplanar .ts +12 -0
- package/src/synchronizers/callbacks/cameraSyncCallback.ts +33 -0
- package/src/synchronizers/callbacks/stackImageSyncCallback.ts +157 -0
- package/src/synchronizers/callbacks/voiSyncCallback.ts +51 -0
- package/src/synchronizers/callbacks/zoomPanSyncCallback.ts +43 -0
- package/src/synchronizers/index.ts +11 -0
- package/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/createStackImageSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/createVOISynchronizer.ts +24 -0
- package/src/synchronizers/synchronizers/createZoomPanSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/index.ts +11 -0
- package/src/tools/CrosshairsTool.ts +2693 -0
- package/src/tools/MIPJumpToClickTool.ts +99 -0
- package/src/tools/MagnifyTool.ts +319 -0
- package/src/tools/PanTool.ts +58 -0
- package/src/tools/PlanarRotateTool.ts +77 -0
- package/src/tools/ReferenceCursors.ts +466 -0
- package/src/tools/ReferenceLinesTool.ts +279 -0
- package/src/tools/ScaleOverlayTool.ts +685 -0
- package/src/tools/StackScrollTool.ts +97 -0
- package/src/tools/StackScrollToolMouseWheelTool.ts +58 -0
- package/src/tools/TrackballRotateTool.ts +141 -0
- package/src/tools/VolumeRotateMouseWheelTool.ts +86 -0
- package/src/tools/WindowLevelTool.ts +260 -0
- package/src/tools/ZoomTool.ts +293 -0
- package/src/tools/annotation/AngleTool.ts +835 -0
- package/src/tools/annotation/ArrowAnnotateTool.ts +820 -0
- package/src/tools/annotation/BidirectionalTool.ts +1350 -0
- package/src/tools/annotation/CircleROITool.ts +1070 -0
- package/src/tools/annotation/CobbAngleTool.ts +815 -0
- package/src/tools/annotation/DragProbeTool.ts +213 -0
- package/src/tools/annotation/EllipticalROITool.ts +1223 -0
- package/src/tools/annotation/LengthTool.ts +861 -0
- package/src/tools/annotation/PlanarFreehandROITool.ts +636 -0
- package/src/tools/annotation/ProbeTool.ts +681 -0
- package/src/tools/annotation/RectangleROITool.ts +1028 -0
- package/src/tools/annotation/planarFreehandROITool/closedContourEditLoop.ts +488 -0
- package/src/tools/annotation/planarFreehandROITool/drawLoop.ts +462 -0
- package/src/tools/annotation/planarFreehandROITool/editLoopCommon.ts +331 -0
- package/src/tools/annotation/planarFreehandROITool/findOpenUShapedContourVectorToPeak.ts +74 -0
- package/src/tools/annotation/planarFreehandROITool/openContourEditLoop.ts +612 -0
- package/src/tools/annotation/planarFreehandROITool/openContourEndEditLoop.ts +74 -0
- package/src/tools/annotation/planarFreehandROITool/renderMethods.ts +407 -0
- package/src/tools/base/AnnotationDisplayTool.ts +228 -0
- package/src/tools/base/AnnotationTool.ts +307 -0
- package/src/tools/base/BaseTool.ts +215 -0
- package/src/tools/base/index.ts +4 -0
- package/src/tools/displayTools/Contour/addContourToElement.ts +135 -0
- package/src/tools/displayTools/Contour/contourDisplay.ts +252 -0
- package/src/tools/displayTools/Contour/index.ts +3 -0
- package/src/tools/displayTools/Contour/removeContourFromElement.ts +35 -0
- package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +57 -0
- package/src/tools/displayTools/Labelmap/index.ts +4 -0
- package/src/tools/displayTools/Labelmap/labelmapConfig.ts +37 -0
- package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +461 -0
- package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +27 -0
- package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +30 -0
- package/src/tools/displayTools/SegmentationDisplayTool.ts +198 -0
- package/src/tools/index.ts +84 -0
- package/src/tools/segmentation/BrushTool.ts +474 -0
- package/src/tools/segmentation/CircleScissorsTool.ts +365 -0
- package/src/tools/segmentation/PaintFillTool.ts +370 -0
- package/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +471 -0
- package/src/tools/segmentation/RectangleROIThresholdTool.ts +281 -0
- package/src/tools/segmentation/RectangleScissorsTool.ts +382 -0
- package/src/tools/segmentation/SphereScissorsTool.ts +368 -0
- package/src/tools/segmentation/strategies/eraseCircle.ts +30 -0
- package/src/tools/segmentation/strategies/eraseRectangle.ts +81 -0
- package/src/tools/segmentation/strategies/eraseSphere.ts +27 -0
- package/src/tools/segmentation/strategies/fillCircle.ts +185 -0
- package/src/tools/segmentation/strategies/fillRectangle.ts +110 -0
- package/src/tools/segmentation/strategies/fillSphere.ts +88 -0
- package/src/tools/segmentation/strategies/index.ts +9 -0
- package/src/types/AnnotationGroupSelector.ts +7 -0
- package/src/types/AnnotationStyle.ts +42 -0
- package/src/types/AnnotationTypes.ts +109 -0
- package/src/types/BoundsIJK.ts +5 -0
- package/src/types/CINETypes.ts +32 -0
- package/src/types/ContourTypes.ts +26 -0
- package/src/types/CursorTypes.ts +12 -0
- package/src/types/EventTypes.ts +657 -0
- package/src/types/FloodFillTypes.ts +19 -0
- package/src/types/IAnnotationManager.ts +89 -0
- package/src/types/IDistance.ts +16 -0
- package/src/types/IPoints.ts +18 -0
- package/src/types/ISetToolModeOptions.ts +29 -0
- package/src/types/ISynchronizerEventHandler.ts +11 -0
- package/src/types/IToolClassReference.ts +5 -0
- package/src/types/IToolGroup.ts +72 -0
- package/src/types/ITouchPoints.ts +14 -0
- package/src/types/InteractionTypes.ts +6 -0
- package/src/types/InternalToolTypes.ts +19 -0
- package/src/types/JumpToSliceOptions.ts +7 -0
- package/src/types/LabelmapTypes.ts +41 -0
- package/src/types/PlanarBoundingBox.ts +8 -0
- package/src/types/SVGDrawingHelper.ts +10 -0
- package/src/types/ScrollOptions.ts +9 -0
- package/src/types/SegmentationStateTypes.ts +248 -0
- package/src/types/ToolHandle.ts +26 -0
- package/src/types/ToolProps.ts +16 -0
- package/src/types/ToolSpecificAnnotationTypes.ts +311 -0
- package/src/types/index.ts +115 -0
- package/src/utilities/boundingBox/extend2DBoundingBoxInViewAxis.ts +29 -0
- package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +57 -0
- package/src/utilities/boundingBox/index.ts +4 -0
- package/src/utilities/calibrateImageSpacing.ts +46 -0
- package/src/utilities/cine/events.ts +9 -0
- package/src/utilities/cine/index.ts +5 -0
- package/src/utilities/cine/playClip.ts +435 -0
- package/src/utilities/cine/state.ts +18 -0
- package/src/utilities/clip.js +30 -0
- package/src/utilities/debounce.js +217 -0
- package/src/utilities/drawing/getTextBoxCoordsCanvas.ts +45 -0
- package/src/utilities/drawing/index.ts +3 -0
- package/src/utilities/dynamicVolume/getDataInTime.ts +110 -0
- package/src/utilities/dynamicVolume/index.ts +2 -0
- package/src/utilities/getAnnotationNearPoint.ts +130 -0
- package/src/utilities/getModalityUnit.ts +11 -0
- package/src/utilities/getToolsWithModesForElement.ts +52 -0
- package/src/utilities/index.ts +68 -0
- package/src/utilities/isObject.js +29 -0
- package/src/utilities/math/angle/angleBetweenLines.ts +29 -0
- package/src/utilities/math/circle/_types.ts +6 -0
- package/src/utilities/math/circle/getCanvasCircleCorners.ts +23 -0
- package/src/utilities/math/circle/getCanvasCircleRadius.ts +16 -0
- package/src/utilities/math/circle/index.ts +4 -0
- package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +26 -0
- package/src/utilities/math/ellipse/index.ts +4 -0
- package/src/utilities/math/ellipse/pointInEllipse.ts +38 -0
- package/src/utilities/math/ellipse/pointInEllipsoidWithConstraint.ts +35 -0
- package/src/utilities/math/index.ts +8 -0
- package/src/utilities/math/line/distanceToPoint.ts +24 -0
- package/src/utilities/math/line/distanceToPointSquared.ts +44 -0
- package/src/utilities/math/line/index.ts +5 -0
- package/src/utilities/math/line/intersectLine.ts +92 -0
- package/src/utilities/math/midPoint.ts +24 -0
- package/src/utilities/math/point/distanceToPoint.ts +22 -0
- package/src/utilities/math/point/index.ts +3 -0
- package/src/utilities/math/polyline/addCanvasPointsToArray.ts +62 -0
- package/src/utilities/math/polyline/calculateAreaOfPoints.ts +23 -0
- package/src/utilities/math/polyline/getIntersectionWithPolyline.ts +182 -0
- package/src/utilities/math/polyline/getSubPixelSpacingAndXYDirections.ts +99 -0
- package/src/utilities/math/polyline/index.ts +19 -0
- package/src/utilities/math/polyline/planarFreehandROIInternalTypes.ts +36 -0
- package/src/utilities/math/polyline/pointCanProjectOnLine.ts +57 -0
- package/src/utilities/math/polyline/pointsAreWithinCloseContourProximity.ts +15 -0
- package/src/utilities/math/rectangle/distanceToPoint.ts +82 -0
- package/src/utilities/math/rectangle/index.ts +3 -0
- package/src/utilities/math/sphere/index.ts +3 -0
- package/src/utilities/math/sphere/pointInSphere.ts +31 -0
- package/src/utilities/math/vec2/findClosestPoint.ts +40 -0
- package/src/utilities/math/vec2/index.ts +4 -0
- package/src/utilities/math/vec2/liangBarksyClip.ts +84 -0
- package/src/utilities/orientation/getOrientationStringLPS.ts +52 -0
- package/src/utilities/orientation/index.ts +4 -0
- package/src/utilities/orientation/invertOrientationStringLPS.ts +21 -0
- package/src/utilities/planar/filterAnnotationsForDisplay.ts +68 -0
- package/src/utilities/planar/filterAnnotationsWithinSlice.ts +85 -0
- package/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +104 -0
- package/src/utilities/planar/getWorldWidthAndHeightFromCorners.ts +51 -0
- package/src/utilities/planar/getWorldWidthAndHeightFromTwoPoints.ts +51 -0
- package/src/utilities/planar/index.ts +18 -0
- package/src/utilities/planarFreehandROITool/index.ts +7 -0
- package/src/utilities/planarFreehandROITool/interpolateAnnotation.ts +87 -0
- package/src/utilities/planarFreehandROITool/interpolatePoints.ts +214 -0
- package/src/utilities/planarFreehandROITool/interpolation/algorithms/bspline.ts +55 -0
- package/src/utilities/planarFreehandROITool/interpolation/interpolateSegmentPoints.ts +90 -0
- package/src/utilities/pointInShapeCallback.ts +138 -0
- package/src/utilities/pointInSurroundingSphereCallback.ts +188 -0
- package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +76 -0
- package/src/utilities/rectangleROITool/index.ts +3 -0
- package/src/utilities/scroll.ts +62 -0
- package/src/utilities/segmentation/brushSizeForToolGroup.ts +72 -0
- package/src/utilities/segmentation/brushThresholdForToolGroup.ts +65 -0
- package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +74 -0
- package/src/utilities/segmentation/createMergedLabelmapForIndex.ts +65 -0
- package/src/utilities/segmentation/floodFill.ts +194 -0
- package/src/utilities/segmentation/getDefaultRepresentationConfig.ts +20 -0
- package/src/utilities/segmentation/index.ts +33 -0
- package/src/utilities/segmentation/isValidRepresentationConfig.ts +22 -0
- package/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +91 -0
- package/src/utilities/segmentation/thresholdSegmentationByRange.ts +129 -0
- package/src/utilities/segmentation/thresholdVolumeByRange.ts +150 -0
- package/src/utilities/segmentation/triggerSegmentationRender.ts +206 -0
- package/src/utilities/segmentation/utilities.ts +116 -0
- package/src/utilities/stackPrefetch/index.ts +8 -0
- package/src/utilities/stackPrefetch/stackPrefetch.ts +405 -0
- package/src/utilities/stackPrefetch/state.ts +17 -0
- package/src/utilities/throttle.js +69 -0
- package/src/utilities/touch/index.ts +246 -0
- package/src/utilities/triggerAnnotationRender.ts +237 -0
- package/src/utilities/triggerAnnotationRenderForViewportIds.ts +18 -0
- package/src/utilities/viewport/index.ts +5 -0
- package/src/utilities/viewport/isViewportPreScaled.ts +24 -0
- package/src/utilities/viewport/jumpToSlice.ts +73 -0
- package/src/utilities/viewport/jumpToWorld.ts +58 -0
- package/src/utilities/viewportFilters/filterViewportsWithFrameOfReferenceUID.ts +28 -0
- package/src/utilities/viewportFilters/filterViewportsWithParallelNormals.ts +26 -0
- package/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +15 -0
- package/src/utilities/viewportFilters/filterViewportsWithToolEnabled.ts +72 -0
- package/src/utilities/viewportFilters/getViewportIdsWithToolToRender.ts +45 -0
- package/src/utilities/viewportFilters/index.ts +11 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getEnabledElement,
|
|
3
|
+
StackViewport,
|
|
4
|
+
imageLoader,
|
|
5
|
+
Enums,
|
|
6
|
+
eventTarget,
|
|
7
|
+
imageLoadPoolManager,
|
|
8
|
+
cache,
|
|
9
|
+
getConfiguration as getCoreConfiguration,
|
|
10
|
+
} from '@cornerstonejs/core';
|
|
11
|
+
import { addToolState, getToolState } from './state';
|
|
12
|
+
|
|
13
|
+
const requestType = Enums.RequestType.Prefetch;
|
|
14
|
+
const priority = 0;
|
|
15
|
+
const addToBeginning = true;
|
|
16
|
+
|
|
17
|
+
let configuration = {
|
|
18
|
+
maxImagesToPrefetch: Infinity,
|
|
19
|
+
preserveExistingPool: false,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let resetPrefetchTimeout;
|
|
23
|
+
const resetPrefetchDelay = 10;
|
|
24
|
+
|
|
25
|
+
function range(lowEnd, highEnd) {
|
|
26
|
+
// Javascript version of Python's range function
|
|
27
|
+
// http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl
|
|
28
|
+
lowEnd = Math.round(lowEnd) || 0;
|
|
29
|
+
highEnd = Math.round(highEnd) || 0;
|
|
30
|
+
|
|
31
|
+
const arr = [];
|
|
32
|
+
let c = highEnd - lowEnd + 1;
|
|
33
|
+
|
|
34
|
+
if (c <= 0) {
|
|
35
|
+
return arr;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
while (c--) {
|
|
39
|
+
arr[c] = highEnd--;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return arr;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function nearestIndex(arr, x) {
|
|
46
|
+
// Return index of nearest values in array
|
|
47
|
+
// http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array
|
|
48
|
+
let low = 0;
|
|
49
|
+
let high = arr.length - 1;
|
|
50
|
+
|
|
51
|
+
arr.forEach((v, idx) => {
|
|
52
|
+
if (v < x) {
|
|
53
|
+
low = Math.max(idx, low);
|
|
54
|
+
} else if (v > x) {
|
|
55
|
+
high = Math.min(idx, high);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return { low, high };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function getStackData(element) {
|
|
63
|
+
const enabledElement = getEnabledElement(element);
|
|
64
|
+
|
|
65
|
+
if (!enabledElement) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
'stackPrefetch: element must be a valid Cornerstone enabled element'
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const { viewport } = enabledElement;
|
|
72
|
+
|
|
73
|
+
if (!(viewport instanceof StackViewport)) {
|
|
74
|
+
throw new Error(
|
|
75
|
+
'stackPrefetch: element must be a StackViewport, VolumeViewport stackPrefetch not yet implemented'
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
currentImageIdIndex: viewport.getCurrentImageIdIndex(),
|
|
81
|
+
imageIds: viewport.getImageIds(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function prefetch(element) {
|
|
86
|
+
// Get the stackPrefetch tool data
|
|
87
|
+
const stackPrefetchData = getToolState(element);
|
|
88
|
+
|
|
89
|
+
if (!stackPrefetchData) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const stackPrefetch = stackPrefetchData || {};
|
|
94
|
+
const stack = getStackData(element);
|
|
95
|
+
|
|
96
|
+
if (!stack || !stack.imageIds || stack.imageIds.length === 0) {
|
|
97
|
+
console.warn('CornerstoneTools.stackPrefetch: No images in stack.');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// If all the requests are complete, disable the stackPrefetch tool
|
|
102
|
+
if (
|
|
103
|
+
!stackPrefetch.indicesToRequest ||
|
|
104
|
+
!stackPrefetch.indicesToRequest.length
|
|
105
|
+
) {
|
|
106
|
+
stackPrefetch.enabled = false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Make sure the tool is still enabled
|
|
110
|
+
if (stackPrefetch.enabled === false) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Remove an imageIdIndex from the list of indices to request
|
|
115
|
+
// This fires when the individual image loading deferred is resolved
|
|
116
|
+
function removeFromList(imageIdIndex) {
|
|
117
|
+
const index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);
|
|
118
|
+
|
|
119
|
+
if (index > -1) {
|
|
120
|
+
// Don't remove last element if imageIdIndex not found
|
|
121
|
+
stackPrefetch.indicesToRequest.splice(index, 1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Remove all already cached images from the
|
|
126
|
+
// IndicesToRequest array
|
|
127
|
+
stackPrefetchData.indicesToRequest.sort((a, b) => a - b);
|
|
128
|
+
const indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();
|
|
129
|
+
|
|
130
|
+
indicesToRequestCopy.forEach(function (imageIdIndex) {
|
|
131
|
+
const imageId = stack.imageIds[imageIdIndex];
|
|
132
|
+
|
|
133
|
+
if (!imageId) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const imageLoadObject = cache.getImageLoadObject(imageId);
|
|
138
|
+
|
|
139
|
+
if (imageLoadObject) {
|
|
140
|
+
removeFromList(imageIdIndex);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Stop here if there are no images left to request
|
|
145
|
+
// After those in the cache have been removed
|
|
146
|
+
if (!stackPrefetch.indicesToRequest.length) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Clear the requestPool of prefetch requests, if needed.
|
|
151
|
+
if (!configuration.preserveExistingPool) {
|
|
152
|
+
imageLoadPoolManager.clearRequestStack(requestType);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Identify the nearest imageIdIndex to the currentImageIdIndex
|
|
156
|
+
const nearest = nearestIndex(
|
|
157
|
+
stackPrefetch.indicesToRequest,
|
|
158
|
+
stack.currentImageIdIndex
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
let imageId;
|
|
162
|
+
let nextImageIdIndex;
|
|
163
|
+
const preventCache = false;
|
|
164
|
+
|
|
165
|
+
function doneCallback(image) {
|
|
166
|
+
console.log('prefetch done: %s', image.imageId);
|
|
167
|
+
const imageIdIndex = stack.imageIds.indexOf(image.imageId);
|
|
168
|
+
|
|
169
|
+
removeFromList(imageIdIndex);
|
|
170
|
+
|
|
171
|
+
// triggerEvent(element, EVENTS.STACK_PREFETCH_IMAGE_LOADED, {
|
|
172
|
+
// element,
|
|
173
|
+
// imageId: image.imageId,
|
|
174
|
+
// imageIndex: imageIdIndex,
|
|
175
|
+
// stackPrefetch,
|
|
176
|
+
// stack,
|
|
177
|
+
// });
|
|
178
|
+
|
|
179
|
+
// If there are no more images to fetch
|
|
180
|
+
// if (
|
|
181
|
+
// !(
|
|
182
|
+
// stackPrefetch.indicesToRequest &&
|
|
183
|
+
// stackPrefetch.indicesToRequest.length > 0
|
|
184
|
+
// )
|
|
185
|
+
// ) {
|
|
186
|
+
// triggerEvent(element, EVENTS.STACK_PREFETCH_DONE, {
|
|
187
|
+
// element,
|
|
188
|
+
// stackPrefetch,
|
|
189
|
+
// stack,
|
|
190
|
+
// });
|
|
191
|
+
// }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Retrieve the errorLoadingHandler if one exists
|
|
195
|
+
// const errorLoadingHandler =
|
|
196
|
+
// loadHandlerManager.getErrorLoadingHandler(element);
|
|
197
|
+
|
|
198
|
+
// function failCallback(error) {
|
|
199
|
+
// logger.log('prefetch errored: %o', error);
|
|
200
|
+
// if (errorLoadingHandler) {
|
|
201
|
+
// errorLoadingHandler(element, imageId, error, 'stackPrefetch');
|
|
202
|
+
// }
|
|
203
|
+
// }
|
|
204
|
+
|
|
205
|
+
// Prefetch images around the current image (before and after)
|
|
206
|
+
let lowerIndex = nearest.low;
|
|
207
|
+
let higherIndex = nearest.high;
|
|
208
|
+
const imageIdsToPrefetch = [];
|
|
209
|
+
|
|
210
|
+
while (
|
|
211
|
+
lowerIndex >= 0 ||
|
|
212
|
+
higherIndex < stackPrefetch.indicesToRequest.length
|
|
213
|
+
) {
|
|
214
|
+
const currentIndex = stack.currentImageIdIndex;
|
|
215
|
+
const shouldSkipLower =
|
|
216
|
+
currentIndex - stackPrefetch.indicesToRequest[lowerIndex] >
|
|
217
|
+
configuration.maxImagesToPrefetch;
|
|
218
|
+
const shouldSkipHigher =
|
|
219
|
+
stackPrefetch.indicesToRequest[higherIndex] - currentIndex >
|
|
220
|
+
configuration.maxImagesToPrefetch;
|
|
221
|
+
|
|
222
|
+
const shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;
|
|
223
|
+
const shouldLoadHigher =
|
|
224
|
+
!shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;
|
|
225
|
+
|
|
226
|
+
if (!shouldLoadHigher && !shouldLoadLower) {
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (shouldLoadLower) {
|
|
231
|
+
nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];
|
|
232
|
+
imageId = stack.imageIds[nextImageIdIndex];
|
|
233
|
+
imageIdsToPrefetch.push(imageId);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (shouldLoadHigher) {
|
|
237
|
+
nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];
|
|
238
|
+
imageId = stack.imageIds[nextImageIdIndex];
|
|
239
|
+
imageIdsToPrefetch.push(imageId);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const requestFn = (imageId, options) =>
|
|
244
|
+
imageLoader.loadAndCacheImage(imageId, options);
|
|
245
|
+
|
|
246
|
+
const { useNorm16Texture } = getCoreConfiguration().rendering;
|
|
247
|
+
|
|
248
|
+
imageIdsToPrefetch.forEach((imageId) => {
|
|
249
|
+
// IMPORTANT: Request type should be passed if not the 'interaction'
|
|
250
|
+
// highest priority will be used for the request type in the imageRetrievalPool
|
|
251
|
+
const options = {
|
|
252
|
+
targetBuffer: {
|
|
253
|
+
type: useNorm16Texture ? undefined : 'Float32Array',
|
|
254
|
+
},
|
|
255
|
+
preScale: {
|
|
256
|
+
enabled: true,
|
|
257
|
+
},
|
|
258
|
+
requestType,
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
imageLoadPoolManager.addRequest(
|
|
262
|
+
requestFn.bind(null, imageId, options),
|
|
263
|
+
requestType,
|
|
264
|
+
// Additional details
|
|
265
|
+
{
|
|
266
|
+
imageId,
|
|
267
|
+
},
|
|
268
|
+
priority
|
|
269
|
+
// addToBeginning
|
|
270
|
+
);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function getPromiseRemovedHandler(element) {
|
|
275
|
+
return function (e) {
|
|
276
|
+
const eventData = e.detail;
|
|
277
|
+
|
|
278
|
+
// When an imagePromise has been pushed out of the cache, re-add its index
|
|
279
|
+
// It to the indicesToRequest list so that it will be retrieved later if the
|
|
280
|
+
// CurrentImageIdIndex is changed to an image nearby
|
|
281
|
+
let stackData;
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
// It will throw an exception in some cases (eg: thumbnails)
|
|
285
|
+
stackData = getStackData(element);
|
|
286
|
+
} catch (error) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (!stackData || !stackData.imageIds || stackData.imageIds.length === 0) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const stack = stackData;
|
|
295
|
+
const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);
|
|
296
|
+
|
|
297
|
+
// Make sure the image that was removed is actually in this stack
|
|
298
|
+
// Before adding it to the indicesToRequest array
|
|
299
|
+
if (imageIdIndex < 0) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const stackPrefetchData = getToolState(element);
|
|
304
|
+
|
|
305
|
+
if (
|
|
306
|
+
!stackPrefetchData ||
|
|
307
|
+
!stackPrefetchData.data ||
|
|
308
|
+
!stackPrefetchData.data.length
|
|
309
|
+
) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
stackPrefetchData.indicesToRequest.push(imageIdIndex);
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function onImageUpdated(e) {
|
|
318
|
+
// Start prefetching again (after a delay)
|
|
319
|
+
// When the user has scrolled to a new image
|
|
320
|
+
clearTimeout(resetPrefetchTimeout);
|
|
321
|
+
resetPrefetchTimeout = setTimeout(function () {
|
|
322
|
+
const element = e.target;
|
|
323
|
+
|
|
324
|
+
// If playClip is enabled and the user loads a different series in the viewport
|
|
325
|
+
// An exception will be thrown because the element will not be enabled anymore
|
|
326
|
+
try {
|
|
327
|
+
prefetch(element);
|
|
328
|
+
} catch (error) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
}, resetPrefetchDelay);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function enable(element) {
|
|
335
|
+
const stack = getStackData(element);
|
|
336
|
+
|
|
337
|
+
if (!stack || !stack.imageIds || stack.imageIds.length === 0) {
|
|
338
|
+
console.warn('CornerstoneTools.stackPrefetch: No images in stack.');
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Use the currentImageIdIndex from the stack as the initialImageIdIndex
|
|
343
|
+
const stackPrefetchData = {
|
|
344
|
+
indicesToRequest: range(0, stack.imageIds.length - 1),
|
|
345
|
+
enabled: true,
|
|
346
|
+
direction: 1,
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
// Remove the currentImageIdIndex from the list to request
|
|
350
|
+
const indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(
|
|
351
|
+
stack.currentImageIdIndex
|
|
352
|
+
);
|
|
353
|
+
|
|
354
|
+
stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);
|
|
355
|
+
|
|
356
|
+
addToolState(element, stackPrefetchData);
|
|
357
|
+
|
|
358
|
+
prefetch(element);
|
|
359
|
+
|
|
360
|
+
element.removeEventListener(Enums.Events.STACK_NEW_IMAGE, onImageUpdated);
|
|
361
|
+
element.addEventListener(Enums.Events.STACK_NEW_IMAGE, onImageUpdated);
|
|
362
|
+
|
|
363
|
+
const promiseRemovedHandler = getPromiseRemovedHandler(element);
|
|
364
|
+
|
|
365
|
+
eventTarget.removeEventListener(
|
|
366
|
+
Enums.Events.IMAGE_CACHE_IMAGE_REMOVED,
|
|
367
|
+
promiseRemovedHandler
|
|
368
|
+
);
|
|
369
|
+
eventTarget.addEventListener(
|
|
370
|
+
Enums.Events.IMAGE_CACHE_IMAGE_REMOVED,
|
|
371
|
+
promiseRemovedHandler
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function disable(element) {
|
|
376
|
+
clearTimeout(resetPrefetchTimeout);
|
|
377
|
+
element.removeEventListener(Enums.Events.STACK_NEW_IMAGE, onImageUpdated);
|
|
378
|
+
|
|
379
|
+
const promiseRemovedHandler = getPromiseRemovedHandler(element);
|
|
380
|
+
|
|
381
|
+
eventTarget.removeEventListener(
|
|
382
|
+
Enums.Events.IMAGE_CACHE_IMAGE_REMOVED,
|
|
383
|
+
promiseRemovedHandler
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
const stackPrefetchData = getToolState(element);
|
|
387
|
+
// If there is actually something to disable, disable it
|
|
388
|
+
|
|
389
|
+
if (stackPrefetchData && stackPrefetchData.data.length) {
|
|
390
|
+
stackPrefetchData.enabled = false;
|
|
391
|
+
|
|
392
|
+
// Clear current prefetch requests from the requestPool
|
|
393
|
+
imageLoadPoolManager.clearRequestStack(requestType);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function getConfiguration() {
|
|
398
|
+
return configuration;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function setConfiguration(config) {
|
|
402
|
+
configuration = config;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export { enable, disable, getConfiguration, setConfiguration };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getEnabledElement } from '@cornerstonejs/core';
|
|
2
|
+
|
|
3
|
+
const state: Record<number, any> = {};
|
|
4
|
+
|
|
5
|
+
function addToolState(element: HTMLDivElement, data): void {
|
|
6
|
+
const enabledElement = getEnabledElement(element);
|
|
7
|
+
const { viewportId } = enabledElement;
|
|
8
|
+
state[viewportId] = data;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function getToolState(element: HTMLDivElement): any {
|
|
12
|
+
const enabledElement = getEnabledElement(element);
|
|
13
|
+
const { viewportId } = enabledElement;
|
|
14
|
+
return state[viewportId];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { addToolState, getToolState };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import debounce from './debounce';
|
|
2
|
+
import isObject from './isObject';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates a throttled function that only invokes `func` at most once per
|
|
6
|
+
* every `wait` milliseconds (or once per browser frame). The throttled function
|
|
7
|
+
* comes with a `cancel` method to cancel delayed `func` invocations and a
|
|
8
|
+
* `flush` method to immediately invoke them. Provide `options` to indicate
|
|
9
|
+
* whether `func` should be invoked on the leading and/or trailing edge of the
|
|
10
|
+
* `wait` timeout. The `func` is invoked with the last arguments provided to the
|
|
11
|
+
* throttled function. Subsequent calls to the throttled function return the
|
|
12
|
+
* result of the last `func` invocation.
|
|
13
|
+
*
|
|
14
|
+
* **Note:** If `leading` and `trailing` options are `true`, `func` is
|
|
15
|
+
* invoked on the trailing edge of the timeout only if the throttled function
|
|
16
|
+
* is invoked more than once during the `wait` timeout.
|
|
17
|
+
*
|
|
18
|
+
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
|
|
19
|
+
* until the next tick, similar to `setTimeout` with a timeout of `0`.
|
|
20
|
+
*
|
|
21
|
+
* If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
|
|
22
|
+
* invocation will be deferred until the next frame is drawn (typically about
|
|
23
|
+
* 16ms).
|
|
24
|
+
*
|
|
25
|
+
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
|
|
26
|
+
* for details over the differences between `throttle` and `debounce`.
|
|
27
|
+
*
|
|
28
|
+
* @param {Function} func The function to throttle.
|
|
29
|
+
* @param {number} [wait=0]
|
|
30
|
+
* The number of milliseconds to throttle invocations to; if omitted,
|
|
31
|
+
* `requestAnimationFrame` is used (if available).
|
|
32
|
+
* @param {Object} [options={}] The options object.
|
|
33
|
+
* @param {boolean} [options.leading=true]
|
|
34
|
+
* Specify invoking on the leading edge of the timeout.
|
|
35
|
+
* @param {boolean} [options.trailing=true]
|
|
36
|
+
* Specify invoking on the trailing edge of the timeout.
|
|
37
|
+
* @returns {Function} Returns the new throttled function.
|
|
38
|
+
* @example
|
|
39
|
+
*
|
|
40
|
+
* // Avoid excessively updating the position while scrolling.
|
|
41
|
+
* jQuery(window).on('scroll', throttle(updatePosition, 100))
|
|
42
|
+
*
|
|
43
|
+
* // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
|
|
44
|
+
* const throttled = throttle(renewToken, 300000, { 'trailing': false })
|
|
45
|
+
* jQuery(element).on('click', throttled)
|
|
46
|
+
*
|
|
47
|
+
* // Cancel the trailing throttled invocation.
|
|
48
|
+
* jQuery(window).on('popstate', throttled.cancel)
|
|
49
|
+
*/
|
|
50
|
+
function throttle(func, wait, options) {
|
|
51
|
+
let leading = true;
|
|
52
|
+
let trailing = true;
|
|
53
|
+
|
|
54
|
+
if (typeof func !== 'function') {
|
|
55
|
+
throw new TypeError('Expected a function');
|
|
56
|
+
}
|
|
57
|
+
if (isObject(options)) {
|
|
58
|
+
leading = 'leading' in options ? Boolean(options.leading) : leading;
|
|
59
|
+
trailing = 'trailing' in options ? Boolean(options.trailing) : trailing;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return debounce(func, wait, {
|
|
63
|
+
leading,
|
|
64
|
+
trailing,
|
|
65
|
+
maxWait: wait,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default throttle;
|