@aics/vole-app 2.11.0

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 (135) hide show
  1. package/LICENSE +33 -0
  2. package/LICENSE.txt +26 -0
  3. package/README.md +45 -0
  4. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.eot +0 -0
  5. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.js +2337 -0
  6. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.svg +604 -0
  7. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.ttf +0 -0
  8. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff +0 -0
  9. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff2 +0 -0
  10. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.eot +0 -0
  11. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.js +2336 -0
  12. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.svg +604 -0
  13. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.ttf +0 -0
  14. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff +0 -0
  15. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff2 +0 -0
  16. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.eot +0 -0
  17. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.js +2337 -0
  18. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.svg +604 -0
  19. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.ttf +0 -0
  20. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff +0 -0
  21. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff2 +0 -0
  22. package/es/aics-image-viewer/assets/icons/axes.js +20 -0
  23. package/es/aics-image-viewer/assets/icons/boundingBox.js +18 -0
  24. package/es/aics-image-viewer/assets/icons/camera.js +15 -0
  25. package/es/aics-image-viewer/assets/icons/channels.js +15 -0
  26. package/es/aics-image-viewer/assets/icons/closePanel.js +18 -0
  27. package/es/aics-image-viewer/assets/icons/download.js +17 -0
  28. package/es/aics-image-viewer/assets/icons/dropdownArrow.js +15 -0
  29. package/es/aics-image-viewer/assets/icons/index.js +24 -0
  30. package/es/aics-image-viewer/assets/icons/metadata.js +15 -0
  31. package/es/aics-image-viewer/assets/icons/preferences.js +15 -0
  32. package/es/aics-image-viewer/assets/icons/resetView.js +16 -0
  33. package/es/aics-image-viewer/assets/icons/svg.d.js +0 -0
  34. package/es/aics-image-viewer/assets/icons/turnTable.js +18 -0
  35. package/es/aics-image-viewer/assets/styles/animatedEllipsis.css +21 -0
  36. package/es/aics-image-viewer/assets/styles/globals.css +35 -0
  37. package/es/aics-image-viewer/assets/styles/noui-slider-override.css +1 -0
  38. package/es/aics-image-viewer/assets/styles/variables.css +1 -0
  39. package/es/aics-image-viewer/components/App/ChannelUpdater.js +96 -0
  40. package/es/aics-image-viewer/components/App/index.js +849 -0
  41. package/es/aics-image-viewer/components/App/styles.css +60 -0
  42. package/es/aics-image-viewer/components/App/types.js +1 -0
  43. package/es/aics-image-viewer/components/AxisClipSliders/index.js +285 -0
  44. package/es/aics-image-viewer/components/AxisClipSliders/styles.css +257 -0
  45. package/es/aics-image-viewer/components/BottomPanel/index.js +70 -0
  46. package/es/aics-image-viewer/components/BottomPanel/styles.css +85 -0
  47. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +113 -0
  48. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/styles.css +12 -0
  49. package/es/aics-image-viewer/components/ChannelsWidget.js +100 -0
  50. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +158 -0
  51. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +38 -0
  52. package/es/aics-image-viewer/components/ColorPicker.js +120 -0
  53. package/es/aics-image-viewer/components/ControlPanel/index.js +180 -0
  54. package/es/aics-image-viewer/components/ControlPanel/styles.css +169 -0
  55. package/es/aics-image-viewer/components/CustomizeWidget.js +46 -0
  56. package/es/aics-image-viewer/components/ErrorAlert/index.js +144 -0
  57. package/es/aics-image-viewer/components/ErrorAlert/styles.css +22 -0
  58. package/es/aics-image-viewer/components/GlobalVolumeControls.js +38 -0
  59. package/es/aics-image-viewer/components/MetadataViewer/index.js +99 -0
  60. package/es/aics-image-viewer/components/MetadataViewer/styles.css +81 -0
  61. package/es/aics-image-viewer/components/StyleProvider/index.js +210 -0
  62. package/es/aics-image-viewer/components/TfEditor/index.js +584 -0
  63. package/es/aics-image-viewer/components/TfEditor/styles.css +88 -0
  64. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +55 -0
  65. package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +22 -0
  66. package/es/aics-image-viewer/components/Toolbar/index.js +274 -0
  67. package/es/aics-image-viewer/components/Toolbar/styles.css +241 -0
  68. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +160 -0
  69. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +261 -0
  70. package/es/aics-image-viewer/components/ViewerStateProvider/types.js +1 -0
  71. package/es/aics-image-viewer/components/shared/NumericInput/index.js +147 -0
  72. package/es/aics-image-viewer/components/shared/NumericInput/styles.css +64 -0
  73. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +17 -0
  74. package/es/aics-image-viewer/components/shared/SliderRow/index.js +31 -0
  75. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +19 -0
  76. package/es/aics-image-viewer/components/shared/SmarterSlider.js +40 -0
  77. package/es/aics-image-viewer/components/shared/ViewerIcon.js +22 -0
  78. package/es/aics-image-viewer/shared/colorPalette.js +19 -0
  79. package/es/aics-image-viewer/shared/constants.js +164 -0
  80. package/es/aics-image-viewer/shared/enums.js +18 -0
  81. package/es/aics-image-viewer/shared/types.js +6 -0
  82. package/es/aics-image-viewer/shared/utils/colorRepresentations.js +16 -0
  83. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +182 -0
  84. package/es/aics-image-viewer/shared/utils/hooks.js +51 -0
  85. package/es/aics-image-viewer/shared/utils/httpClient.js +57 -0
  86. package/es/aics-image-viewer/shared/utils/playControls.js +97 -0
  87. package/es/aics-image-viewer/shared/utils/sceneStore.js +140 -0
  88. package/es/aics-image-viewer/shared/utils/sliderValuesToImageValues.js +36 -0
  89. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +132 -0
  90. package/es/aics-image-viewer/shared/utils/utilsService.js +54 -0
  91. package/es/aics-image-viewer/shared/utils/viewerChannelSettings.js +152 -0
  92. package/es/aics-image-viewer/shared/utils/viewerState.js +69 -0
  93. package/es/aics-image-viewer/shared/utils/webgl-debug.js +1103 -0
  94. package/es/index.js +4 -0
  95. package/package.json +130 -0
  96. package/type-declarations/aics-image-viewer/assets/icons/index.d.ts +14 -0
  97. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +16 -0
  98. package/type-declarations/aics-image-viewer/components/App/index.d.ts +6 -0
  99. package/type-declarations/aics-image-viewer/components/App/types.d.ts +45 -0
  100. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +24 -0
  101. package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +11 -0
  102. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +33 -0
  103. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +19 -0
  104. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +17 -0
  105. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +13 -0
  106. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +20 -0
  107. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +15 -0
  108. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +12 -0
  109. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +21 -0
  110. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +7 -0
  111. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +5 -0
  112. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +19 -0
  113. package/type-declarations/aics-image-viewer/components/Toolbar/DownloadButton.d.ts +8 -0
  114. package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +8 -0
  115. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +31 -0
  116. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +34 -0
  117. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +33 -0
  118. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +105 -0
  119. package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +19 -0
  120. package/type-declarations/aics-image-viewer/components/shared/SharedCheckBox.d.ts +9 -0
  121. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +17 -0
  122. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +5 -0
  123. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +9 -0
  124. package/type-declarations/aics-image-viewer/shared/constants.d.ts +40 -0
  125. package/type-declarations/aics-image-viewer/shared/enums.d.ts +15 -0
  126. package/type-declarations/aics-image-viewer/shared/types.d.ts +15 -0
  127. package/type-declarations/aics-image-viewer/shared/utils/colorRepresentations.d.ts +10 -0
  128. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +53 -0
  129. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +14 -0
  130. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +27 -0
  131. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +17 -0
  132. package/type-declarations/aics-image-viewer/shared/utils/sliderValuesToImageValues.d.ts +10 -0
  133. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +46 -0
  134. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +10 -0
  135. package/type-declarations/index.d.ts +7 -0
