@cornerstonejs/core 3.28.3 → 3.29.0

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.
@@ -0,0 +1 @@
1
+ export declare function asArray<T>(item: T | T[]): T[];
@@ -0,0 +1,6 @@
1
+ export function asArray(item) {
2
+ if (Array.isArray(item)) {
3
+ return item;
4
+ }
5
+ return [item];
6
+ }
@@ -14,12 +14,19 @@ export declare class HistoryMemo {
14
14
  private redoAvailable;
15
15
  private undoAvailable;
16
16
  private ring;
17
+ private isRecordingGrouped;
17
18
  constructor(label?: string, size?: number);
18
19
  get size(): number;
19
20
  set size(newSize: number);
20
21
  undo(items?: number): void;
21
- undoIf(condition: (item: Memo) => boolean): boolean;
22
+ undoIf(condition: (item: Memo | Memo[]) => boolean): boolean;
23
+ private dispatchHistoryEvent;
22
24
  redo(items?: number): void;
25
+ private initializeGroupItem;
26
+ startGroupRecording(): void;
27
+ private rollbackUnusedGroupItem;
28
+ endGroupRecording(): void;
29
+ private pushGrouped;
23
30
  push(item: Memo | Memoable): Memo;
24
31
  }
25
32
  declare const DefaultHistoryMemo: HistoryMemo;
@@ -1,4 +1,5 @@
1
1
  import eventTarget from '../../eventTarget';
