Skip to content

Commit

Permalink
Merge pull request #140 from PaulHax/save-roi
Browse files Browse the repository at this point in the history
feat(LayerEntry): add save roi button
  • Loading branch information
thewtex authored Dec 4, 2023
2 parents ae53133 + 7688b5b commit f5c4a6f
Show file tree
Hide file tree
Showing 28 changed files with 78 additions and 53 deletions.
31 changes: 11 additions & 20 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"classnames": "^2.3.1",
"husky": "^7.0.4",
"itk-viewer-color-maps": "^1.2.0",
"itk-viewer-icons": "^11.14.0",
"@itk-viewer/icons": "^11.14.1",
"itk-viewer-transfer-function-editor": "^1.2.2",
"prettier": "^2.5.0",
"pydata_sphinx_theme": "github:pydata/pydata-sphinx-theme#2d9c495",
Expand Down
2 changes: 1 addition & 1 deletion src/AppToolbar.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react'
import { toggleIconDataUri } from 'itk-viewer-icons'
import { toggleIconDataUri } from '@itk-viewer/icons'
import toggleUICollapsed from './toggleUICollapsed'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
Expand Down
2 changes: 1 addition & 1 deletion src/Images/BlendModeSelector.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useEffect, useRef } from 'react'
import { useSelector } from '@xstate/react'
import { blendModeIconDataUri } from 'itk-viewer-icons'
import { blendModeIconDataUri } from '@itk-viewer/icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import Image from 'react-bootstrap/Image'
import Form from 'react-bootstrap/Form'
Expand Down
2 changes: 1 addition & 1 deletion src/Images/CinematicParameters.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useSelector } from '@xstate/react'
import getSelectedImageContext from './getSelectedImageContext'
import Form from 'react-bootstrap/Form'
import { Image, OverlayTrigger, Tooltip } from 'react-bootstrap'
import { volumeScatteringIconDataUri } from 'itk-viewer-icons'
import { volumeScatteringIconDataUri } from '@itk-viewer/icons'

function CinematicParameters({ service }) {
const scatteringBlend = useSelector(service, (state) => {
Expand Down
2 changes: 1 addition & 1 deletion src/Images/ColorRangeInput.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useEffect, useRef, useState } from 'react'
import { useSelector } from '@xstate/react'
import { interpolationIconDataUri } from 'itk-viewer-icons'
import { interpolationIconDataUri } from '@itk-viewer/icons'
import ColorMapIconSelector from './ColorMapIconSelector'
import WindowLevelReset from './WindowLevelReset'
import '../style.css'
Expand Down
2 changes: 1 addition & 1 deletion src/Images/GradientOpacitySlider.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useEffect, useRef, useState } from 'react'
import { useSelector } from '@xstate/react'
import { gradientIconDataUri } from 'itk-viewer-icons'
import { gradientIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Form from 'react-bootstrap/Form'
import Image from 'react-bootstrap/Image'
Expand Down
2 changes: 1 addition & 1 deletion src/Images/LabelImageColorWidget.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useEffect, useRef } from 'react'
import { useSelector } from '@xstate/react'
import CategoricalIconSelector from './CategoricalIconSelector'
import { opacityIconDataUri } from 'itk-viewer-icons'
import { opacityIconDataUri } from '@itk-viewer/icons'
import Form from 'react-bootstrap/Form'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Images/SampleDistanceSlider.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useEffect, useRef } from 'react'
import { useSelector } from '@xstate/react'
import { sampleDistanceIconDataUri } from 'itk-viewer-icons'
import { sampleDistanceIconDataUri } from '@itk-viewer/icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'
import Form from 'react-bootstrap/Form'
Expand Down
2 changes: 1 addition & 1 deletion src/Images/ScaleSelector.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useSelector } from '@xstate/react'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
import Tooltip from 'react-bootstrap/Tooltip'
import Image from 'react-bootstrap/Image'
import { scaleSelectIconDataUri } from 'itk-viewer-icons'
import { scaleSelectIconDataUri } from '@itk-viewer/icons'
import { Form } from 'react-bootstrap'
import getSelectedImageContext from './getSelectedImageContext'

Expand Down
2 changes: 1 addition & 1 deletion src/Images/ShadowToggle.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
import Tooltip from 'react-bootstrap/Tooltip'
import cn from 'classnames'
import { shadowIconDataUri } from 'itk-viewer-icons'
import { shadowIconDataUri } from '@itk-viewer/icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'

Expand Down
6 changes: 3 additions & 3 deletions src/Images/WindowLevelReset.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
import Tooltip from 'react-bootstrap/Tooltip'
import { resetImageIconDataUri } from 'itk-viewer-icons'
import { resetImageIconDataUri } from '@itk-viewer/icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'

Expand All @@ -27,8 +27,8 @@ function WindowLevelReset(props) {
send({
type: 'IMAGE_COLOR_RANGE_RESET',
data: {
name: stateContext.images.selectedName,
},
name: stateContext.images.selectedName
}
})
}

