diff --git a/extensions/cornerstone-dicom-seg/package.json b/extensions/cornerstone-dicom-seg/package.json index 23235efe5..563b9c2d6 100644 --- a/extensions/cornerstone-dicom-seg/package.json +++ b/extensions/cornerstone-dicom-seg/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.66.7", - "@cornerstonejs/core": "^1.66.7", + "@cornerstonejs/adapters": "^1.67.0", + "@cornerstonejs/core": "^1.67.0", "@kitware/vtk.js": "29.7.0", "react-color": "^2.19.3" } diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index 523b893eb..62bf6d41c 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,9 +46,9 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.66.7", - "@cornerstonejs/core": "^1.66.7", - "@cornerstonejs/tools": "^1.66.7", + "@cornerstonejs/adapters": "^1.67.0", + "@cornerstonejs/core": "^1.67.0", + "@cornerstonejs/tools": "^1.67.0", "classnames": "^2.3.2" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 49c52eb69..6e72ed150 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -38,7 +38,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.66.7", + "@cornerstonejs/dicom-image-loader": "^1.67.0", "@icr/polyseg-wasm": "^0.4.0", "@ohif/core": "3.8.0-beta.65", "@ohif/ui": "3.8.0-beta.65", @@ -55,10 +55,10 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.66.7", - "@cornerstonejs/core": "^1.66.7", - "@cornerstonejs/streaming-image-volume-loader": "^1.66.7", - "@cornerstonejs/tools": "^1.66.7", + "@cornerstonejs/adapters": "^1.67.0", + "@cornerstonejs/core": "^1.67.0", + "@cornerstonejs/streaming-image-volume-loader": "^1.67.0", + "@cornerstonejs/tools": "^1.67.0", "@kitware/vtk.js": "29.7.0", "html2canvas": "^1.4.1", "lodash.debounce": "4.0.8", diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 1a7401340..cef68c8fa 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -745,9 +745,6 @@ function commandsModule({ setViewportColormap: { commandFn: actions.setViewportColormap, }, - toggleImageSliceSync: { - commandFn: actions.toggleImageSliceSync, - }, setSourceViewportForReferenceLinesTool: { commandFn: actions.setSourceViewportForReferenceLinesTool, }, diff --git a/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts b/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts index b6ff441e8..d0cb075bb 100644 --- a/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts +++ b/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts @@ -696,20 +696,24 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi this.viewportsDisplaySets.set(viewport.id, displaySetInstanceUIDs); - if (hangingProtocolService.getShouldPerformCustomImageLoad()) { - // delegate the volume loading to the hanging protocol service if it has a custom image load strategy - return hangingProtocolService.runImageLoadStrategy({ - viewportId: viewport.id, - volumeInputArray, + const volumesNotLoaded = volumeToLoad.filter(volume => !volume.loadStatus.loaded); + + if (volumesNotLoaded.length) { + if (hangingProtocolService.getShouldPerformCustomImageLoad()) { + // delegate the volume loading to the hanging protocol service if it has a custom image load strategy + return hangingProtocolService.runImageLoadStrategy({ + viewportId: viewport.id, + volumeInputArray, + }); + } + + volumesNotLoaded.forEach(volume => { + if (!volume.loadStatus.loading) { + volume.load(); + } }); } - volumeToLoad.forEach(volume => { - if (!volume.loadStatus.loaded && !volume.loadStatus.loading) { - volume.load(); - } - }); - // This returns the async continuation only return this.setVolumesForViewport(viewport, volumeInputArray, presentations); } diff --git a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx index e06488d3d..68a6ada3d 100644 --- a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx +++ b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx @@ -1,11 +1,11 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import html2canvas from 'html2canvas'; import { Enums, getEnabledElement, getOrCreateCanvas, StackViewport, - VolumeViewport, + BaseVolumeViewport, } from '@cornerstonejs/core'; import { ToolGroupManager } from '@cornerstonejs/tools'; import PropTypes from 'prop-types'; @@ -154,7 +154,7 @@ const CornerstoneViewportDownloadForm = ({ console.warn('Unable to set properties', e); } }); - } else if (downloadViewport instanceof VolumeViewport) { + } else if (downloadViewport instanceof BaseVolumeViewport) { const actors = viewport.getActors(); // downloadViewport.setActors(actors); actors.forEach(actor => { diff --git a/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx b/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx index 8428472dd..f286ce305 100644 --- a/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx +++ b/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx @@ -52,45 +52,28 @@ const generateAdvancedPresets = hangingProtocolService => { .filter(preset => preset !== null); }; -function ToolbarLayoutSelectorWithServices({ servicesManager, ...props }) { - const { toolbarService } = servicesManager.services; - +function ToolbarLayoutSelectorWithServices({ commandsManager, servicesManager, ...props }) { const [isDisabled, setIsDisabled] = useState(false); const handleMouseEnter = () => { setIsDisabled(false); }; - const onSelection = useCallback( - props => { - toolbarService.recordInteraction({ - interactionType: 'action', - commands: [ - { - commandName: 'setViewportGridLayout', - commandOptions: { ...props }, - }, - ], - }); - setIsDisabled(true); - }, - [toolbarService] - ); - const onSelectionPreset = useCallback( - props => { - toolbarService.recordInteraction({ - interactionType: 'action', - commands: [ - { - commandName: 'setHangingProtocol', - commandOptions: { ...props }, - }, - ], - }); - setIsDisabled(true); - }, - [toolbarService] - ); + const onSelection = useCallback(props => { + commandsManager.run({ + commandName: 'setViewportGridLayout', + commandOptions: { ...props }, + }); + setIsDisabled(true); + }, []); + + const onSelectionPreset = useCallback(props => { + commandsManager.run({ + commandName: 'setHangingProtocol', + commandOptions: { ...props }, + }); + setIsDisabled(true); + }, []); return (
@@ -151,7 +134,7 @@ function LayoutSelector({ disableToolTip={tooltipDisabled} dropdownContent={ DropdownContent !== null && ( -
+
Common
@@ -159,7 +142,7 @@ function LayoutSelector({ {commonPresets.map((preset, index) => ( ( + ToolbarLayoutSelectorWithServices({ ...props, commandsManager, servicesManager }), }, { name: 'ohif.buttonGroup', diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 8789e751d..5e356ebcd 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "^1.66.7", - "@cornerstonejs/tools": "^1.66.7", + "@cornerstonejs/core": "^1.67.0", + "@cornerstonejs/tools": "^1.67.0", "@ohif/core": "3.8.0-beta.65", "@ohif/extension-cornerstone-dicom-sr": "3.8.0-beta.65", "@ohif/ui": "3.8.0-beta.65", diff --git a/modes/basic-test-mode/src/toolbarButtons.ts b/modes/basic-test-mode/src/toolbarButtons.ts index 2e1517676..81a0ceb57 100644 --- a/modes/basic-test-mode/src/toolbarButtons.ts +++ b/modes/basic-test-mode/src/toolbarButtons.ts @@ -179,15 +179,7 @@ const toolbarButtons: Button[] = [ type: 'tool', icon: 'tool-3d-rotate', label: '3D Rotate', - commands: [ - { - commandName: 'setToolActive', - commandOptions: { - toolName: 'TrackBallRotate', - }, - context: 'CORNERSTONE', - }, - ], + commands: setToolActiveToolbar, }, }, { @@ -196,11 +188,7 @@ const toolbarButtons: Button[] = [ props: { icon: 'tool-capture', label: 'Capture', - commands: [ - { - commandName: 'showDownloadViewportModal', - }, - ], + commands: 'showDownloadViewportModal', evaluate: 'evaluate.action', }, }, diff --git a/modes/longitudinal/src/toolbarButtons.ts b/modes/longitudinal/src/toolbarButtons.ts index 76217b29f..55d63b470 100644 --- a/modes/longitudinal/src/toolbarButtons.ts +++ b/modes/longitudinal/src/toolbarButtons.ts @@ -169,11 +169,7 @@ const toolbarButtons: Button[] = [ props: { icon: 'tool-capture', label: 'Capture', - commands: [ - { - commandName: 'showDownloadViewportModal', - }, - ], + commands: 'showDownloadViewportModal', evaluate: 'evaluate.action', }, }, @@ -184,11 +180,6 @@ const toolbarButtons: Button[] = [ rows: 3, columns: 4, evaluate: 'evaluate.action', - commands: [ - { - commandName: 'setViewportGridLayout', - }, - ], }, }, { diff --git a/platform/app/package.json b/platform/app/package.json index 97ed64d70..2ee3173e3 100644 --- a/platform/app/package.json +++ b/platform/app/package.json @@ -53,7 +53,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^1.66.7", + "@cornerstonejs/dicom-image-loader": "^1.67.0", "@emotion/serialize": "^1.1.3", "@ohif/core": "3.8.0-beta.65", "@ohif/extension-cornerstone": "3.8.0-beta.65", diff --git a/platform/core/package.json b/platform/core/package.json index 3f57f8a19..85b0587a3 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -37,7 +37,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.66.7", + "@cornerstonejs/dicom-image-loader": "^1.67.0", "@ohif/ui": "3.8.0-beta.65", "cornerstone-math": "0.1.9", "dicom-parser": "^1.8.21" diff --git a/platform/ui/src/components/SplitButton/SplitButton.tsx b/platform/ui/src/components/SplitButton/SplitButton.tsx index 556f44570..8ba84c4ba 100644 --- a/platform/ui/src/components/SplitButton/SplitButton.tsx +++ b/platform/ui/src/components/SplitButton/SplitButton.tsx @@ -9,7 +9,7 @@ import Tooltip from '../Tooltip'; import ListMenu from '../ListMenu'; const baseClasses = { - Button: 'flex items-center rounded-md border-transparent cursor-pointer group/button', + Button: 'flex items-center rounded-md border-transparent group/button', Primary: 'h-full border-l-2 border-t-2 border-b-2 rounded-tl-md rounded-bl-md group/primary !pl-2 !py-2', Secondary: diff --git a/platform/ui/src/components/ToolbarButton/ToolbarButton.tsx b/platform/ui/src/components/ToolbarButton/ToolbarButton.tsx index 804f2df34..a9b44cb9b 100644 --- a/platform/ui/src/components/ToolbarButton/ToolbarButton.tsx +++ b/platform/ui/src/components/ToolbarButton/ToolbarButton.tsx @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; import IconButton from '../IconButton'; import Icon from '../Icon'; @@ -14,6 +15,7 @@ const ToolbarButton = ({ dropdownContent, // className, + disabled, size, toolTipClassName, disableToolTip = false, @@ -36,13 +38,14 @@ const ToolbarButton = ({ { onInteraction({ itemId: id, @@ -78,6 +81,7 @@ ToolbarButton.propTypes = { size: PropTypes.string, toolTipClassName: PropTypes.string, disableToolTip: PropTypes.bool, + disabled: PropTypes.bool, }; export default ToolbarButton; diff --git a/platform/ui/src/contextProviders/ViewportGridProvider.tsx b/platform/ui/src/contextProviders/ViewportGridProvider.tsx index 2132e4586..93319613d 100644 --- a/platform/ui/src/contextProviders/ViewportGridProvider.tsx +++ b/platform/ui/src/contextProviders/ViewportGridProvider.tsx @@ -88,7 +88,11 @@ const determineActiveViewportId = (state: DefaultState, newViewports: Map) => { // and find the best match const currentOrientation = currentActiveViewport.viewportOptions.orientation; - const sortedViewports = Array.from(newViewports.values()).sort((a, b) => { + const filteredNewViewports = Array.from(newViewports.values()).filter( + viewport => viewport.displaySetInstanceUIDs?.length > 0 + ); + + const sortedViewports = Array.from(filteredNewViewports.values()).sort((a, b) => { // Compare orientations const aOrientationMatch = a.viewportOptions.orientation === currentOrientation; const bOrientationMatch = b.viewportOptions.orientation === currentOrientation; @@ -227,6 +231,7 @@ export function ViewportGridProvider({ children, service }) { // If the viewport doesn't have a viewportId, we create one if (!viewport.viewportOptions?.viewportId) { const randomUID = utils.uuidv4().substring(0, 8); + viewport.viewportOptions = viewport.viewportOptions || {}; viewport.viewportOptions.viewportId = `viewport-${randomUID}`; } diff --git a/platform/ui/src/tailwind.css b/platform/ui/src/tailwind.css index f54737fd1..bf81a8554 100644 --- a/platform/ui/src/tailwind.css +++ b/platform/ui/src/tailwind.css @@ -30,5 +30,5 @@ body { pointer-events: none; cursor: not-allowed; user-select: none; - opacity: 0.4; + opacity: 0.5; } diff --git a/yarn.lock b/yarn.lock index eac864f7c..eefbdd9b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1565,13 +1565,13 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cornerstonejs/adapters@^1.66.7": - version "1.66.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-1.66.7.tgz#924b9a1f00f56c986d9d175d12a182855e6af70b" - integrity sha512-HGEd39YOAe3jkTSyZhan3VY7QkQhMwMiYhqiREJpqWIyOLhCo25NTuMm8X6VIOpUvBGdE1dKyYlZrkANqF1CJQ== +"@cornerstonejs/adapters@^1.67.0": + version "1.67.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-1.67.0.tgz#84c881a2b1c7bc3cec2ae55df869d82740cc6049" + integrity sha512-EnIpdMD7kx42eJYGHsqjahWTZj/ZTkP+5XCWXpLp0BY0p+O53oSV9aYZXvyjd/kWQPr+30L+010zPuE5oQzIxA== dependencies: "@babel/runtime-corejs2" "^7.17.8" - "@cornerstonejs/tools" "^1.66.7" + "@cornerstonejs/tools" "^1.67.0" buffer "^6.0.3" dcmjs "^0.29.8" gl-matrix "^3.4.3" @@ -1618,10 +1618,10 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0" integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg== -"@cornerstonejs/core@^1.66.7": - version "1.66.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-1.66.7.tgz#57d0adcc67d95f93fc86848c2a05b9c57545b287" - integrity sha512-GOhV4fw9c0zm+7oH6q69otPYYEHI90hyMqJ0S/AWLwV7AwDuIRuRts3VELG5mSx4ju7zJalsO0Jfpvg3gPsW5w== +"@cornerstonejs/core@^1.67.0": + version "1.67.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-1.67.0.tgz#711a915b70b5273d8838b59c8c06c553079b0ee7" + integrity sha512-t8VI5acGGu0wN51UzHyEXOjlBjoAJjIVcbBOQejC0yOWfGoy+I9y/h5de41pZyhfbXYNNXA1dHZDDtLi9sauBg== dependencies: "@kitware/vtk.js" "29.7.0" comlink "^4.4.1" @@ -1629,34 +1629,34 @@ gl-matrix "^3.4.3" lodash.clonedeep "4.5.0" -"@cornerstonejs/dicom-image-loader@^1.66.7": - version "1.66.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.66.7.tgz#a35095908554e8e7ad717aab7652be7376d5305d" - integrity sha512-z8Nq3A+h+9oSjTqxPVyUm9Y3GV2PgPZJOGP0yYTyuEUqVnV3A9w5eB0/q84HGDaXF0ZsT4Y1J4Y3oOmKodb9lA== +"@cornerstonejs/dicom-image-loader@^1.67.0": + version "1.67.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.67.0.tgz#9e70858100821682105f88a927aa4dff96e75cda" + integrity sha512-ZhziYYKcci1X11iWA4qOzEVxtVUbDUKqx9ustsAD9vv9P7WfDOI4EHflUhW+X1hIAG5vl7xv6LAG0aRkVnwrrw== dependencies: "@cornerstonejs/codec-charls" "^1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2" "@cornerstonejs/codec-openjpeg" "^1.2.2" "@cornerstonejs/codec-openjph" "^2.4.5" - "@cornerstonejs/core" "^1.66.7" + "@cornerstonejs/core" "^1.67.0" dicom-parser "^1.8.9" pako "^2.0.4" uuid "^9.0.0" -"@cornerstonejs/streaming-image-volume-loader@^1.66.7": - version "1.66.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.66.7.tgz#6261df726b5400db1785c7378ee2e27018b3574c" - integrity sha512-2Ihz+6sUJ6AzKhF1o4yaDGeS1ZOZdmBlMEztMruJelLWWu/gb42i58chINB7UDmAxS/atvf22UvVNPGvW9cHDw== +"@cornerstonejs/streaming-image-volume-loader@^1.67.0": + version "1.67.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.67.0.tgz#5e22c828e5a5c9932e728314edbfa95abf81982e" + integrity sha512-W5+CKSxkLI4BbcdXYVb/M+yeN6Z+G8AWOQISR8qX9NGnK3GR/Id7+9OH+HP6FmIZ4YBXew9/DOqRgEtTtyDZGQ== dependencies: - "@cornerstonejs/core" "^1.66.7" + "@cornerstonejs/core" "^1.67.0" comlink "^4.4.1" -"@cornerstonejs/tools@^1.66.7": - version "1.66.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-1.66.7.tgz#bc0bb71b6b33761a91ca116d542e39807de14d82" - integrity sha512-NKTkwWsVzyE62nYa1ljXkzDgVcbqZxsMeRDhtpMaWkVOK06FrClu2xvLfVM8Rz2AXF4Zsqcp0Rg0D6Z4U3g38Q== +"@cornerstonejs/tools@^1.67.0": + version "1.67.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-1.67.0.tgz#47c6459859cc5122f780a7ec67c2b9d41b067b38" + integrity sha512-CPFWRF4IePxHV8KoXE6PBY0Q3jw8riJ7ZaJajAzXLpgvTSvIYu0m7tNuFG8iKVppq6KTgSywO4r9VbfcvZXOyw== dependencies: - "@cornerstonejs/core" "^1.66.7" + "@cornerstonejs/core" "^1.67.0" "@icr/polyseg-wasm" "0.4.0" "@types/offscreencanvas" "2019.7.3" comlink "^4.4.1"