@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.
Files changed (81) hide show
  1. package/es/Globals.d.js +0 -0
  2. package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
  3. package/es/aics-image-viewer/components/App/index.js +184 -198
  4. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
  5. package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
  6. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +26 -52
  7. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
  8. package/es/aics-image-viewer/components/ColorPicker.js +1 -1
  9. package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
  10. package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
  11. package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
  12. package/es/aics-image-viewer/components/GlobalVolumeControls.js +15 -12
  13. package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
  14. package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
  15. package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
  16. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
  17. package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
  18. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
  19. package/es/aics-image-viewer/components/shared/SliderRow/index.js +8 -3
  20. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +7 -0
  21. package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
  22. package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
  23. package/es/aics-image-viewer/components/useVolume.js +59 -58
  24. package/es/aics-image-viewer/shared/constants.js +2 -2
  25. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
  26. package/es/aics-image-viewer/shared/utils/sceneStore.js +5 -3
  27. package/es/aics-image-viewer/shared/utils/storage.js +238 -0
  28. package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
  29. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +240 -108
  30. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
  31. package/es/aics-image-viewer/shared/utils/urlParsing.js +278 -153
  32. package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
  33. package/es/aics-image-viewer/state/reset.js +111 -0
  34. package/es/aics-image-viewer/state/store.js +90 -0
  35. package/es/aics-image-viewer/state/subscribers.js +153 -0
  36. package/es/aics-image-viewer/state/test/reset.test.js +247 -0
  37. package/es/aics-image-viewer/state/util.js +71 -0
  38. package/es/index.js +3 -3
  39. package/package.json +18 -11
  40. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
  41. package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
  42. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
  43. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
  44. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
  45. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
  46. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
  47. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
  48. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
  49. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
  50. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
  51. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
  52. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
  53. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
  54. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
  55. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +2 -1
  56. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
  57. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
  58. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
  59. package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
  60. package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
  61. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
  62. package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
  63. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
  64. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
  65. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
  66. package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
  67. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
  68. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
  69. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
  70. package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
  71. package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
  72. package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
  73. package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
  74. package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
  75. package/type-declarations/index.d.ts +4 -4
  76. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
  77. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
  78. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
  79. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
  80. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
  81. /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
@@ -1,18 +1,22 @@
1
- .channel-row .tf-editor-svg.dragging.basic{
2
- cursor:ew-resize;
3
- }
1
+ .channel-row .tf-editor{
2
+ margin-top:27px;
3
+ }
4
4
 
5
- .channel-row .tf-editor-svg.dragging.advanced{
6
- cursor:move;
7
- }
5
+ .channel-row .tf-editor .tf-editor-svg.dragging-slider{
6
+ cursor:ew-resize;
7
+ }
8
8
 
