itk-viewer-material-ui
Version:
[](https://badge.fury.io/js/itk-viewer-material-ui)
103 lines (96 loc) • 2.85 kB
JSX
import React, { useEffect, useRef, useState } from 'react'
import { useActor } from '@xstate/react'
import { Icon, IconButton, Slider, Tooltip } from '@mui/material'
import { gradientIconDataUri } from 'itk-viewer-icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'
function GradientOpacitySlider(props) {
const { service } = props
const sliderEntry = useRef(null)
const gradientOpacitySlider = useRef(null)
const gradientOpacityScaleSlider = useRef(null)
const [vertSlider, setVertSlider] = useState(false)
const [state, send] = useActor(service)
const name = state.context.images.selectedName
const actorContext = state.context.images.actorContext.get(name)
useEffect(() => {
applyContrastSensitiveStyleToElement(
state.context,
'invertibleButton',
sliderEntry.current
)
state.context.images.gradientOpacitySlider = gradientOpacitySlider.current
state.context.images.gradientOpacityScaleSlider =
gradientOpacityScaleSlider.current
}, [])
const opacityScaleSliderChanged = (value) => {
send({
type: 'IMAGE_GRADIENT_OPACITY_SCALE_CHANGED',
data: {
name: state.context.images.selectedName,
gradientOpacityScale: value
}
})
}
const opacitySliderChanged = (value) => {
send({
type: 'IMAGE_GRADIENT_OPACITY_CHANGED',
data: {
name: state.context.images.selectedName,
gradientOpacity: value
}
})
}
return (
<div className="iconWithSlider">
<Tooltip
ref={sliderEntry}
title="Gradient opacity scale"
PopperProps={{
anchorEl: sliderEntry.current,
disablePortal: true,
keepMounted: true
}}
>
<IconButton
size="small"
onClick={() => {
setVertSlider(!vertSlider)
}}
>
<Icon className="sliderEntry">
<img src={gradientIconDataUri} />
</Icon>
</IconButton>
</Tooltip>
<div className="gradientOpacityScale">
<Slider
ref={gradientOpacitySlider}
className={`slider gradientOpacityInput ${
vertSlider ? '' : 'hidden'
}`}
orientation="vertical"
min={0}
max={1}
value={actorContext.gradientOpacity}
step={0.01}
onChange={(_e, val) => {
opacitySliderChanged(val)
}}
/>
</div>
<Slider
ref={gradientOpacityScaleSlider}
className="slider"
min={0}
max={0.99}
value={actorContext.gradientOpacityScale}
step={0.01}
onChange={(_e, val) => {
opacityScaleSliderChanged(val)
}}
/>
</div>
)
}
export default GradientOpacitySlider