@@ -0,0 +1,85 @@
1
+ .bottom-panel{
2
+ position:absolute;
3
+ bottom:0;
4
+ width:100%;
5
+ }
6
+
7
+ .bottom-panel .ant-drawer .ant-drawer-content-wrapper{
8
+ transform:translateY(calc(100% - 55px));
9
+ }
10
+
11
+ .bottom-panel .ant-drawer-content-wrapper{
12
+ display:flex;
13
+ flex-direction:column;
14
+ justify-content:flex-end;
15
+ transition:all 0.3s, max-width 0s 0s;
16
+ opacity:85%;
17
+ box-shadow:none;
18
+ }
19
+
20
+ .bottom-panel .ant-drawer-content{
21
+ background:none;
22
+ }
23
+
24
+ .bottom-panel .ant-drawer-header{
25
+ background:none;
26
+ padding:21px 24px;
27
+ border-bottom:none;
28
+ }
29
+
30
+ .bottom-panel .ant-drawer-body{
31
+ padding:16px 24px;
32
+ display:flex;
33
+ flex-direction:row;
34
+ align-items:center;
35
+ }
36
+
37
+ .bottom-panel.bottom-panel.bottom-panel .ant-drawer-title .ant-btn{
38
+ background-color:var(--color-controlpanel-drawer-bg);
39
+ color:#aeacae;
40
+ }
41
+
42
+ .bottom-panel.bottom-panel.bottom-panel .ant-drawer-title .ant-btn:active,
43
+ .bottom-panel.bottom-panel.bottom-panel .ant-drawer-title .ant-btn:hover,
44
+ .bottom-panel.bottom-panel.bottom-panel .ant-drawer-title .ant-btn:focus{
45
+ background-color:var(--color-controlpanel-drawer-bg);
46
+ color:white;
47
+ }
48
+
49
+ .bottom-panel .options-button{
50
+ border:none;
51
+ box-shadow:none;
52
+ margin-right:0.8em;
53
+ margin-bottom:0.2em;
54
+ position:absolute;
55
+ right:0;
56
+ }
57
+
58
+ .bottom-panel .button-arrow{
59
+ transform:rotate(270deg);
60
+ transition:transform 0.2s linear !important;
61
+ }
62
+
63
+ .bottom-panel .drawer-body-wrapper{
64
+ display:none;
65
+ width:100%;
66
+ }
67
+
68
+ .bottom-panel .ant-drawer.ant-drawer-open .ant-drawer-content-wrapper{
69
+ transform:none;
70
+ box-shadow:none;
71
+ -webkit-box-shadow:none;
72
+ }
73
+
74
+ .bottom-panel .ant-drawer.ant-drawer-open .drawer-body-wrapper{
75
+ display:block;
76
+ }
77
+
78
+ .bottom-panel .ant-drawer.ant-drawer-open .ant-drawer-body,
79
+ .bottom-panel .ant-drawer.ant-drawer-open .ant-drawer-title .ant-btn.ant-btn-default{
80
+ background-color:var(--color-controlpanel-drawer-bg);
81
+ }
82
+
83
+ .bottom-panel .ant-drawer.ant-drawer-open .button-arrow{
84
+ transform:rotate(90deg);
85
+ }
@@ -0,0 +1,113 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ 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; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ 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); }
7
+ import { LoadingOutlined } from "@ant-design/icons";
8
+ import React from "react";
9
+ import { CLIPPING_PANEL_HEIGHT_DEFAULT, CLIPPING_PANEL_HEIGHT_TALL } from "../../shared/constants";
10
+ import { ViewMode } from "../../shared/enums";
11
+ import AxisClipSliders from "../AxisClipSliders";
12
+ import BottomPanel from "../BottomPanel";
13
+ import { connectToViewerState } from "../ViewerStateProvider";
14
+ import "./styles.css";
15
+ var ViewerWrapper = function ViewerWrapper(props) {
16
+ var view3dviewerRef = /*#__PURE__*/React.createRef();
17
+ React.useEffect(function () {
18
+ view3dviewerRef.current.appendChild(props.view3d.getDOMElement());
19
+ props.view3d.setAutoRotate(props.autorotate);
20
+ }, []);
21
+
22
+ // TODO necessary?
23
+ React.useEffect(function () {
24
+ props.view3d.resize(null);
25
+ });
26
+ var renderOverlay = function renderOverlay() {
27
+ // Don't show spinner during playback - we may be constantly loading new data, it'll block the view!
28
+ var showSpinner = props.loadingImage && !props.playingAxis;
29
+ var spinner = showSpinner ? /*#__PURE__*/React.createElement("div", {
30
+ style: STYLES.noImage
31
+ }, /*#__PURE__*/React.createElement(LoadingOutlined, {
32
+ style: {
33
+ fontSize: 60,
34
+ zIndex: 1000
35
+ }
36
+ })) : null;
37
+ var noImageText = !props.loadingImage && !props.image ? /*#__PURE__*/React.createElement("div", {
38
+ style: STYLES.noImage
39
+ }, "No image selected") : null;
40
+ if (!!noImageText && props.view3d) {
41
+ props.view3d.removeAllVolumes();
42
+ }
43
+ return noImageText || spinner;
44
+ };
45
+ var appHeight = props.appHeight,
46
+ changeViewerSetting = props.changeViewerSetting,
47
+ visibleControls = props.visibleControls,
48
+ numTimesteps = props.numTimesteps,
49
+ numScenes = props.numScenes,
50
+ viewMode = props.viewMode,
51
+ region = props.region,
52
+ slice = props.slice,
53
+ time = props.time;
54
+ var clippingPanelTall = numTimesteps > 1 && numScenes > 1 && viewMode === ViewMode.threeD;
55
+ return /*#__PURE__*/React.createElement("div", {
56
+ className: "cell-canvas",
57
+ style: _objectSpread(_objectSpread({}, STYLES.viewer), {}, {
58
+ height: appHeight
59
+ })
60
+ }, /*#__PURE__*/React.createElement("div", {
61
+ ref: view3dviewerRef,
62
+ style: STYLES.view3d
63
+ }), /*#__PURE__*/React.createElement(BottomPanel, {
64
+ title: "Clipping",
65
+ onVisibleChange: function onVisibleChange(visible) {
66
+ var _props$onClippingPane;
67
+ (_props$onClippingPane = props.onClippingPanelVisibleChange) === null || _props$onClippingPane === void 0 || _props$onClippingPane.call(props, visible, numTimesteps > 1, numScenes > 1, viewMode === ViewMode.threeD);
68
+ },
69
+ onVisibleChangeEnd: props.onClippingPanelVisibleChangeEnd,
70
+ height: clippingPanelTall ? CLIPPING_PANEL_HEIGHT_TALL : CLIPPING_PANEL_HEIGHT_DEFAULT
71
+ }, visibleControls.axisClipSliders && !!props.image && /*#__PURE__*/React.createElement(AxisClipSliders, {
72
+ mode: viewMode,
73
+ image: props.image,
74
+ changeViewerSetting: changeViewerSetting,
75
+ numSlices: props.numSlices,
76
+ numSlicesLoaded: props.numSlicesLoaded,
77
+ numScenes: numScenes,
78
+ region: region,
79
+ slices: slice,
80
+ numTimesteps: numTimesteps,
81
+ time: time,
82
+ scene: props.scene,
83
+ playControls: props.playControls,
84
+ playingAxis: props.playingAxis
85
+ })), renderOverlay());
86
+ };
87
+ export default connectToViewerState(ViewerWrapper, ["autorotate", "viewMode", "region", "slice", "time", "scene", "changeViewerSetting"]);
88
+ var STYLES = {
89
+ viewer: {
90
+ display: "flex",
91
+ position: "relative"
92
+ },
93
+ view3d: {
94
+ width: "100%",
95
+ display: "flex",
96
+ overflow: "hidden"
97
+ },
98
+ noImage: {
99
+ position: "absolute",
100
+ zIndex: 999,
101
+ top: 0,
102
+ left: 0,
103
+ bottom: 0,
104
+ right: 0,
105
+ display: "flex",
106
+ justifyContent: "center",
107
+ alignItems: "center",
108
+ backgroundColor: "#eeeee",
109
+ color: "#9b9b9b",
110
+ fontSize: "2em",
111
+ opacity: 0.75
112
+ }
113
+ };
@@ -0,0 +1,12 @@
1
+ .cell-viewer-wrapper .cell-canvas{
2
+ z-index:10;
3
+ transition:width 0.3s;
4
+ height:100%;
5
+ width:100%;
6
+ }
7
+
8
+ @media only screen and (max-width: 800px){
9
+ .cell-viewer-wrapper .cell-canvas{
10
+ min-width:33px;
11
+ }
12
+ }
@@ -0,0 +1,100 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ 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; }
6
+ 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; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
+ 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; }
9
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
10
+ 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); }
11
+ import { Collapse, List } from "antd";
12
+ import React from "react";
13
+ import { getDisplayName } from "../shared/utils/viewerChannelSettings";
14
+ import ChannelsWidgetRow from "./ChannelsWidgetRow";
15
+ import SharedCheckBox from "./shared/SharedCheckBox";
16
+ import { connectToViewerState } from "./ViewerStateProvider";
17
+ var ChannelsWidget = function ChannelsWidget(props) {
18
+ var channelGroupedByType = props.channelGroupedByType,
19
+ channelSettings = props.channelSettings,
20
+ channelDataChannels = props.channelDataChannels,
21
+ filterFunc = props.filterFunc,
22
+ viewerChannelSettings = props.viewerChannelSettings;
23
+ var createCheckboxHandler = function createCheckboxHandler(key) {
24
+ return function (value, channelArray) {
25
+ props.changeChannelSetting(channelArray, _defineProperty({}, key, value));
26
+ };
27
+ };
28
+ var showVolumes = createCheckboxHandler("volumeEnabled");
29
+ var showSurfaces = createCheckboxHandler("isosurfaceEnabled");
30
+ var renderVisibilityControls = function renderVisibilityControls(channelArray) {
31
+ var volChecked = [];
32
+ var isoChecked = [];
33
+ channelArray.forEach(function (channelIndex) {
34
+ var channelSetting = channelSettings[channelIndex];
35
+ if (!channelSetting) return;
36
+ if (channelSetting.volumeEnabled) {
37
+ volChecked.push(channelIndex);
38
+ }
39
+ if (channelSetting.isosurfaceEnabled) {
40
+ isoChecked.push(channelIndex);
41
+ }
42
+ });
43
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SharedCheckBox, {
44
+ allOptions: channelArray,
45
+ checkedList: volChecked,
46
+ onChange: showVolumes
47
+ }, "All Vol"), /*#__PURE__*/React.createElement(SharedCheckBox, {
48
+ allOptions: channelArray,
49
+ checkedList: isoChecked,
50
+ onChange: showSurfaces
51
+ // keep checkboxes lined up when channel rows have settings icon and headers don't
52
+ ,
53
+ style: {
54
+ flex: 5
55
+ }
56
+ }, "All Surf"));
57
+ };
58
+ var renderChannelRow = function renderChannelRow(channelIndex) {
59
+ var thisChannelSettings = channelSettings[channelIndex];
60
+ return thisChannelSettings ? /*#__PURE__*/React.createElement(ChannelsWidgetRow, {
61
+ key: "".concat(channelIndex, "_").concat(thisChannelSettings.name, "_").concat(channelIndex),
62
+ index: channelIndex,
63
+ channelDataForChannel: channelDataChannels[channelIndex],
64
+ name: getDisplayName(thisChannelSettings.name, channelIndex, viewerChannelSettings),
65
+ channelState: thisChannelSettings,
66
+ changeChannelSetting: props.changeChannelSetting,
67
+ onColorChangeComplete: props.onColorChangeComplete,
68
+ saveIsosurface: props.saveIsosurface
69
+ }) : null;
70
+ };
71
+ var firstKey = Object.keys(channelGroupedByType)[0];
72
+ var rows = channelDataChannels && Object.entries(channelGroupedByType).filter(function (_ref) {
73
+ var _ref2 = _slicedToArray(_ref, 2),
74
+ key = _ref2[0],
75
+ channelArray = _ref2[1];
76
+ return channelArray.length > 0 && (!filterFunc || filterFunc(key));
77
+ }).map(function (_ref3) {
78
+ var _ref4 = _slicedToArray(_ref3, 2),
79
+ key = _ref4[0],
80
+ channelArray = _ref4[1];
81
+ var children = /*#__PURE__*/React.createElement(List, {
82
+ itemLayout: "horizontal",
83
+ dataSource: channelArray,
84
+ renderItem: renderChannelRow
85
+ });
86
+ return {
87
+ key: key,
88
+ label: key,
89
+ children: children,
90
+ extra: renderVisibilityControls(channelArray)
91
+ };
92
+ });
93
+ return /*#__PURE__*/React.createElement(Collapse, {
94
+ bordered: false,
95
+ defaultActiveKey: firstKey,
96
+ items: rows,
97
+ collapsible: "icon"
98
+ });
99
+ };
100
+ export default connectToViewerState(ChannelsWidget, ["channelSettings", "changeChannelSetting"]);
@@ -0,0 +1,158 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ 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; }
5
+ 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; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import { Button, Checkbox, List } from "antd";
8
+ import React, { useCallback, useState } from "react";
9
+ import { ISOSURFACE_OPACITY_SLIDER_MAX } from "../../shared/constants";
10
+ import { colorArrayToObject, colorObjectToArray } from "../../shared/utils/colorRepresentations";
11
+ import ColorPicker from "../ColorPicker";
12
+ import SliderRow from "../shared/SliderRow";
13
+ import ViewerIcon from "../shared/ViewerIcon";
14
+ import TfEditor from "../TfEditor";
15
+ import "./styles.css";
16
+ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
17
+ var index = props.index,
18
+ changeChannelSetting = props.changeChannelSetting,
19
+ saveIsosurface = props.saveIsosurface,
20
+ channelState = props.channelState;
21
+ var _useState = useState(false),
22
+ _useState2 = _slicedToArray(_useState, 2),
23
+ controlsOpen = _useState2[0],
24
+ setControlsOpen = _useState2[1];
25
+ var changeSettingForThisChannel = useCallback(function (value) {
26
+ return changeChannelSetting(index, value);
27
+ }, [changeChannelSetting, index]);
28
+ var volumeCheckHandler = function volumeCheckHandler(_ref) {
29
+ var target = _ref.target;
30
+ changeChannelSetting(index, {
31
+ volumeEnabled: target.checked
32
+ });
33
+ };
34
+ var isosurfaceCheckHandler = function isosurfaceCheckHandler(_ref2) {
35
+ var target = _ref2.target;
36
+ changeChannelSetting(index, {
37
+ isosurfaceEnabled: target.checked
38
+ });
39
+ };
40
+ var onIsovalueChange = function onIsovalueChange(_ref3) {
41
+ var _ref4 = _slicedToArray(_ref3, 1),
42
+ newValue = _ref4[0];
43
+ return changeSettingForThisChannel({
44
+ isovalue: newValue
45
+ });
46
+ };
47
+ var onOpacityChange = function onOpacityChange(_ref5) {
48
+ var _ref6 = _slicedToArray(_ref5, 1),
49
+ newValue = _ref6[0];
50
+ return changeSettingForThisChannel({
51
+ opacity: newValue / ISOSURFACE_OPACITY_SLIDER_MAX
52
+ });
53
+ };
54
+ var onColorChange = function onColorChange(newRGB, _oldRGB, index) {
55
+ var color = colorObjectToArray(newRGB);
56
+ props.changeChannelSetting(index, {
57
+ color: color
58
+ });
59
+ };
60
+ var createColorPicker = function createColorPicker() {
61
+ return /*#__PURE__*/React.createElement(ColorPicker, {
62
+ color: colorArrayToObject(channelState.color),
63
+ onColorChange: onColorChange,
64
+ onColorChangeComplete: props.onColorChangeComplete,
65
+ disableAlpha: true,
66
+ idx: index,
67
+ width: 18
68
+ });
69
+ };
70
+ var visibilityControls = /*#__PURE__*/React.createElement("div", {
71
+ className: "channel-visibility-controls"
72
+ }, /*#__PURE__*/React.createElement(Checkbox, {
73
+ checked: channelState.volumeEnabled,
74
+ onChange: volumeCheckHandler
75
+ }, "Vol"), /*#__PURE__*/React.createElement(Checkbox, {
76
+ checked: channelState.isosurfaceEnabled,
77
+ onChange: isosurfaceCheckHandler
78
+ }, "Surf"), /*#__PURE__*/React.createElement(Button, {
79
+ icon: /*#__PURE__*/React.createElement(ViewerIcon, {
80
+ type: "preferences",
81
+ style: {
82
+ fontSize: "16px"
83
+ }
84
+ }),
85
+ onClick: function onClick() {
86
+ return setControlsOpen(!controlsOpen);
87
+ },
88
+ title: "Open channel settings",
89
+ type: "text"
90
+ }));
91
+ var createTFEditor = function createTFEditor() {
92
+ var controlPoints = channelState.controlPoints,
93
+ colorizeEnabled = channelState.colorizeEnabled,
94
+ colorizeAlpha = channelState.colorizeAlpha,
95
+ useControlPoints = channelState.useControlPoints,
96
+ ramp = channelState.ramp;
97
+ return /*#__PURE__*/React.createElement(TfEditor, {
98
+ id: "TFEditor" + index,
99
+ width: 418,
100
+ height: 145,
101
+ channelData: props.channelDataForChannel,
102
+ controlPoints: controlPoints,
103
+ changeChannelSetting: changeSettingForThisChannel,
104
+ colorizeEnabled: colorizeEnabled,
105
+ colorizeAlpha: colorizeAlpha,
106
+ useControlPoints: useControlPoints,
107
+ ramp: ramp
108
+ });
109
+ };
110
+ var renderSurfaceControls = function renderSurfaceControls() {
111
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(SliderRow, {
112
+ label: "Isovalue",
113
+ max: 255,
114
+ start: channelState.isovalue,
115
+ onChange: onIsovalueChange,
116
+ formatInteger: true
117
+ }), /*#__PURE__*/React.createElement(SliderRow, {
118
+ label: "Opacity",
119
+ max: ISOSURFACE_OPACITY_SLIDER_MAX,
120
+ start: channelState.opacity * ISOSURFACE_OPACITY_SLIDER_MAX,
121
+ onChange: onOpacityChange,
122
+ formatInteger: true
123
+ }), /*#__PURE__*/React.createElement("div", {
124
+ className: "button-row"
125
+ }, /*#__PURE__*/React.createElement(Button, {
126
+ onClick: function onClick() {
127
+ return saveIsosurface(index, "GLTF");
128
+ }
129
+ }, "Export GLTF"), /*#__PURE__*/React.createElement(Button, {
130
+ onClick: function onClick() {
131
+ return saveIsosurface(index, "STL");
132
+ }
133
+ }, "Export STL")));
134
+ };
135
+ var renderControls = function renderControls() {
136
+ if (!channelState.volumeEnabled && !channelState.isosurfaceEnabled) {
137
+ return /*#__PURE__*/React.createElement("h4", {
138
+ style: {
139
+ fontStyle: "italic"
140
+ }
141
+ }, "Not currently visible");
142
+ }
143
+ return /*#__PURE__*/React.createElement(React.Fragment, null, channelState.volumeEnabled && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h4", null, "Volume settings:"), createTFEditor()), channelState.isosurfaceEnabled && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h4", null, "Surface settings:"), renderSurfaceControls()));
144
+ };
145
+ var rowClass = controlsOpen ? "channel-row" : "channel-row controls-closed";
146
+ return /*#__PURE__*/React.createElement(List.Item, {
147
+ key: index,
148
+ className: rowClass
149
+ }, /*#__PURE__*/React.createElement(List.Item.Meta, {
150
+ title: props.name,
151
+ avatar: createColorPicker()
152
+ }), visibilityControls, controlsOpen && /*#__PURE__*/React.createElement("div", {
153
+ style: {
154
+ width: "100%"
155
+ }
156
+ }, renderControls()));
157
+ };
158
+ export default ChannelsWidgetRow;
@@ -0,0 +1,38 @@
1
+ .channel-rows-list .ant-list-item.channel-row{
2
+ padding:22px 0;
3
+ border-bottom:1px solid var(--color-controlpanel-border);
4
+ flex-flow:row wrap;
5
+ }
6
+
7
+ .channel-rows-list .ant-list-item.channel-row .ant-list-item-meta-title,
8
+ .channel-rows-list .ant-list-item.channel-row .ant-checkbox-wrapper{
9
+ color:var(--color-controlpanel-text);
10
+ }
11
+
12
+ .channel-rows-list .ant-list-item.channel-row h4{
13
+ color:var(--color-text-section);
14
+ margin-top:28px;
15
+ margin-bottom:10px;
16
+ }
17
+
18
+ .channel-rows-list .ant-list-item.channel-row .ant-btn-text{
19
+ color:var(--color-button-icon-activated-text);
20
+ transition:color 0.3s;
21
+ }
22
+
23
+ .channel-rows-list .ant-list-item.channel-row .ant-btn-text:hover,
24
+ .channel-rows-list .ant-list-item.channel-row .ant-btn-text:focus-visible{
25
+ color:var(--color-button-tertiary-hover-text) !important;
26
+ }
27
+
28
+ .channel-rows-list .ant-list-item.channel-row .button-row{
29
+ margin-top:16px;
30
+ display:flex;
31
+ justify-content:start;
32
+ align-items:end;
33
+ gap:6px;
34
+ }
35
+
36
+ .channel-rows-list .ant-list-item.channel-row.controls-closed .ant-btn-text:not(:focus-visible){
37
+ color:var(--color-controlpanel-text);
38
+ }
@@ -0,0 +1,120 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ 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; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ 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); }
7
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
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
+ 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
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
13
+ import React from "react";
14
+ import { SketchPicker } from "react-color";
15
+ import { map } from "lodash";
16
+ // if there are fewer than this many screen pixels below the swatch but more above, open above the swatch
17
+ var OPEN_ABOVE_MARGIN = 310;
18
+ var DEFAULT_COLOR = {
19
+ r: "241",
20
+ g: "112",
21
+ b: "19",
22
+ a: "1"
23
+ };
24
+ var ColorPicker = function ColorPicker(props) {
25
+ var _React$useState = React.useState(false),
26
+ _React$useState2 = _slicedToArray(_React$useState, 2),
27
+ isOpen = _React$useState2[0],
28
+ setIsOpen = _React$useState2[1];
29
+ var _React$useState3 = React.useState(false),
30
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
31
+ openAboveSwatch = _React$useState4[0],
32
+ setOpenAboveSwatch = _React$useState4[1];
33
+ var _React$useState5 = React.useState(props.color || DEFAULT_COLOR),
34
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
35
+ currentColor = _React$useState6[0],
36
+ setCurrentColor = _React$useState6[1];
37
+ var swatchRef = React.useRef(null);
38
+ var handleClick = function handleClick() {
39
+ var swatchRect = swatchRef.current.getBoundingClientRect();
40
+ var noRoomBelowSwatch = swatchRect.bottom > window.innerHeight - OPEN_ABOVE_MARGIN;
41
+ setIsOpen(!isOpen);
42
+ setOpenAboveSwatch(noRoomBelowSwatch && swatchRect.top > OPEN_ABOVE_MARGIN);
43
+ };
44
+ var handleClose = function handleClose() {
45
+ return setIsOpen(false);
46
+ };
47
+ var handleChange = function handleChange(color) {
48
+ var _props$onColorChange;
49
+ setCurrentColor(color.rgb);
50
+ // supply onColorChange callback in props.
51
+ (_props$onColorChange = props.onColorChange) === null || _props$onColorChange === void 0 || _props$onColorChange.call(props, color.rgb, currentColor, props.idx);
52
+ };
53
+ var handleChangeComplete = function handleChangeComplete(color) {
54
+ var _props$onColorChangeC;
55
+ setCurrentColor(color.rgb);
56
+ // supply onColorChange callback in props.
57
+ (_props$onColorChangeC = props.onColorChangeComplete) === null || _props$onColorChangeC === void 0 || _props$onColorChangeC.call(props, color.rgb, currentColor, props.idx);
58
+ };
59
+ React.useEffect(function () {
60
+ return setCurrentColor(props.color);
61
+ }, [props.color]);
62
+ var width = props.width || 36;
63
+ var popoverDirectionStyle = openAboveSwatch ? {
64
+ bottom: "21px"
65
+ } : {
66
+ top: "0px"
67
+ };
68
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
69
+ style: STYLES.swatch,
70
+ ref: swatchRef,
71
+ onClick: handleClick
72
+ }, /*#__PURE__*/React.createElement("div", {
73
+ style: _objectSpread(_objectSpread({}, STYLES.color), {}, {
74
+ width: "".concat(width, "px"),
75
+ background: "rgba(".concat(map(currentColor, function (ele) {
76
+ return ele;
77
+ }), ")")
78
+ })
79
+ })), /*#__PURE__*/React.createElement("div", {
80
+ style: {
81
+ position: "absolute"
82
+ }
83
+ }, isOpen ? /*#__PURE__*/React.createElement("div", {
84
+ style: _objectSpread(_objectSpread({}, STYLES.popover), popoverDirectionStyle)
85
+ }, /*#__PURE__*/React.createElement("div", {
86
+ style: STYLES.cover,
87
+ onClick: handleClose
88
+ }), /*#__PURE__*/React.createElement(SketchPicker, {
89
+ color: currentColor,
90
+ onChange: handleChange,
91
+ onChangeComplete: handleChangeComplete,
92
+ disableAlpha: props.disableAlpha
93
+ })) : null));
94
+ };
95
+ export default ColorPicker;
96
+ var STYLES = {
97
+ color: {
98
+ height: "14px",
99
+ margin: "3px",
100
+ borderRadius: "2px"
101
+ },
102
+ swatch: {
103
+ borderRadius: "3px",
104
+ border: "1px solid var(--color-controlpanel-border)",
105
+ display: "inline-block",
106
+ cursor: "pointer",
107
+ verticalAlign: "middle"
108
+ },
109
+ popover: {
110
+ position: "absolute",
111
+ zIndex: "9999"
112
+ },
113
+ cover: {
114
+ position: "fixed",
115
+ top: "0px",
116
+ right: "0px",
117
+ bottom: "0px",
118
+ left: "0px"
119
+ }
120
+ };