@aics/vole-app 2.14.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/Globals.d.js +0 -0
- package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
- package/es/aics-image-viewer/components/App/index.js +184 -198
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
- package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
- package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +26 -52
- package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
- package/es/aics-image-viewer/components/ColorPicker.js +1 -1
- package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
- package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
- package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
- package/es/aics-image-viewer/components/GlobalVolumeControls.js +15 -12
- package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
- package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
- package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
- package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
- package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
- package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
- package/es/aics-image-viewer/components/shared/SliderRow/index.js +8 -3
- package/es/aics-image-viewer/components/shared/SliderRow/styles.css +7 -0
- package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
- package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
- package/es/aics-image-viewer/components/useVolume.js +59 -58
- package/es/aics-image-viewer/shared/constants.js +2 -2
- package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
- package/es/aics-image-viewer/shared/utils/sceneStore.js +5 -3
- package/es/aics-image-viewer/shared/utils/storage.js +238 -0
- package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
- package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +240 -108
- package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
- package/es/aics-image-viewer/shared/utils/urlParsing.js +278 -153
- package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
- package/es/aics-image-viewer/state/reset.js +111 -0
- package/es/aics-image-viewer/state/store.js +90 -0
- package/es/aics-image-viewer/state/subscribers.js +153 -0
- package/es/aics-image-viewer/state/test/reset.test.js +247 -0
- package/es/aics-image-viewer/state/util.js +71 -0
- package/es/index.js +3 -3
- package/package.json +18 -11
- package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
- package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
- package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
- package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
- package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
- package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
- package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
- package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
- package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
- package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
- package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
- package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
- package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +2 -1
- package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
- package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
- package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
- package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
- package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
- package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
- package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
- package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
- package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
- package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
- package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
- package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
- package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
- package/type-declarations/index.d.ts +4 -4
- package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
- package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
- /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
.channel-row .tf-editor
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
.channel-row .tf-editor{
|
|
2
|
+
margin-top:27px;
|
|
3
|
+
}
|
|
4
4
|
|
|
5
|
-
.channel-row .tf-editor-svg.dragging
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
.channel-row .tf-editor .tf-editor-svg.dragging-slider{
|
|
6
|
+
cursor:ew-resize;
|
|
7
|
+
}
|
|
8
8
|
|
|
9
|
-
.channel-row .tf-editor-
|
|
9
|
+
.channel-row .tf-editor .tf-editor-svg.dragging-point{
|
|
10
|
+
cursor:move;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.channel-row .tf-editor .tf-editor-popover{
|
|
10
14
|
position:absolute;
|
|
11
15
|
z-index:9999;
|
|
12
16
|
width:100%;
|
|
13
17
|
}
|
|
14
18
|
|
|
15
|
-
.channel-row .tf-editor-cover{
|
|
19
|
+
.channel-row .tf-editor .tf-editor-cover{
|
|
16
20
|
position:fixed;
|
|
17
21
|
top:0;
|
|
18
22
|
left:0;
|
|
@@ -20,32 +24,39 @@
|
|
|
20
24
|
bottom:0;
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
.channel-row .tf-editor-control-row{
|
|
27
|
+
.channel-row .tf-editor .tf-editor-control-row{
|
|
24
28
|
display:flex;
|
|
25
29
|
color:var(--color-controlpanel-text);
|
|
30
|
+
justify-content:space-between;
|
|
26
31
|
align-items:center;
|
|
27
32
|
min-height:24px;
|
|
28
|
-
gap:5px;
|
|
29
33
|
}
|
|
30
34
|
|
|
31
|
-
.channel-row .tf-editor-control-row
|
|
32
|
-
margin-
|
|
35
|
+
.channel-row .tf-editor .tf-editor-control-row:not(:first-child){
|
|
36
|
+
margin-bottom:12px;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
.channel-row .tf-editor-control-row
|
|
36
|
-
|
|
39
|
+
.channel-row .tf-editor .tf-editor-control-row > div{
|
|
40
|
+
display:flex;
|
|
41
|
+
gap:5px;
|
|
37
42
|
}
|
|
38
43
|
|
|
39
|
-
.channel-row .tf-editor-control-row .ant-input-number{
|
|
44
|
+
.channel-row .tf-editor .tf-editor-control-row .ant-input-number{
|
|
40
45
|
border-color:var(--color-button-tertiary-outline);
|
|
41
46
|
width:64px;
|
|
42
47
|
}
|
|
43
48
|
|
|
44
|
-
.channel-row .tf-editor-control-row .ant-input-number input{
|
|
49
|
+
.channel-row .tf-editor .tf-editor-control-row .ant-input-number input{
|
|
45
50
|
text-align:right;
|
|
46
51
|
}
|
|
47
52
|
|
|
48
|
-
.channel-row .
|
|
53
|
+
.channel-row .tf-editor h4{
|
|
54
|
+
font-size:16px;
|
|
55
|
+
margin-top:0;
|
|
56
|
+
margin-bottom:12px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.channel-row .tf-editor .tick text{
|
|
49
60
|
fill:var(--color-controlpanel-text);
|
|
50
61
|
user-select:none;
|
|
51
62
|
-o-user-select:none;
|
|
@@ -54,47 +65,58 @@
|
|
|
54
65
|
-webkit-user-select:none;
|
|
55
66
|
}
|
|
56
67
|
|
|
57
|
-
.channel-row rect.bar{
|
|
68
|
+
.channel-row .tf-editor rect.bar{
|
|
58
69
|
fill:var(--color-controlpanel-border);
|
|
59
70
|
}
|
|
60
71
|
|
|
61
|
-
.channel-row .axis path,
|
|
62
|
-
.channel-row .axis line{
|
|
72
|
+
.channel-row .tf-editor .axis path,
|
|
73
|
+
.channel-row .tf-editor .axis line{
|
|
63
74
|
stroke:var(--color-controlpanel-border);
|
|
64
75
|
}
|
|
65
76
|
|
|
66
|
-
.channel-row rect{
|
|
77
|
+
.channel-row .tf-editor rect{
|
|
67
78
|
fill:none;
|
|
68
79
|
pointer-events:all;
|
|
69
80
|
}
|
|
70
81
|
|
|
71
|
-
.channel-row .line{
|
|
82
|
+
.channel-row .tf-editor .line{
|
|
72
83
|
stroke:#aeacae;
|
|
73
84
|
stroke-width:1px;
|
|
74
85
|
}
|
|
75
86
|
|
|
76
|
-
.channel-row .
|
|
77
|
-
|
|
87
|
+
.channel-row .tf-editor .sliders path,
|
|
88
|
+
.channel-row .tf-editor .sliders line{
|
|
78
89
|
cursor:ew-resize;
|
|
79
90
|
}
|
|
80
91
|
|
|
81
|
-
.channel-row .
|
|
82
|
-
stroke:
|
|
83
|
-
cursor:ew-resize;
|
|
92
|
+
.channel-row .tf-editor .sliders line.slider-click-target{
|
|
93
|
+
stroke:transparent;
|
|
84
94
|
}
|
|
85
95
|
|
|
86
|
-
.channel-row .
|
|
87
|
-
|
|
96
|
+
.channel-row .tf-editor .sliders.sliders-ramp path{
|
|
97
|
+
fill:var(--color-controlpanel-ramp-slider);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.channel-row .tf-editor .sliders.sliders-ramp line:not(.slider-click-target){
|
|
101
|
+
stroke:var(--color-controlpanel-ramp-slider);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.channel-row .tf-editor .sliders.sliders-isovalue path{
|
|
105
|
+
fill:var(--color-controlpanel-isovalue-slider);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.channel-row .tf-editor .sliders.sliders-isovalue line:not(.slider-click-target){
|
|
109
|
+
stroke:var(--color-controlpanel-isovalue-slider);
|
|
88
110
|
}
|
|
89
111
|
|
|
90
|
-
.channel-row circle{
|
|
112
|
+
.channel-row .tf-editor circle{
|
|
91
113
|
fill-opacity:0.6;
|
|
92
114
|
cursor:move;
|
|
93
115
|
stroke:#aeacae;
|
|
94
116
|
stroke-width:1.5px;
|
|
95
117
|
}
|
|
96
118
|
|
|
97
|
-
.channel-row circle.selected{
|
|
119
|
+
.channel-row .tf-editor circle.selected{
|
|
98
120
|
fill:white;
|
|
99
121
|
stroke:white;
|
|
100
122
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Button, Dropdown, Tooltip } from "antd";
|
|
1
2
|
import React from "react";
|
|
2
|
-
import { Dropdown, Button, Tooltip } from "antd";
|
|
3
3
|
import ViewerIcon from "../shared/ViewerIcon";
|
|
4
4
|
var DownloadButton = function DownloadButton(_ref) {
|
|
5
5
|
var fovDownloadHref = _ref.fovDownloadHref,
|
|
@@ -9,8 +9,8 @@ import { Button, Radio, Select, Tooltip } from "antd";
|
|
|
9
9
|
import { debounce } from "lodash";
|
|
10
10
|
import React from "react";
|
|
11
11
|
import { ImageType, RenderMode, ViewMode } from "../../shared/enums";
|
|
12
|
+
import { select, useViewerState } from "../../state/store";
|
|
12
13
|
import ViewerIcon from "../shared/ViewerIcon";
|
|
13
|
-
import { connectToViewerState } from "../ViewerStateProvider";
|
|
14
14
|
import DownloadButton from "./DownloadButton";
|
|
15
15
|
import ViewModeRadioButtons from "./ViewModeRadioButtons";
|
|
16
16
|
import "./styles.css";
|
|
@@ -44,6 +44,13 @@ var Toolbar = function Toolbar(props) {
|
|
|
44
44
|
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
|
45
45
|
showScrollBtnRight = _React$useState6[0],
|
|
46
46
|
setScrollBtnRight = _React$useState6[1];
|
|
47
|
+
var imageType = useViewerState(select("imageType"));
|
|
48
|
+
var renderMode = useViewerState(select("renderMode"));
|
|
49
|
+
var viewMode = useViewerState(select("viewMode"));
|
|
50
|
+
var autorotate = useViewerState(select("autorotate"));
|
|
51
|
+
var showAxes = useViewerState(select("showAxes"));
|
|
52
|
+
var showBoundingBox = useViewerState(select("showBoundingBox"));
|
|
53
|
+
var changeViewerSetting = useViewerState(select("changeViewerSetting"));
|
|
47
54
|
|
|
48
55
|
// Scroll buttons are only visible when toolbar can be scrolled in that direction.
|
|
49
56
|
// This may change on either scroll or resize.
|
|
@@ -105,22 +112,17 @@ var Toolbar = function Toolbar(props) {
|
|
|
105
112
|
scrollX(e.deltaY);
|
|
106
113
|
};
|
|
107
114
|
var toggleAxis = function toggleAxis() {
|
|
108
|
-
return
|
|
115
|
+
return changeViewerSetting("showAxes", !showAxes);
|
|
109
116
|
};
|
|
110
117
|
var toggleBoundingBox = function toggleBoundingBox() {
|
|
111
|
-
return
|
|
118
|
+
return changeViewerSetting("showBoundingBox", !showBoundingBox);
|
|
112
119
|
};
|
|
113
120
|
// TODO remove ant-btn-icon-only hack when upgrading antd
|
|
114
121
|
var classForToggleBtn = function classForToggleBtn(active) {
|
|
115
122
|
return "ant-btn-icon-only btn-borderless" + (active ? " btn-active" : "");
|
|
116
123
|
};
|
|
117
|
-
var
|
|
118
|
-
|
|
119
|
-
visibleControls = props.visibleControls,
|
|
120
|
-
showAxes = props.showAxes,
|
|
121
|
-
showBoundingBox = props.showBoundingBox,
|
|
122
|
-
autorotate = props.autorotate;
|
|
123
|
-
var twoDMode = props.viewMode !== ViewMode.threeD;
|
|
124
|
+
var visibleControls = props.visibleControls;
|
|
125
|
+
var twoDMode = viewMode !== ViewMode.threeD;
|
|
124
126
|
var renderGroup1 = visibleControls.viewModeRadioButtons || visibleControls.resetCameraButton || visibleControls.autoRotateButton;
|
|
125
127
|
var renderGroup4 = visibleControls.showAxesButton || visibleControls.showBoundingBoxButton;
|
|
126
128
|
var axesToggleTitle = showAxes ? "Hide axes" : "Show axes";
|
|
@@ -160,7 +162,7 @@ var Toolbar = function Toolbar(props) {
|
|
|
160
162
|
trigger: ["focus", "hover"]
|
|
161
163
|
}, /*#__PURE__*/React.createElement(Button, {
|
|
162
164
|
className: "ant-btn-icon-only btn-borderless",
|
|
163
|
-
onClick: resetToSavedViewerState
|
|
165
|
+
onClick: props.resetToSavedViewerState
|
|
164
166
|
}, /*#__PURE__*/React.createElement(ReloadOutlined, null), /*#__PURE__*/React.createElement("span", {
|
|
165
167
|
style: visuallyHiddenStyle
|
|
166
168
|
}, "Reset to initial settings")))), /*#__PURE__*/React.createElement("div", {
|
|
@@ -169,7 +171,7 @@ var Toolbar = function Toolbar(props) {
|
|
|
169
171
|
}, renderGroup1 && /*#__PURE__*/React.createElement("div", {
|
|
170
172
|
className: "viewer-toolbar-group"
|
|
171
173
|
}, visibleControls.viewModeRadioButtons && /*#__PURE__*/React.createElement(ViewModeRadioButtons, {
|
|
172
|
-
mode:
|
|
174
|
+
mode: viewMode,
|
|
173
175
|
onViewModeChange: function onViewModeChange(newMode) {
|
|
174
176
|
return changeViewerSetting("viewMode", newMode);
|
|
175
177
|
}
|
|
@@ -186,7 +188,7 @@ var Toolbar = function Toolbar(props) {
|
|
|
186
188
|
title: turntableToggleTitle
|
|
187
189
|
}, /*#__PURE__*/React.createElement(Button, {
|
|
188
190
|
className: classForToggleBtn(autorotate && !twoDMode),
|
|
189
|
-
disabled: twoDMode ||
|
|
191
|
+
disabled: twoDMode || renderMode === RenderMode.pathTrace,
|
|
190
192
|
onClick: function onClick() {
|
|
191
193
|
return changeViewerSetting("autorotate", !autorotate);
|
|
192
194
|
}
|
|
@@ -195,7 +197,7 @@ var Toolbar = function Toolbar(props) {
|
|
|
195
197
|
})))), visibleControls.fovCellSwitchControls && props.hasCellId && props.hasParentImage && /*#__PURE__*/React.createElement("div", {
|
|
196
198
|
className: "viewer-toolbar-group"
|
|
197
199
|
}, /*#__PURE__*/React.createElement(Radio.Group, {
|
|
198
|
-
value:
|
|
200
|
+
value: imageType,
|
|
199
201
|
onChange: function onChange(_ref) {
|
|
200
202
|
var target = _ref.target;
|
|
201
203
|
return changeViewerSetting("imageType", target.value);
|
|
@@ -209,7 +211,7 @@ var Toolbar = function Toolbar(props) {
|
|
|
209
211
|
}, /*#__PURE__*/React.createElement(Select, {
|
|
210
212
|
className: "select-render-setting",
|
|
211
213
|
popupClassName: "viewer-toolbar-dropdown",
|
|
212
|
-
value:
|
|
214
|
+
value: renderMode,
|
|
213
215
|
onChange: function onChange(value) {
|
|
214
216
|
return changeViewerSetting("renderMode", value);
|
|
215
217
|
},
|
|
@@ -275,4 +277,4 @@ var Toolbar = function Toolbar(props) {
|
|
|
275
277
|
}
|
|
276
278
|
})));
|
|
277
279
|
};
|
|
278
|
-
export default
|
|
280
|
+
export default Toolbar;
|
|
@@ -8,15 +8,18 @@ var INTEGER_FORMATTER = {
|
|
|
8
8
|
|
|
9
9
|
/** A component to ensure a single unified style across the many labeled slider rows in the control panel */
|
|
10
10
|
var SliderRow = function SliderRow(props) {
|
|
11
|
+
var _props$min;
|
|
11
12
|
return /*#__PURE__*/React.createElement("div", {
|
|
12
13
|
className: "viewer-control-row"
|
|
13
14
|
}, /*#__PURE__*/React.createElement("div", {
|
|
14
15
|
className: "control-name"
|
|
15
16
|
}, props.label), /*#__PURE__*/React.createElement("div", {
|
|
16
17
|
className: "control"
|
|
17
|
-
}, props.start
|
|
18
|
+
}, props.start !== undefined && !props.hideSlider && /*#__PURE__*/React.createElement("div", {
|
|
19
|
+
className: "control-slider"
|
|
20
|
+
}, /*#__PURE__*/React.createElement(SmarterSlider, {
|
|
18
21
|
range: {
|
|
19
|
-
min: 0,
|
|
22
|
+
min: (_props$min = props.min) !== null && _props$min !== void 0 ? _props$min : 0,
|
|
20
23
|
max: props.max
|
|
21
24
|
},
|
|
22
25
|
start: props.start,
|
|
@@ -26,6 +29,8 @@ var SliderRow = function SliderRow(props) {
|
|
|
26
29
|
format: props.formatInteger ? INTEGER_FORMATTER : undefined,
|
|
27
30
|
onUpdate: props.onUpdate,
|
|
28
31
|
onChange: props.onChange
|
|
29
|
-
}))
|
|
32
|
+
})), props.children && /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
className: "control-extra"
|
|
34
|
+
}, props.children)));
|
|
30
35
|
};
|
|
31
36
|
export default SliderRow;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
display:flex;
|
|
3
3
|
align-items:center;
|
|
4
4
|
margin-right:10px;
|
|
5
|
+
gap:5px;
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
.viewer-control-row:not(:last-child){
|
|
@@ -16,4 +17,10 @@
|
|
|
16
17
|
|
|
17
18
|
.viewer-control-row .control{
|
|
18
19
|
flex:5;
|
|
20
|
+
display:flex;
|
|
21
|
+
align-items:center;
|
|
19
22
|
}
|
|
23
|
+
|
|
24
|
+
.viewer-control-row .control .control-slider{
|
|
25
|
+
flex-grow:1;
|
|
26
|
+
}
|
|
@@ -10,8 +10,8 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
10
10
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
11
11
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
12
12
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
13
|
-
import React from "react";
|
|
14
13
|
import Nouislider from "nouislider-react";
|
|
14
|
+
import React from "react";
|
|
15
15
|
var MemoedNouislider = /*#__PURE__*/React.memo(Nouislider, function (_prevProps, _ref) {
|
|
16
16
|
var noUpdate = _ref.noUpdate;
|
|
17
17
|
return noUpdate;
|
|
@@ -5,8 +5,8 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
5
5
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
6
6
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
7
7
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
|
-
import React from "react";
|
|
9
8
|
import Icon from "@ant-design/icons";
|
|
9
|
+
import React from "react";
|
|
10
10
|
import ICONS from "../../assets/icons";
|
|
11
11
|
var STYLE = {
|
|
12
12
|
fontSize: "19px"
|
|
@@ -14,16 +14,16 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
|
|
|
14
14
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
15
15
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
16
16
|
import { LoadSpec, VolumeLoaderContext } from "@aics/vole-core";
|
|
17
|
-
import { useCallback,
|
|
17
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
18
18
|
import { Box3, Vector3 } from "three";
|
|
19
|
-
import { AXIS_TO_LOADER_PRIORITY, CACHE_MAX_SIZE, getDefaultChannelColor, QUEUE_MAX_LOW_PRIORITY_SIZE, QUEUE_MAX_SIZE } from "../shared/constants";
|
|
19
|
+
import { AXIS_TO_LOADER_PRIORITY, CACHE_MAX_SIZE, getDefaultChannelColor, getDefaultViewerChannelSettings, QUEUE_MAX_LOW_PRIORITY_SIZE, QUEUE_MAX_SIZE } from "../shared/constants";
|
|
20
20
|
import { ViewMode } from "../shared/enums";
|
|
21
21
|
import { useConstructor, useRefWithSetter } from "../shared/utils/hooks";
|
|
22
22
|
import PlayControls from "../shared/utils/playControls";
|
|
23
23
|
import SceneStore from "../shared/utils/sceneStore";
|
|
24
|
-
import {
|
|
24
|
+
import { makeChannelIndexGrouping } from "../shared/utils/viewerChannelSettings";
|
|
25
25
|
import { initializeOneChannelSetting } from "../shared/utils/viewerState";
|
|
26
|
-
import {
|
|
26
|
+
import { select, useViewerState } from "../state/store";
|
|
27
27
|
export var ImageLoadStatus = /*#__PURE__*/function (ImageLoadStatus) {
|
|
28
28
|
ImageLoadStatus[ImageLoadStatus["REQUESTED"] = 0] = "REQUESTED";
|
|
29
29
|
ImageLoadStatus[ImageLoadStatus["LOADING"] = 1] = "LOADING";
|
|
@@ -31,8 +31,11 @@ export var ImageLoadStatus = /*#__PURE__*/function (ImageLoadStatus) {
|
|
|
31
31
|
ImageLoadStatus[ImageLoadStatus["ERROR"] = 3] = "ERROR";
|
|
32
32
|
return ImageLoadStatus;
|
|
33
33
|
}({});
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
var LoadType = /*#__PURE__*/function (LoadType) {
|
|
35
|
+
LoadType[LoadType["TIME"] = 0] = "TIME";
|
|
36
|
+
LoadType[LoadType["SCENE"] = 1] = "SCENE";
|
|
37
|
+
return LoadType;
|
|
38
|
+
}(LoadType || {}); // Used by `channelVersions` (see below)
|
|
36
39
|
var CHANNEL_INITIAL_LOAD = -1;
|
|
37
40
|
var CHANNEL_RELOAD = 0;
|
|
38
41
|
/**
|
|
@@ -63,9 +66,12 @@ var useEffectEventRef = function useEffectEventRef(callback) {
|
|
|
63
66
|
* @returns An object with the current image, its load status, and controls for playback and loading.
|
|
64
67
|
*/
|
|
65
68
|
var useVolume = function useVolume(scenePaths, options) {
|
|
66
|
-
var
|
|
69
|
+
var channelSettings = useViewerState(select("channelSettings"));
|
|
70
|
+
var changeViewerSetting = useViewerState(select("changeViewerSetting"));
|
|
71
|
+
var replaceAllChannelSettings = useViewerState(select("replaceAllChannelSettings"));
|
|
67
72
|
var onErrorRef = useEffectEventRef(options === null || options === void 0 ? void 0 : options.onError);
|
|
68
73
|
var onChannelLoadedRef = useEffectEventRef(options === null || options === void 0 ? void 0 : options.onChannelLoaded);
|
|
74
|
+
var onChangeSceneRef = useEffectEventRef(options === null || options === void 0 ? void 0 : options.onChangeScene);
|
|
69
75
|
var onCreateImageRef = useEffectEventRef(options === null || options === void 0 ? void 0 : options.onCreateImage);
|
|
70
76
|
var maskChannelName = options === null || options === void 0 ? void 0 : options.maskChannelName;
|
|
71
77
|
|
|
@@ -117,7 +123,7 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
117
123
|
_useRefWithSetter2 = _slicedToArray(_useRefWithSetter, 2),
|
|
118
124
|
channelVersionsRef = _useRefWithSetter2[0],
|
|
119
125
|
setChannelVersions = _useRefWithSetter2[1];
|
|
120
|
-
|
|
126
|
+
|
|
121
127
|
// Some extra items for tracking load status
|
|
122
128
|
var _useState7 = useState(false),
|
|
123
129
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
@@ -149,10 +155,13 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
149
155
|
}
|
|
150
156
|
return noneLoaded ? ImageLoadStatus.REQUESTED : allLoaded ? ImageLoadStatus.LOADED : ImageLoadStatus.LOADING;
|
|
151
157
|
}, [channelVersions, channelSettings, maskChannelName, loadThrewError]);
|
|
152
|
-
var setIsLoading = useCallback(function () {
|
|
158
|
+
var setIsLoading = useCallback(function (loadType) {
|
|
153
159
|
setLoadThrewError(false);
|
|
154
160
|
setChannelVersions(channelVersionsRef.current.map(function (version) {
|
|
155
|
-
return
|
|
161
|
+
return (
|
|
162
|
+
// For scenes, reinitialize all channels.
|
|
163
|
+
Math.min(version, loadType === LoadType.SCENE ? CHANNEL_INITIAL_LOAD : CHANNEL_RELOAD)
|
|
164
|
+
);
|
|
156
165
|
}));
|
|
157
166
|
}, [channelVersionsRef, setChannelVersions]);
|
|
158
167
|
var onError = useCallback(function (e) {
|
|
@@ -186,55 +195,41 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
186
195
|
|
|
187
196
|
// effect to start the initial load of the image
|
|
188
197
|
useEffect(function () {
|
|
189
|
-
var
|
|
190
|
-
changeViewerSetting = _viewerStateRef$curre.changeViewerSetting,
|
|
191
|
-
channelSettings = _viewerStateRef$curre.channelSettings,
|
|
192
|
-
getCurrentViewerChannelSettings = _viewerStateRef$curre.getCurrentViewerChannelSettings,
|
|
193
|
-
setChannelSettings = _viewerStateRef$curre.setChannelSettings;
|
|
198
|
+
var channelSettings = useViewerState.getState().channelSettings;
|
|
194
199
|
setChannelVersions(new Array(channelVersionsRef.current.length).fill(CHANNEL_INITIAL_LOAD));
|
|
195
200
|
setLoadThrewError(false);
|
|
196
201
|
inInitialLoadRef.current = true;
|
|
197
202
|
var setChannelStateForNewImage = function setChannelStateForNewImage(channelNames) {
|
|
198
|
-
var
|
|
203
|
+
var _useViewerState$getSt = useViewerState.getState(),
|
|
204
|
+
useDefaultViewerChannelSettings = _useViewerState$getSt.useDefaultViewerChannelSettings;
|
|
205
|
+
var viewerChannelSettings = useDefaultViewerChannelSettings ? getDefaultViewerChannelSettings() : options === null || options === void 0 ? void 0 : options.viewerChannelSettings;
|
|
199
206
|
var grouping = makeChannelIndexGrouping(channelNames, viewerChannelSettings);
|
|
200
207
|
setChannelGroupedByType(grouping);
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
// same number of channels, and each channel has same displayName
|
|
204
|
-
var allNamesAreEqual = channelNames.every(function (name, idx) {
|
|
205
|
-
var _channelSettings$idx;
|
|
206
|
-
var displayName = getDisplayName(name, idx, viewerChannelSettings);
|
|
207
|
-
return displayName === ((_channelSettings$idx = channelSettings[idx]) === null || _channelSettings$idx === void 0 ? void 0 : _channelSettings$idx.displayName);
|
|
208
|
-
});
|
|
209
|
-
if (allNamesAreEqual) {
|
|
210
|
-
var _newChannelSettings = channelNames.map(function (channel, index) {
|
|
211
|
-
return _objectSpread(_objectSpread({}, channelSettings[index]), {}, {
|
|
212
|
-
name: channel
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
setChannelSettings(_newChannelSettings);
|
|
216
|
-
return _newChannelSettings;
|
|
217
|
-
}
|
|
218
|
-
var newChannelSettings = channelNames.map(function (channel, index) {
|
|
208
|
+
var newChannelSettings = channelNames.map(function (name, index) {
|
|
209
|
+
var _channelSettings$inde;
|
|
219
210
|
var color = getDefaultChannelColor(index);
|
|
220
|
-
|
|
211
|
+
var channelSetting = (_channelSettings$inde = channelSettings[index]) !== null && _channelSettings$inde !== void 0 ? _channelSettings$inde : initializeOneChannelSetting(name, index, color, viewerChannelSettings);
|
|
212
|
+
return _objectSpread(_objectSpread({}, channelSetting), {}, {
|
|
213
|
+
name: name
|
|
214
|
+
});
|
|
221
215
|
});
|
|
222
|
-
|
|
216
|
+
replaceAllChannelSettings(newChannelSettings);
|
|
223
217
|
return newChannelSettings;
|
|
224
218
|
};
|
|
225
219
|
var openImage = /*#__PURE__*/function () {
|
|
226
220
|
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
227
|
-
var _onCreateImageRef$cur
|
|
228
|
-
var
|
|
221
|
+
var _onCreateImageRef$cur;
|
|
222
|
+
var scene, time, loadSpec, aimg, channelNames, newChannelSettings, requiredLoadSpec, requiredChannelsToLoad, _useViewerState$getSt2, useDefaultViewerChannelSettings, viewerChannelSettings, maskChannelName, maskChannelIndex, viewMode, slice, onCreateScene;
|
|
229
223
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
230
224
|
while (1) switch (_context.prev = _context.next) {
|
|
231
225
|
case 0:
|
|
232
|
-
|
|
226
|
+
scene = useViewerState.getState().scene;
|
|
227
|
+
time = useViewerState.getState().time;
|
|
233
228
|
loadSpec = new LoadSpec();
|
|
234
229
|
loadSpec.time = time;
|
|
235
|
-
_context.next =
|
|
230
|
+
_context.next = 6;
|
|
236
231
|
return sceneLoader.createVolume(scene, loadSpec, onChannelDataLoaded)["catch"](onError);
|
|
237
|
-
case
|
|
232
|
+
case 6:
|
|
238
233
|
aimg = _context.sent;
|
|
239
234
|
channelNames = aimg.imageInfo.channelNames;
|
|
240
235
|
newChannelSettings = setChannelStateForNewImage(channelNames);
|
|
@@ -242,9 +237,8 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
242
237
|
setImage(aimg);
|
|
243
238
|
(_onCreateImageRef$cur = onCreateImageRef.current) === null || _onCreateImageRef$cur === void 0 || _onCreateImageRef$cur.call(onCreateImageRef, aimg);
|
|
244
239
|
playControls.stepAxis = function (axis) {
|
|
245
|
-
var
|
|
246
|
-
|
|
247
|
-
slice = _viewerStateRef$curre3.slice;
|
|
240
|
+
var time = useViewerState.getState().time;
|
|
241
|
+
var slice = useViewerState.getState().slice;
|
|
248
242
|
if (axis === "t") {
|
|
249
243
|
changeViewerSetting("time", (time + 1) % aimg.imageInfo.times);
|
|
250
244
|
} else {
|
|
@@ -264,7 +258,9 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
264
258
|
}).filter(function (index) {
|
|
265
259
|
return index >= 0;
|
|
266
260
|
}) : []; // add mask channel to required channels, if specified
|
|
267
|
-
|
|
261
|
+
_useViewerState$getSt2 = useViewerState.getState(), useDefaultViewerChannelSettings = _useViewerState$getSt2.useDefaultViewerChannelSettings;
|
|
262
|
+
viewerChannelSettings = useDefaultViewerChannelSettings ? getDefaultViewerChannelSettings() : options === null || options === void 0 ? void 0 : options.viewerChannelSettings;
|
|
263
|
+
maskChannelName = viewerChannelSettings === null || viewerChannelSettings === void 0 ? void 0 : viewerChannelSettings.maskChannelName;
|
|
268
264
|
if (maskChannelName) {
|
|
269
265
|
maskChannelIndex = channelNames.indexOf(maskChannelName);
|
|
270
266
|
if (maskChannelIndex >= 0 && !requiredChannelsToLoad.includes(maskChannelIndex)) {
|
|
@@ -272,22 +268,24 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
272
268
|
}
|
|
273
269
|
}
|
|
274
270
|
requiredLoadSpec.channels = requiredChannelsToLoad;
|
|
275
|
-
|
|
276
|
-
// When in 2D Z-axis view mode, we restrict the subregion to only the current slice. This is
|
|
271
|
+
viewMode = useViewerState.getState().viewMode;
|
|
272
|
+
slice = useViewerState.getState().slice; // When in 2D Z-axis view mode, we restrict the subregion to only the current slice. This is
|
|
277
273
|
// to match an optimization that volume viewer does by loading Z-slices at a higher resolution,
|
|
278
274
|
// and ensures the very first volume that is loaded is the same as the one that
|
|
279
275
|
// will be shown whenever we switch back to the same viewer settings (2D Z-axis view mode).
|
|
280
276
|
// (We don't do this for ZX and YZ modes because we assume that the data won't be chunked along the
|
|
281
277
|
// X or Y axes in ways that would improve loading resolution, and we load the full 3D volume instead.)
|
|
282
|
-
if (
|
|
283
|
-
slice = viewerStateRef.current.slice;
|
|
278
|
+
if (viewMode === ViewMode.xy) {
|
|
284
279
|
requiredLoadSpec.subregion = new Box3(new Vector3(0, 0, slice.z), new Vector3(1, 1, slice.z));
|
|
285
280
|
}
|
|
286
281
|
|
|
287
282
|
// initiate loading only after setting up new channel settings,
|
|
288
283
|
// in case the loader callback fires before the state is set
|
|
289
|
-
|
|
290
|
-
|
|
284
|
+
onCreateScene = onChangeSceneRef.current;
|
|
285
|
+
sceneLoader.loadScene(scene, aimg, requiredLoadSpec, {
|
|
286
|
+
onCreateScene: onCreateScene
|
|
287
|
+
})["catch"](onError);
|
|
288
|
+
case 27:
|
|
291
289
|
case "end":
|
|
292
290
|
return _context.stop();
|
|
293
291
|
}
|
|
@@ -298,21 +296,24 @@ var useVolume = function useVolume(scenePaths, options) {
|
|
|
298
296
|
};
|
|
299
297
|
}();
|
|
300
298
|
openImage();
|
|
301
|
-
}, [sceneLoader, onError, onCreateImageRef,
|
|
299
|
+
}, [sceneLoader, onError, onCreateImageRef, onChangeSceneRef, onChannelLoadedRef, channelVersionsRef, setChannelVersions, playControls, setIsLoading, onChannelDataLoaded, changeViewerSetting, replaceAllChannelSettings, options === null || options === void 0 ? void 0 : options.viewerChannelSettings]);
|
|
302
300
|
// of the above dependencies, we expect only `sceneLoader` to change.
|
|
303
301
|
|
|
304
302
|
var setTime = useCallback(function (view3d, time) {
|
|
305
303
|
if (image && !inInitialLoadRef.current) {
|
|
306
|
-
view3d.setTime(image, time
|
|
307
|
-
setIsLoading();
|
|
304
|
+
view3d.setTime(image, time)["catch"](onError);
|
|
305
|
+
setIsLoading(LoadType.TIME);
|
|
308
306
|
}
|
|
309
|
-
}, [image, onError, setIsLoading, inInitialLoadRef
|
|
307
|
+
}, [image, onError, setIsLoading, inInitialLoadRef]);
|
|
310
308
|
var setScene = useCallback(function (scene) {
|
|
311
309
|
if (image && !inInitialLoadRef.current) {
|
|
312
|
-
|
|
313
|
-
|
|
310
|
+
var onCreateScene = onChangeSceneRef.current;
|
|
311
|
+
sceneLoader.loadScene(scene, image, undefined, {
|
|
312
|
+
onCreateScene: onCreateScene
|
|
313
|
+
})["catch"](onError);
|
|
314
|
+
setIsLoading(LoadType.SCENE);
|
|
314
315
|
}
|
|
315
|
-
}, [image, onError, sceneLoader, setIsLoading, inInitialLoadRef,
|
|
316
|
+
}, [image, onError, sceneLoader, setIsLoading, inInitialLoadRef, onChangeSceneRef]);
|
|
316
317
|
return useMemo(function () {
|
|
317
318
|
return {
|
|
318
319
|
image: image,
|
|
@@ -19,7 +19,6 @@ export var
|
|
|
19
19
|
// and linearly increase intensity up to the LUT_MAX_PERCENTILE fraction of pixels.
|
|
20
20
|
LUT_MIN_PERCENTILE = 0.5,
|
|
21
21
|
LUT_MAX_PERCENTILE = 0.983,
|
|
22
|
-
ISOSURFACE_OPACITY_SLIDER_MAX = 255.0,
|
|
23
22
|
ALPHA_MASK_SLIDER_DEFAULT = 0,
|
|
24
23
|
BRIGHTNESS_SLIDER_LEVEL_DEFAULT = 70,
|
|
25
24
|
DENSITY_SLIDER_LEVEL_DEFAULT = 50,
|
|
@@ -208,6 +207,7 @@ export var getDefaultChannelState = function getDefaultChannelState() {
|
|
|
208
207
|
color: [255, 255, 255]
|
|
209
208
|
}],
|
|
210
209
|
plotMin: 0,
|
|
211
|
-
plotMax: TFEDITOR_MAX_BIN
|
|
210
|
+
plotMax: TFEDITOR_MAX_BIN,
|
|
211
|
+
keepIntensityRange: false
|
|
212
212
|
};
|
|
213
213
|
};
|