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"