itk-viewer-material-ui
Version:
[](https://badge.fury.io/js/itk-viewer-material-ui)
114 lines (103 loc) • 2.97 kB
JSX
import React, { useEffect, useRef, useState } from 'react'
import { useActor } from '@xstate/react'
import { Grid, Icon, IconButton } from '@mui/material'
import {
visibleIconDataUri,
invisibleIconDataUri,
imageIconDataUri,
labelsIconDataUri
} from 'itk-viewer-icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'
function LayerEntry(props) {
const { service } = props
const layerEntry = useRef(null)
const [state, send] = useActor(service)
const lastAdded = state.context.layers.lastAddedData
const actorContext = state.context.layers.actorContext
const [allLayers, updateLayers] = useState([])
useEffect(() => {
applyContrastSensitiveStyleToElement(
state.context,
'layerEntry',
layerEntry.current
)
}, [])
useEffect(() => {
if (state.context.layers.uiLayers && lastAdded) {
state.context.layers.uiLayers.set(lastAdded.name, layerEntry.current)
}
})
useEffect(() => {
if (state.context.layers.lastAddedData) {
updateLayers([...allLayers, state.context.layers.lastAddedData])
}
}, [state.context.layers.lastAddedData])
const layerVisible = (name) => {
if (actorContext && lastAdded) {
if (actorContext.get(name).visible) {
return 'selectedLayer'
}
}
return ''
}
const layerType = (name) => {
if (actorContext && lastAdded) {
return actorContext.get(name).type
}
return ''
}
const layerSelected = (selection) => {
const visible = layerVisible(selection)
return visible && selection
}
const useColumnSize = (idx) => {
if (idx % 2 === 0 && idx + 1 === allLayers.length) {
return 12
}
return 6
}
return actorContext && allLayers.length ? (
allLayers.map((layer, idx) => {
return (
<Grid
item
key={idx}
xs={useColumnSize(idx)}
ref={layerEntry}
className={`layerEntryCommon ${layerVisible(layer.name)}`}
onClick={() => {
layerSelected(layer.name)
}}
>
<IconButton
onClick={() => {
send({ type: 'TOGGLE_LAYER_VISIBILITY', data: layer.name })
}}
>
<Icon>
{layerVisible(layer.name) ? (
<img src={visibleIconDataUri} />
) : (
<img src={invisibleIconDataUri} />
)}
</Icon>
</IconButton>
<span className="layerLabelCommon"> {layer.name} </span>
<Icon className="layerIcon">
{layerType(layer.name) === 'image' ? (
<img src={imageIconDataUri} />
) : (
layerType(layer.name) === 'labelImage' && (
<img src={labelsIconDataUri} />
)
)}
</Icon>
</Grid>
)
})
) : (
<div />
)
}
export default LayerEntry