Expand Down
9 changes: 5 additions & 4 deletions src/Images/WindowLevelToggle.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
import Tooltip from 'react-bootstrap/Tooltip'
import cn from 'classnames'
import { windowingIconDataUri } from 'itk-viewer-icons'
import { windowingIconDataUri } from '@itk-viewer/icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'
import getSelectedImageContext from './getSelectedImageContext'
Expand Down Expand Up @@ -34,16 +34,17 @@ function WindowLevelToggle(props) {
'invertibleButton',
toggleWindowingButton.current
)
stateContext.images.toggleWindowingButtonInput = toggleWindowingButton.current
stateContext.images.toggleWindowingButtonInput =
toggleWindowingButton.current
}, [])

const toggleWindowing = () => {
send({
type: 'WINDOW_LEVEL_TOGGLED',
data: {
name,
component: actorContext.selectedComponent,
},
component: actorContext.selectedComponent
}
})
}

Expand Down
2 changes: 1 addition & 1 deletion src/Layers/CompareControls.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
rotateIconDataUri,
playIconDataUri,
pauseIconDataUri
} from 'itk-viewer-icons'
} from '@itk-viewer/icons'

const xyz = ['X', 'Y', 'Z']

Expand Down
37 changes: 35 additions & 2 deletions src/Layers/LayerEntry.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import {
imageIconDataUri,
labelsIconDataUri,
toggleIconDataUri,
boundingBoxIconDataUri
} from 'itk-viewer-icons'
boundingBoxIconDataUri,
downloadIconDataUri
} from '@itk-viewer/icons'
import '../style.css'
import { Button, Dropdown } from 'react-bootstrap'
import cn from 'classnames'
Expand Down Expand Up @@ -161,6 +162,11 @@ function LayerEntry({ service, name, actor, fillRow }) {
service,
(state) => state.context.images.selectedName
)
const showSaveRoiButton = useSelector(
service,
(state) => state.context.layers.showSaveRoiButton
)

const layerEntry = useRef(null)

useEffect(() => {
Expand Down Expand Up @@ -212,8 +218,35 @@ function LayerEntry({ service, name, actor, fillRow }) {
</Button>
</OverlayTrigger>
<div className="layerLabelCommon"> {name} </div>

<div className="layerIconGroup">
<Spinner name={name} service={service} />

{showSaveRoiButton && (
<OverlayTrigger
transition={false}
overlay={<Tooltip>{'Save Image'}</Tooltip>}
>
<Button
onClick={() => {
send({
type: 'DOWNLOAD_IMAGE',
data: {
name: selectedName,
layerName: name
}
})
}}
variant="secondary"
className={cn(`icon-button`, {
checked: actorContext.bbox
})}
>
<Image src={downloadIconDataUri}></Image>
</Button>
</OverlayTrigger>
)}

<OverlayTrigger
transition={false}
overlay={<Tooltip>{BOUNDING_BOX_TEXT}</Tooltip>}
Expand Down
2 changes: 1 addition & 1 deletion src/Main/AnnotationsButton.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { annotationsIconDataUri } from 'itk-viewer-icons'
import { annotationsIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/AxesButton.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { axesIconDataUri } from 'itk-viewer-icons'
import { axesIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/BackgroundColorButton.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { selectColorIconDataUri } from 'itk-viewer-icons'
import { selectColorIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/CroppingPlanesReset.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react'
import { resetCropIconDataUri } from 'itk-viewer-icons'
import { resetCropIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/CroppingPlanesToggle.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { cropIconDataUri } from 'itk-viewer-icons'
import { cropIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/FullscreenButton.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { fullscreenIconDataUri } from 'itk-viewer-icons'
import { fullscreenIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/PlaneSliders.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
invisibleIconDataUri,
pauseIconDataUri,
playIconDataUri
} from 'itk-viewer-icons'
} from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Form from 'react-bootstrap/Form'
import Image from 'react-bootstrap/Image'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/ResetCameraButton.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react'
import { resetCameraIconDataUri } from 'itk-viewer-icons'
import { resetCameraIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/RotateButton.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { rotateIconDataUri } from 'itk-viewer-icons'
import { rotateIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/ScreenshotButton.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react'
import { screenshotIconDataUri } from 'itk-viewer-icons'
import { screenshotIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/ViewModeButtons.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
redPlaneIconDataUri,
yellowPlaneIconDataUri,
greenPlaneIconDataUri
} from 'itk-viewer-icons'
} from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Main/ViewPlanesToggle.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import { useSelector } from '@xstate/react'
import { viewPlanesIconDataUri } from 'itk-viewer-icons'
import { viewPlanesIconDataUri } from '@itk-viewer/icons'
import Button from 'react-bootstrap/Button'
import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
Expand Down
2 changes: 1 addition & 1 deletion src/Widgets/DistanceWidget.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Image from 'react-bootstrap/Image'
import OverlayTrigger from 'react-bootstrap/OverlayTrigger'
import Tooltip from 'react-bootstrap/Tooltip'
import Form from 'react-bootstrap/Form'
import { lengthToolIconDataUri } from 'itk-viewer-icons'
import { lengthToolIconDataUri } from '@itk-viewer/icons'
import applyContrastSensitiveStyleToElement from '../applyContrastSensitiveStyleToElement'
import '../style.css'
import cn from 'classnames'
Expand Down

0 comments on commit f5c4a6f

Please sign in to comment.