UNPKG

itk-viewer-bootstrap-ui

Version:

[![npm version](https://badge.fury.io/js/itk-viewer-bootstrap-ui.svg)](https://badge.fury.io/js/itk-viewer-bootstrap-ui) ![react-bootstrap version](https://img.shields.io/badge/React%20Bootstap-%3E=1.6.1-brightgreen.svg) [![Documentation Status](https://r

122 lines (113 loc) 3.43 kB
import React, { useEffect, useRef, useState } from 'react' import { useSelector } from '@xstate/react' import { gradientIconDataUri } from '@itk-viewer/icons' import Button from 'react-bootstrap/Button' import Form from 'react-bootstrap/Form' import Image from 'react-bootstrap/Image' import OverlayTrigger from 'react-bootstrap/OverlayTrigger' import Tooltip from 'react-bootstrap/Tooltip' import cn from 'classnames' import '../style.css' import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement' function GradientOpacitySlider(props) { const { service } = props const stateContext = useSelector(service, (state) => state.context) const send = service.send const sliderEntry = useRef(null) const gradientOpacitySlider = useRef(null) const gradientOpacityScaleSlider = useRef(null) const [vertSlider, setVertSlider] = useState(false) const gradientOpacityScale = useSelector( service, (state) => state.context.images.actorContext.get(state.context.images.selectedName) ?.gradientOpacityScale ) const gradientOpacity = useSelector( service, (state) => state.context.images.actorContext.get(state.context.images.selectedName) ?.gradientOpacity ) useEffect(() => { applyContrastSensitiveStyleToElement( stateContext, 'invertibleButton', sliderEntry.current ) stateContext.images.gradientOpacitySlider = gradientOpacitySlider.current stateContext.images.gradientOpacityScaleSlider = gradientOpacityScaleSlider.current }, []) const opacityScaleSliderChanged = (value) => { send({ type: 'IMAGE_GRADIENT_OPACITY_SCALE_CHANGED', data: { name: stateContext.images.selectedName, gradientOpacityScale: value } }) } const opacitySliderChanged = (value) => { send({ type: 'IMAGE_GRADIENT_OPACITY_CHANGED', data: { name: stateContext.images.selectedName, gradientOpacity: value } }) } return ( <div className="iconWithSlider"> <OverlayTrigger transition={false} overlay={<Tooltip>Gradient opacity scale</Tooltip>} > <Button className={cn('icon-button', { checked: vertSlider })} onClick={() => { setVertSlider(!vertSlider) }} variant="secondary" ref={sliderEntry} > <Image src={gradientIconDataUri}></Image> </Button> </OverlayTrigger> <div className="gradientOpacityScale"> <Form.Control ref={gradientOpacitySlider} type="range" className={`slider gradientOpacityInput ${ vertSlider ? '' : 'hidden' }`} min={0} max={1} value={gradientOpacity} step={0.01} onChange={(_e) => { opacitySliderChanged(_e.target.value) }} /> </div> <Form className="gradientSliderContainer"> <Form.Control ref={gradientOpacityScaleSlider} type="range" custom className="slider" min={0} max={0.99} value={gradientOpacityScale} step={0.01} onChange={(_e) => { opacityScaleSliderChanged(_e.target.value) }} /> </Form> </div> ) } export default GradientOpacitySlider