2
+ import { asArray } from '../asArray';
2
3
  const Events = {
3
4
  HISTORY_UNDO: 'CORNERSTONE_TOOLS_HISTORY_UNDO',
4
5
  HISTORY_REDO: 'CORNERSTONE_TOOLS_HISTORY_REDO',
@@ -9,6 +10,7 @@ export class HistoryMemo {
9
10
  this.redoAvailable = 0;
10
11
  this.undoAvailable = 0;
11
12
  this.ring = new Array();
13
+ this.isRecordingGrouped = false;
12
14
  this.label = label;
13
15
  this._size = size;
14
16
  }
@@ -25,16 +27,9 @@ export class HistoryMemo {
25
27
  undo(items = 1) {
26
28
  while (items > 0 && this.undoAvailable > 0) {
27
29
  const item = this.ring[this.position];
28
- item.restoreMemo(true);
29
- if (item.id) {
30
- eventTarget.dispatchEvent(new CustomEvent(Events.HISTORY_UNDO, {
31
- detail: {
32
- isUndo: true,
33
- id: item.id,
34
- operationType: item.operationType || 'annotation',
35
- memo: item,
36
- },
37
- }));
30
+ for (const subitem of asArray(item).reverse()) {
31
+ subitem.restoreMemo(true);
32
+ this.dispatchHistoryEvent({ item: subitem, isUndo: true });
38
33
  }
39
34
  items--;
40
35
  this.redoAvailable++;
@@ -49,20 +44,25 @@ export class HistoryMemo {
49
44
  }
50
45
  return false;
51
46
  }
47
+ dispatchHistoryEvent({ item, isUndo }) {
48
+ if (item.id) {
49
+ eventTarget.dispatchEvent(new CustomEvent(isUndo ? Events.HISTORY_UNDO : Events.HISTORY_REDO, {
50
+ detail: {
51
+ isUndo,
52
+ id: item.id,
53
+ operationType: item.operationType || 'annotation',
54
+ memo: item,
55
+ },
56
+ }));
57
+ }
58
+ }
52
59
  redo(items = 1) {
53
60
  while (items > 0 && this.redoAvailable > 0) {
54
61
  const newPosition = (this.position + 1) % this.size;
55
62
  const item = this.ring[newPosition];
56
- item.restoreMemo(false);
57
- if (item.id) {
58
- eventTarget.dispatchEvent(new CustomEvent(Events.HISTORY_REDO, {
59
- detail: {
60
- isUndo: false,
61
- id: item.id,
62
- operationType: item.operationType || 'annotation',
63
- memo: item,
64
- },
65
- }));
63
+ for (const subitem of asArray(item).reverse()) {
64
+ subitem.restoreMemo(false);
65
+ this.dispatchHistoryEvent({ item: subitem, isUndo: false });
66
66
  }
67
67
  items--;
68
68
  this.position = newPosition;
@@ -70,6 +70,39 @@ export class HistoryMemo {
70
70
  this.redoAvailable--;
71
71
  }
72
72
  }
73
+ initializeGroupItem() {
74
+ this.redoAvailable = 0;
75
+ if (this.undoAvailable < this._size) {
76
+ this.undoAvailable++;
77
+ }
78
+ this.position = (this.position + 1) % this._size;
79
+ this.ring[this.position] = [];
80
+ }
81
+ startGroupRecording() {
82
+ this.isRecordingGrouped = true;
83
+ this.initializeGroupItem();
84
+ }
85
+ rollbackUnusedGroupItem() {
86
+ this.ring[this.position] = undefined;
87
+ this.position = (this.position - 1) % this._size;
88
+ this.undoAvailable--;
89
+ }
90
+ endGroupRecording() {
91
+ this.isRecordingGrouped = false;
92
+ const lastItem = this.ring[this.position];
93
+ const lastItemIsEmpty = Array.isArray(lastItem) && lastItem.length === 0;
94
+ if (lastItemIsEmpty) {
95
+ this.rollbackUnusedGroupItem();
96
+ }
97
+ }
98
+ pushGrouped(memo) {
99
+ const lastMemo = this.ring[this.position];
100
+ if (Array.isArray(lastMemo)) {
101
+ lastMemo.push(memo);
102
+ return memo;
103
+ }
104
+ throw new Error('Last item should be an array for grouped memos.');
105
+ }
73
106
  push(item) {
74
107
  if (!item) {
75
108
  return;
@@ -80,6 +113,9 @@ export class HistoryMemo {
80
113
  if (!memo) {
81
114
  return;
82
115
  }
116
+ if (this.isRecordingGrouped) {
117
+ return this.pushGrouped(memo);
118
+ }
83
119
  this.redoAvailable = 0;
84
120
  if (this.undoAvailable < this._size) {
85
121
  this.undoAvailable++;
@@ -93,6 +93,7 @@ import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds';
93
93
  export * as logger from './logger';
94
94
  import { calculateNeighborhoodStats } from './calculateNeighborhoodStats';
95
95
  import getPixelSpacingInformation from './getPixelSpacingInformation';
96
+ import { asArray } from './asArray';
96
97
  declare const getViewportModality: (viewport: IViewport, volumeId?: string) => string;
97
98
  export * from './isEqual';
98
- export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, };
99
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, asArray, };
@@ -94,6 +94,7 @@ import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds';
94
94
  export * as logger from './logger';
95
95
  import { calculateNeighborhoodStats } from './calculateNeighborhoodStats';
96
96
  import getPixelSpacingInformation from './getPixelSpacingInformation';
97
+ import { asArray } from './asArray';
97
98
  const getViewportModality = (viewport, volumeId) => _getViewportModality(viewport, volumeId, cache.getVolume);
98
99
  export * from './isEqual';
99
- export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, };
100
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, asArray, };
@@ -1 +1 @@
1
- export declare const version = "3.28.3";
1
+ export declare const version = "3.29.0";
@@ -1 +1 @@
1
- export const version = '3.28.3';
1
+ export const version = '3.29.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "3.28.3",
3
+ "version": "3.29.0",
4
4
  "description": "Cornerstone3D Core",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -97,5 +97,5 @@
97
97
  "type": "individual",
98
98
  "url": "https://ohif.org/donate"
99
99
  },
100
- "gitHead": "06f1b0e842571749290d9409ebe41b99315b1ec5"
100
+ "gitHead": "4a25ee32eab069c6e6bbab5c9a274af38621de09"
101
101
  }