9
- .channel-row .tf-editor-popover{
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.ramp-row{
32
- margin-top:15px;
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.plot-range-row{
36
- margin-bottom:20px;
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 .tick text{
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 .ramp-sliders path{
77
- fill:var(--color-controlpanel-ramp-slider);
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 .ramp-sliders line{
82
- stroke:var(--color-controlpanel-ramp-slider);
83
- cursor:ew-resize;
92
+ .channel-row .tf-editor .sliders line.slider-click-target{
93
+ stroke:transparent;
84
94
  }
85
95
 
86
- .channel-row .ramp-sliders line.ramp-slider-click-target{
87
- stroke:transparent;
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 props.changeViewerSetting("showAxes", !props.showAxes);
115
+ return changeViewerSetting("showAxes", !showAxes);
109
116
  };
110
117
  var toggleBoundingBox = function toggleBoundingBox() {
111
- return props.changeViewerSetting("showBoundingBox", !props.showBoundingBox);
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 changeViewerSetting = props.changeViewerSetting,
118
- resetToSavedViewerState = props.resetToSavedViewerState,
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: props.viewMode,
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 || props.renderMode === RenderMode.pathTrace,
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: props.imageType,
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: props.renderMode,
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 connectToViewerState(Toolbar, ["imageType", "renderMode", "viewMode", "autorotate", "showAxes", "showBoundingBox", "changeViewerSetting", "resetToSavedViewerState"]);
280
+ export default Toolbar;
@@ -1,5 +1,5 @@
1
- import React from "react";
2
1
  import { Checkbox } from "antd";
2
+ import React from "react";
3
3
  var SharedCheckbox = function SharedCheckbox(props) {
4
4
  var onCheckAllChange = function onCheckAllChange(_ref) {
5
5
  var target = _ref.target;
@@ -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 === undefined ? props.children : !props.hideSlider && /*#__PURE__*/React.createElement(SmarterSlider, {
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, useContext, useEffect, useMemo, useRef, useState } from "react";
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 { getDisplayName, makeChannelIndexGrouping } from "../shared/utils/viewerChannelSettings";
24
+ import { makeChannelIndexGrouping } from "../shared/utils/viewerChannelSettings";
25
25
  import { initializeOneChannelSetting } from "../shared/utils/viewerState";
26
- import { ViewerStateContext } from "./ViewerStateProvider";
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
- // Used by `channelVersions` (see below)
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 viewerStateRef = useContext(ViewerStateContext).ref;
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
- var channelSettings = viewerStateRef.current.channelSettings;
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 Math.min(version, CHANNEL_RELOAD);
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 _viewerStateRef$curre = viewerStateRef.current,
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 viewerChannelSettings = getCurrentViewerChannelSettings();
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
- // compare each channel's new displayName to the old displayNames currently in state:
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
- return initializeOneChannelSetting(channel, index, color, viewerChannelSettings);
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
- setChannelSettings(newChannelSettings);
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, _getCurrentViewerChan;
228
- var _viewerStateRef$curre2, scene, time, loadSpec, aimg, channelNames, newChannelSettings, requiredLoadSpec, requiredChannelsToLoad, maskChannelName, maskChannelIndex, slice;
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
- _viewerStateRef$curre2 = viewerStateRef.current, scene = _viewerStateRef$curre2.scene, time = _viewerStateRef$curre2.time;
226
+ scene = useViewerState.getState().scene;
227
+ time = useViewerState.getState().time;
233
228
  loadSpec = new LoadSpec();
234
229
  loadSpec.time = time;
235
- _context.next = 5;
230
+ _context.next = 6;
236
231
  return sceneLoader.createVolume(scene, loadSpec, onChannelDataLoaded)["catch"](onError);
237
- case 5:
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 _viewerStateRef$curre3 = viewerStateRef.current,
246
- time = _viewerStateRef$curre3.time,
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
- maskChannelName = (_getCurrentViewerChan = getCurrentViewerChannelSettings()) === null || _getCurrentViewerChan === void 0 ? void 0 : _getCurrentViewerChan.maskChannelName;
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 (viewerStateRef.current.viewMode === ViewMode.xy) {
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
- sceneLoader.loadScene(scene, aimg, requiredLoadSpec)["catch"](onError);
290
- case 21:
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, onChannelLoadedRef, viewerStateRef, channelVersionsRef, setChannelVersions, playControls, setIsLoading, onChannelDataLoaded]);
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, onChannelDataLoaded)["catch"](onError);
307
- setIsLoading();
304
+ view3d.setTime(image, time)["catch"](onError);
305
+ setIsLoading(LoadType.TIME);
308
306
  }
309
- }, [image, onError, setIsLoading, inInitialLoadRef, onChannelDataLoaded]);
307
+ }, [image, onError, setIsLoading, inInitialLoadRef]);
310
308
  var setScene = useCallback(function (scene) {
311
309
  if (image && !inInitialLoadRef.current) {
312
- sceneLoader.loadScene(scene, image, undefined, onChannelDataLoaded)["catch"](onError);
313
- setIsLoading();
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, onChannelDataLoaded]);
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
  };