fix(3D rendering): disabled light sliders when shade is off (#4631)

This commit is contained in:
Abhijith Sb 2025-01-03 21:13:49 +05:30 committed by GitHub
parent 860679126a
commit 5322064e9e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 27 additions and 7 deletions

View File

@ -5,6 +5,7 @@ export function VolumeLighting({
servicesManager, servicesManager,
commandsManager, commandsManager,
viewportId, viewportId,
hasShade,
}: VolumeLightingProps): ReactElement { }: VolumeLightingProps): ReactElement {
const { cornerstoneViewportService } = servicesManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [ambient, setAmbient] = useState(null); const [ambient, setAmbient] = useState(null);
@ -38,9 +39,13 @@ export function VolumeLighting({
setDiffuse(diffuse); setDiffuse(diffuse);
setSpecular(specular); setSpecular(specular);
}, [viewportId, cornerstoneViewportService]); }, [viewportId, cornerstoneViewportService]);
const disableOption = hasShade ? '' : 'ohif-disabled !opacity-40';
const disableSlider = !hasShade;
return ( return (
<> <>
<div className="all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"> <div
className={`all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px] ${disableOption}`}
>
<label <label
className="block text-white" className="block text-white"
htmlFor="ambient" htmlFor="ambient"
@ -56,6 +61,7 @@ export function VolumeLighting({
onAmbientChange(); onAmbientChange();
}} }}
id="ambient" id="ambient"
disabled={disableSlider}
max={1} max={1}
min={0} min={0}
type="range" type="range"
@ -68,7 +74,9 @@ export function VolumeLighting({
/> />
)} )}
</div> </div>
<div className="all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"> <div
className={`all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px] ${disableOption}`}
>
<label <label
className="block text-white" className="block text-white"
htmlFor="diffuse" htmlFor="diffuse"
@ -83,6 +91,7 @@ export function VolumeLighting({
setDiffuse(e.target.value); setDiffuse(e.target.value);
onDiffuseChange(); onDiffuseChange();
}} }}
disabled={disableSlider}
id="diffuse" id="diffuse"
max={1} max={1}
min={0} min={0}
@ -97,7 +106,9 @@ export function VolumeLighting({
)} )}
</div> </div>
<div className="all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"> <div
className={`all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px] ${disableOption}`}
>
<label <label
className="block text-white" className="block text-white"
htmlFor="specular" htmlFor="specular"
@ -108,6 +119,7 @@ export function VolumeLighting({
<input <input
className="bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg" className="bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg"
value={specular} value={specular}
disabled={disableSlider}
onChange={e => { onChange={e => {
setSpecular(e.target.value); setSpecular(e.target.value);
onSpecularChange(); onSpecularChange();

View File

@ -1,4 +1,4 @@
import React, { ReactElement } from 'react'; import React, { ReactElement, useState } from 'react';
import { AllInOneMenu } from '@ohif/ui'; import { AllInOneMenu } from '@ohif/ui';
import { VolumeRenderingOptionsProps } from '../../types/ViewportPresets'; import { VolumeRenderingOptionsProps } from '../../types/ViewportPresets';
import { VolumeRenderingQuality } from './VolumeRenderingQuality'; import { VolumeRenderingQuality } from './VolumeRenderingQuality';
@ -11,6 +11,7 @@ export function VolumeRenderingOptions({
volumeRenderingQualityRange, volumeRenderingQualityRange,
servicesManager, servicesManager,
}: VolumeRenderingOptionsProps): ReactElement { }: VolumeRenderingOptionsProps): ReactElement {
const [hasShade, setShade] = useState(false);
return ( return (
<AllInOneMenu.ItemPanel> <AllInOneMenu.ItemPanel>
<VolumeRenderingQuality <VolumeRenderingQuality
@ -34,12 +35,14 @@ export function VolumeRenderingOptions({
commandsManager={commandsManager} commandsManager={commandsManager}
servicesManager={servicesManager} servicesManager={servicesManager}
viewportId={viewportId} viewportId={viewportId}
onClickShade={setShade}
/> />
</div> </div>
<VolumeLighting <VolumeLighting
viewportId={viewportId} viewportId={viewportId}
commandsManager={commandsManager} commandsManager={commandsManager}
servicesManager={servicesManager} servicesManager={servicesManager}
hasShade={hasShade}
/> />
</AllInOneMenu.ItemPanel> </AllInOneMenu.ItemPanel>
); );

View File

@ -6,6 +6,7 @@ export function VolumeShade({
commandsManager, commandsManager,
viewportId, viewportId,
servicesManager, servicesManager,
onClickShade = bool => {},
}: VolumeShadeProps): ReactElement { }: VolumeShadeProps): ReactElement {
const { cornerstoneViewportService } = servicesManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [shade, setShade] = useState(true); const [shade, setShade] = useState(true);
@ -22,6 +23,7 @@ export function VolumeShade({
const { actor } = viewport.getActors()[0]; const { actor } = viewport.getActors()[0];
const shade = actor.getProperty().getShade(); const shade = actor.getProperty().getShade();
setShade(shade); setShade(shade);
onClickShade(shade);
setKey(key + 1); setKey(key + 1);
}, [viewportId, cornerstoneViewportService]); }, [viewportId, cornerstoneViewportService]);
@ -32,6 +34,7 @@ export function VolumeShade({
checked={shade} checked={shade}
onChange={() => { onChange={() => {
setShade(!shade); setShade(!shade);
onClickShade(!shade);
onShadeChange(!shade); onShadeChange(!shade);
}} }}
/> />

View File

@ -57,10 +57,12 @@ export type VolumeShadeProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
servicesManager: AppTypes.ServicesManager; servicesManager: AppTypes.ServicesManager;
onClickShade?: (bool: boolean) => void;
}; };
export type VolumeLightingProps = { export type VolumeLightingProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
servicesManager: AppTypes.ServicesManager; servicesManager: AppTypes.ServicesManager;
hasShade: boolean;
}; };