@searpent/react-image-annotate 2.0.5 → 2.0.8

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 (195) hide show
  1. package/Annotator/examplePhotos.js +6976 -0
  2. package/Annotator/index.js +268 -0
  3. package/Annotator/reducers/combine-reducers.js +14 -0
  4. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  5. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  6. package/Annotator/reducers/general-reducer.js +1152 -0
  7. package/Annotator/reducers/get-active-image.js +27 -0
  8. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  9. package/Annotator/reducers/history-handler.js +38 -0
  10. package/Annotator/reducers/image-reducer.js +20 -0
  11. package/Annotator/reducers/video-reducer.js +88 -0
  12. package/ClassSelectionMenu/index.js +135 -0
  13. package/Crosshairs/index.js +53 -0
  14. package/DebugSidebarBox/index.js +20 -0
  15. package/DemoSite/Editor.js +194 -0
  16. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  17. package/DemoSite/index.js +40 -0
  18. package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  19. package/Editor/annotation-plugin/annotation.js +613 -0
  20. package/Editor/index.js +57 -0
  21. package/{src/Editor → Editor}/tools.js +2 -3
  22. package/FullImageSegmentationAnnotator/index.js +7 -0
  23. package/GroupSelectorSidebarBox/index.js +63 -0
  24. package/HighlightBox/index.js +99 -0
  25. package/HistorySidebarBox/index.js +71 -0
  26. package/ImageCanvas/index.js +429 -0
  27. package/ImageCanvas/region-tools.js +165 -0
  28. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  29. package/ImageCanvas/use-mouse.js +180 -0
  30. package/ImageCanvas/use-project-box.js +27 -0
  31. package/ImageCanvas/use-wasd-mode.js +62 -0
  32. package/ImageMask/index.js +133 -0
  33. package/ImageMask/load-image.js +25 -0
  34. package/ImageSelectorSidebarBox/index.js +60 -0
  35. package/KeyframeTimeline/get-time-string.js +27 -0
  36. package/KeyframeTimeline/index.js +233 -0
  37. package/KeyframesSelectorSidebarBox/index.js +93 -0
  38. package/LandingPage/index.js +159 -0
  39. package/MainLayout/icon-dictionary.js +104 -0
  40. package/MainLayout/index.js +469 -0
  41. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  42. package/MainLayout/types.js +0 -0
  43. package/MainLayout/use-implied-video-regions.js +13 -0
  44. package/MetadataEditorSidebarBox/index.js +126 -0
  45. package/PageSelector/index.js +69 -0
  46. package/{src/PageSelector → PageSelector}/page-selector.css +18 -0
  47. package/PointDistances/index.js +73 -0
  48. package/PreventScrollToParents/index.js +51 -0
  49. package/RegionLabel/index.js +205 -0
  50. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  51. package/RegionSelectAndTransformBoxes/index.js +167 -0
  52. package/RegionSelectorSidebarBox/index.js +248 -0
  53. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  54. package/RegionShapes/index.js +294 -0
  55. package/RegionTags/index.js +142 -0
  56. package/SettingsDialog/index.js +52 -0
  57. package/SettingsProvider/index.js +58 -0
  58. package/Shortcuts/ShortcutField.js +46 -0
  59. package/Shortcuts/index.js +133 -0
  60. package/ShortcutsManager/index.js +155 -0
  61. package/Sidebar/index.js +69 -0
  62. package/SidebarBoxContainer/index.js +93 -0
  63. package/SmallToolButton/index.js +42 -0
  64. package/TagsSidebarBox/index.js +105 -0
  65. package/TaskDescriptionSidebarBox/index.js +58 -0
  66. package/Theme/index.js +30 -0
  67. package/VideoOrImageCanvasBackground/index.js +151 -0
  68. package/colors.js +14 -0
  69. package/hooks/use-colors.js +101 -0
  70. package/hooks/use-event-callback.js +10 -0
  71. package/hooks/use-exclude-pattern.js +24 -0
  72. package/hooks/use-load-image.js +26 -0
  73. package/hooks/use-window-size.js +46 -0
  74. package/{src/hooks → hooks}/xpattern.js +1 -1
  75. package/index.js +3 -0
  76. package/lib.js +3 -0
  77. package/package.json +1 -1
  78. package/stories.js +5 -0
  79. package/{src/utils → utils}/filter-only-unique.js +1 -1
  80. package/utils/get-from-local-storage.js +7 -0
  81. package/utils/get-hotkey-help-text.js +9 -0
  82. package/utils/get-landmarks-with-transform.js +40 -0
  83. package/utils/photosToImages.js +53 -0
  84. package/utils/regions-to-blocks.js +16 -0
  85. package/utils/set-in-local-storage.js +3 -0
  86. package/.babelrc +0 -6
  87. package/.env +0 -1
  88. package/.flowconfig +0 -2
  89. package/.github/workflows/release-on-master.yml +0 -32
  90. package/.github/workflows/test.yml +0 -16
  91. package/.prettierrc +0 -3
  92. package/.releaserc.js +0 -18
  93. package/.storybook/addons.js +0 -2
  94. package/.storybook/config.js +0 -16
  95. package/LICENSE +0 -21
  96. package/public/favicon.ico +0 -0
  97. package/public/index.html +0 -38
  98. package/src/Annotator/bike-pic.png +0 -0
  99. package/src/Annotator/bike-pic2.png +0 -0
  100. package/src/Annotator/dab-keyframes.story.json +0 -1
  101. package/src/Annotator/examplePhotos.js +0 -7601
  102. package/src/Annotator/index.js +0 -291
  103. package/src/Annotator/index.story.js +0 -807
  104. package/src/Annotator/poses.story.js +0 -150
  105. package/src/Annotator/reducers/combine-reducers.js +0 -7
  106. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  107. package/src/Annotator/reducers/general-reducer.js +0 -996
  108. package/src/Annotator/reducers/get-active-image.js +0 -21
  109. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  110. package/src/Annotator/reducers/history-handler.js +0 -60
  111. package/src/Annotator/reducers/image-reducer.js +0 -23
  112. package/src/Annotator/reducers/video-reducer.js +0 -85
  113. package/src/Annotator/video.story.js +0 -51
  114. package/src/ClassSelectionMenu/index.js +0 -108
  115. package/src/Crosshairs/index.js +0 -64
  116. package/src/DebugSidebarBox/index.js +0 -36
  117. package/src/DemoSite/Editor.js +0 -235
  118. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  119. package/src/DemoSite/index.js +0 -41
  120. package/src/DemoSite/index.story.js +0 -10
  121. package/src/DemoSite/simple-segmentation-example.json +0 -572
  122. package/src/Editor/annotation-plugin/annotation.js +0 -515
  123. package/src/Editor/index.js +0 -24
  124. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  125. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  126. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  127. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  128. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  129. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  130. package/src/GroupSelectorSidebarBox/index.js +0 -48
  131. package/src/HighlightBox/index.js +0 -143
  132. package/src/HistorySidebarBox/index.js +0 -78
  133. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  134. package/src/ImageCanvas/index.js +0 -494
  135. package/src/ImageCanvas/index.story.js +0 -314
  136. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  137. package/src/ImageCanvas/region-tools.js +0 -171
  138. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  139. package/src/ImageCanvas/use-mouse.js +0 -168
  140. package/src/ImageCanvas/use-project-box.js +0 -23
  141. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  142. package/src/ImageMask/index.js +0 -127
  143. package/src/ImageMask/load-image.js +0 -32
  144. package/src/ImageSelectorSidebarBox/index.js +0 -54
  145. package/src/KeyframeTimeline/get-time-string.js +0 -25
  146. package/src/KeyframeTimeline/index.js +0 -223
  147. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  148. package/src/LandingPage/content.md +0 -57
  149. package/src/LandingPage/github-markdown.css +0 -964
  150. package/src/LandingPage/index.js +0 -147
  151. package/src/MainLayout/icon-dictionary.js +0 -79
  152. package/src/MainLayout/index.js +0 -510
  153. package/src/MainLayout/index.story.js +0 -240
  154. package/src/MainLayout/types.js +0 -164
  155. package/src/MainLayout/use-implied-video-regions.js +0 -17
  156. package/src/MetadataEditorSidebarBox/index.js +0 -98
  157. package/src/PageSelector/index.js +0 -76
  158. package/src/PointDistances/index.js +0 -90
  159. package/src/PreventScrollToParents/index.js +0 -48
  160. package/src/PreventScrollToParents/index.story.js +0 -23
  161. package/src/RegionLabel/index.js +0 -222
  162. package/src/RegionSelectAndTransformBoxes/index.js +0 -234
  163. package/src/RegionSelectorSidebarBox/index.js +0 -216
  164. package/src/RegionShapes/index.js +0 -254
  165. package/src/RegionTags/index.js +0 -134
  166. package/src/SettingsDialog/index.js +0 -58
  167. package/src/SettingsProvider/index.js +0 -48
  168. package/src/Shortcuts/ShortcutField.js +0 -44
  169. package/src/Shortcuts/index.js +0 -129
  170. package/src/ShortcutsManager/index.js +0 -162
  171. package/src/Sidebar/index.js +0 -117
  172. package/src/SidebarBoxContainer/index.js +0 -93
  173. package/src/SmallToolButton/index.js +0 -57
  174. package/src/TagsSidebarBox/index.js +0 -93
  175. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  176. package/src/Theme/index.js +0 -36
  177. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  178. package/src/colors.js +0 -32
  179. package/src/hooks/use-colors.js +0 -74
  180. package/src/hooks/use-event-callback.js +0 -11
  181. package/src/hooks/use-exclude-pattern.js +0 -27
  182. package/src/hooks/use-load-image.js +0 -21
  183. package/src/hooks/use-window-size.js +0 -46
  184. package/src/hooks/xpattern.png +0 -0
  185. package/src/index.js +0 -18
  186. package/src/lib.js +0 -7
  187. package/src/screenshot.png +0 -0
  188. package/src/site.css +0 -5
  189. package/src/stories.js +0 -2
  190. package/src/utils/get-from-local-storage.js +0 -7
  191. package/src/utils/get-hotkey-help-text.js +0 -11
  192. package/src/utils/get-landmarks-with-transform.js +0 -23
  193. package/src/utils/photosToImages.js +0 -40
  194. package/src/utils/regions-to-blocks.js +0 -14
  195. package/src/utils/set-in-local-storage.js +0 -6
@@ -0,0 +1,69 @@
1
+ import React from 'react';
2
+ import classnames from "classnames";
3
+
4
+ require('./page-selector.css').toString();
5
+
6
+ function PageThumbnail(_ref) {
7
+ var src = _ref.src,
8
+ isActive = _ref.isActive,
9
+ onClick = _ref.onClick,
10
+ pageNumber = _ref.pageNumber;
11
+ return React.createElement("div", {
12
+ role: "button",
13
+ tabIndex: 0,
14
+ className: classnames('page-thumbnail', {
15
+ 'page-thumbnail-is-active': isActive
16
+ }),
17
+ onClick: onClick
18
+ }, React.createElement("img", {
19
+ src: src,
20
+ alt: ""
21
+ }), pageNumber !== undefined && React.createElement("div", {
22
+ className: "page-number-wrapper"
23
+ }, React.createElement("span", {
24
+ className: "page-number"
25
+ }, pageNumber)));
26
+ }
27
+
28
+ function PagesSelector(_ref2) {
29
+ var pages = _ref2.pages,
30
+ onPageClick = _ref2.onPageClick,
31
+ onRecalc = _ref2.onRecalc,
32
+ onSave = _ref2.onSave,
33
+ recalcActive = _ref2.recalcActive,
34
+ saveActive = _ref2.saveActive;
35
+ return React.createElement("div", {
36
+ className: "page-selector"
37
+ }, React.createElement("div", {
38
+ className: "bottom-buttons"
39
+ }, React.createElement("button", {
40
+ onClick: onRecalc,
41
+ disabled: !recalcActive,
42
+ className: "info"
43
+ }, "Recalc"), React.createElement("button", {
44
+ onClick: onSave,
45
+ disabled: !saveActive,
46
+ className: "success"
47
+ }, "Save")), React.createElement("div", {
48
+ className: "pages"
49
+ }, pages.map(function (page, idx) {
50
+ return React.createElement(PageThumbnail, {
51
+ key: page.id,
52
+ src: page.src,
53
+ isActive: page.isActive,
54
+ onClick: function onClick() {
55
+ return onPageClick(idx);
56
+ }
57
+ });
58
+ })));
59
+ }
60
+
61
+ PagesSelector.defaultProps = {
62
+ onPageClick: function onPageClick() {},
63
+ onRecalc: function onRecalc() {},
64
+ onSave: function onSave() {},
65
+ recalcActive: false,
66
+ saveActive: false,
67
+ pageNumber: undefined
68
+ };
69
+ export default PagesSelector;
@@ -50,6 +50,24 @@
50
50
  width: 100%;
51
51
  }
52
52
 
53
+ .bottom-buttons button.info {
54
+ background-color: transparent;
55
+ border-radius: 0.5rem;
56
+ background-image: linear-gradient(310deg, #627594, #a8b8d8);
57
+ color: white;
58
+ border: none;
59
+ padding: 0.5rem 0;
60
+ }
61
+
62
+ .bottom-buttons button.success {
63
+ color: white;
64
+ background-image: linear-gradient(310deg, #2dce89, #2dcecc);
65
+ border-radius: 0.5rem;
66
+ border: none;
67
+ padding: 0.5rem 0;
68
+ }
69
+
70
+
53
71
  .page-number-wrapper {
54
72
  position: absolute;
55
73
  bottom: 0;
@@ -0,0 +1,73 @@
1
+ import React, { Fragment } from "react";
2
+ import { styled } from "@mui/material/styles";
3
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
4
+ var theme = createTheme();
5
+ var Svg = styled("svg")(function (_ref) {
6
+ var theme = _ref.theme;
7
+ return {
8
+ pointerEvents: "none",
9
+ position: "absolute",
10
+ zIndex: 1,
11
+ left: 0,
12
+ top: 0,
13
+ width: "100%",
14
+ height: "100%",
15
+ "& text": {
16
+ fill: "#fff"
17
+ },
18
+ "& path": {
19
+ vectorEffect: "non-scaling-stroke",
20
+ strokeWidth: 2,
21
+ opacity: 0.5,
22
+ stroke: "#FFF",
23
+ fill: "none",
24
+ strokeDasharray: 5,
25
+ animationDuration: "4s",
26
+ animationTimingFunction: "linear",
27
+ animationIterationCount: "infinite",
28
+ animationPlayState: "running"
29
+ }
30
+ };
31
+ });
32
+ export var PointDistances = function PointDistances(_ref2) {
33
+ var projectRegionBox = _ref2.projectRegionBox,
34
+ regions = _ref2.regions,
35
+ pointDistancePrecision = _ref2.pointDistancePrecision,
36
+ realSize = _ref2.realSize;
37
+ return React.createElement(ThemeProvider, {
38
+ theme: theme
39
+ }, React.createElement(Svg, null, regions.filter(function (r1) {
40
+ return r1.type === "point";
41
+ }).flatMap(function (r1, i1) {
42
+ return regions.filter(function (r2, i2) {
43
+ return i2 > i1;
44
+ }).filter(function (r2) {
45
+ return r2.type === "point";
46
+ }).map(function (r2) {
47
+ var pr1 = projectRegionBox(r1);
48
+ var pr2 = projectRegionBox(r2);
49
+ var prm = {
50
+ x: (pr1.x + pr1.w / 2 + pr2.x + pr2.w / 2) / 2,
51
+ y: (pr1.y + pr1.h / 2 + pr2.y + pr2.h / 2) / 2
52
+ };
53
+ var displayDistance;
54
+
55
+ if (realSize) {
56
+ var w = realSize.w,
57
+ h = realSize.h,
58
+ unitName = realSize.unitName;
59
+ displayDistance = Math.sqrt(Math.pow(r1.x * w - r2.x * w, 2) + Math.pow(r1.y * h - r2.y * h, 2)).toFixed(pointDistancePrecision) + unitName;
60
+ } else {
61
+ displayDistance = (Math.sqrt(Math.pow(r1.x - r2.x, 2) + Math.pow(r1.y - r2.y, 2)) * 100).toFixed(pointDistancePrecision) + "%";
62
+ }
63
+
64
+ return React.createElement(Fragment, null, React.createElement("path", {
65
+ d: "M".concat(pr1.x + pr1.w / 2, ",").concat(pr1.y + pr1.h / 2, " L").concat(pr2.x + pr2.w / 2, ",").concat(pr2.y + pr2.h / 2)
66
+ }), React.createElement("text", {
67
+ x: prm.x,
68
+ y: prm.y
69
+ }, displayDistance));
70
+ });
71
+ })));
72
+ };
73
+ export default PointDistances;
@@ -0,0 +1,51 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ import React, { useState } from "react";
4
+ import { RemoveScroll } from "react-remove-scroll";
5
+ import { styled } from "@mui/material/styles";
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
7
+ import useEventCallback from "use-event-callback";
8
+ var theme = createTheme();
9
+ var Container = styled("div")(function (_ref) {
10
+ var theme = _ref.theme;
11
+ return {
12
+ "& > div": {
13
+ width: "100%",
14
+ height: "100%"
15
+ }
16
+ };
17
+ });
18
+ export var PreventScrollToParents = function PreventScrollToParents(_ref2) {
19
+ var children = _ref2.children,
20
+ otherProps = _objectWithoutProperties(_ref2, ["children"]);
21
+
22
+ var _useState = useState(false),
23
+ _useState2 = _slicedToArray(_useState, 2),
24
+ mouseOver = _useState2[0],
25
+ changeMouseOver = _useState2[1];
26
+
27
+ var onMouseMove = useEventCallback(function (e) {
28
+ if (!mouseOver) changeMouseOver(true);
29
+
30
+ if (otherProps.onMouseMove) {
31
+ otherProps.onMouseMove(e);
32
+ }
33
+ });
34
+ var onMouseLeave = useEventCallback(function (e) {
35
+ setTimeout(function () {
36
+ if (mouseOver) {
37
+ changeMouseOver(false);
38
+ }
39
+ }, 100);
40
+ });
41
+ return React.createElement(ThemeProvider, {
42
+ theme: theme
43
+ }, React.createElement(Container, Object.assign({}, otherProps, {
44
+ onMouseMove: onMouseMove,
45
+ onMouseLeave: onMouseLeave
46
+ }), React.createElement(RemoveScroll, {
47
+ enabled: mouseOver,
48
+ removeScrollBar: false
49
+ }, children)));
50
+ };
51
+ export default PreventScrollToParents;
@@ -0,0 +1,205 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
2
+ import React, { useRef, memo } from "react";
3
+ import Paper from "@mui/material/Paper";
4
+ import { makeStyles } from "@mui/styles";
5
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
6
+ import styles from "./styles";
7
+ import classnames from "classnames";
8
+ import IconButton from "@mui/material/IconButton";
9
+ import Button from "@mui/material/Button";
10
+ import TrashIcon from "@mui/icons-material/Delete";
11
+ import CheckIcon from "@mui/icons-material/Check";
12
+ import TextField from "@mui/material/TextField";
13
+ import Select from "react-select";
14
+ import CreatableSelect from "react-select/creatable";
15
+ import { asMutable } from "seamless-immutable";
16
+ var theme = createTheme();
17
+ var useStyles = makeStyles(function (theme) {
18
+ return styles;
19
+ });
20
+ export var RegionLabel = function RegionLabel(_ref) {
21
+ var region = _ref.region,
22
+ editing = _ref.editing,
23
+ allowedClasses = _ref.allowedClasses,
24
+ allowedTags = _ref.allowedTags,
25
+ onDelete = _ref.onDelete,
26
+ _onChange = _ref.onChange,
27
+ onClose = _ref.onClose,
28
+ onOpen = _ref.onOpen,
29
+ onRegionClassAdded = _ref.onRegionClassAdded,
30
+ allowComments = _ref.allowComments,
31
+ hideNotEditingLabel = _ref.hideNotEditingLabel,
32
+ allowedGroups = _ref.allowedGroups;
33
+ var classes = useStyles();
34
+ var commentInputRef = useRef(null);
35
+
36
+ var onCommentInputClick = function onCommentInputClick(_) {
37
+ // The TextField wraps the <input> tag with two divs
38
+ var commentInput = commentInputRef.current.children[0].children[0];
39
+ if (commentInput) return commentInput.focus();
40
+ };
41
+
42
+ if (hideNotEditingLabel && !editing) return null;
43
+ return React.createElement(ThemeProvider, {
44
+ theme: theme
45
+ }, React.createElement(Paper, {
46
+ onClick: function onClick() {
47
+ return !editing ? onOpen(region) : null;
48
+ },
49
+ className: classnames(classes.regionInfo, {
50
+ highlighted: region.highlighted
51
+ })
52
+ }, !editing ? React.createElement("div", null, region.cls && React.createElement("div", {
53
+ className: "name"
54
+ }, React.createElement("div", {
55
+ className: "circle",
56
+ style: {
57
+ backgroundColor: region.color
58
+ }
59
+ }), region.cls), region.tags && React.createElement("div", {
60
+ className: "tags"
61
+ }, region.tags.map(function (t) {
62
+ return React.createElement("div", {
63
+ key: t,
64
+ className: "tag"
65
+ }, t);
66
+ }))) : React.createElement("div", {
67
+ style: {
68
+ width: 200
69
+ }
70
+ }, React.createElement("div", {
71
+ style: {
72
+ display: "flex",
73
+ flexDirection: "row"
74
+ }
75
+ }, React.createElement("div", {
76
+ style: {
77
+ display: "flex",
78
+ backgroundColor: region.color || "#888",
79
+ color: "#fff",
80
+ padding: 4,
81
+ paddingLeft: 8,
82
+ paddingRight: 8,
83
+ borderRadius: 4,
84
+ fontWeight: "bold",
85
+ textShadow: "0px 0px 5px rgba(0,0,0,0.4)"
86
+ }
87
+ }, region.type), React.createElement("div", {
88
+ style: {
89
+ flexGrow: 1
90
+ }
91
+ }), React.createElement(IconButton, {
92
+ onClick: function onClick() {
93
+ return onDelete(region);
94
+ },
95
+ tabIndex: -1,
96
+ style: {
97
+ width: 22,
98
+ height: 22
99
+ },
100
+ size: "small",
101
+ variant: "outlined"
102
+ }, React.createElement(TrashIcon, {
103
+ style: {
104
+ marginTop: -8,
105
+ width: 16,
106
+ height: 16
107
+ }
108
+ }))), (allowedClasses || []).length > 0 && React.createElement("div", {
109
+ style: {
110
+ marginTop: 6
111
+ }
112
+ }, React.createElement(CreatableSelect, {
113
+ placeholder: "Classification",
114
+ onChange: function onChange(o, actionMeta) {
115
+ if (actionMeta.action == "create-option") {
116
+ onRegionClassAdded(o.value);
117
+ }
118
+
119
+ return _onChange(_objectSpread({}, region, {
120
+ cls: o.value
121
+ }));
122
+ },
123
+ value: region.cls ? {
124
+ label: region.cls,
125
+ value: region.cls
126
+ } : null,
127
+ options: asMutable(allowedClasses.map(function (c) {
128
+ return {
129
+ value: c,
130
+ label: c
131
+ };
132
+ }))
133
+ })), (allowedGroups || []).length > 0 && React.createElement(Select, {
134
+ onChange: function onChange(newGroup) {
135
+ return _onChange(_objectSpread({}, region, {
136
+ groupId: newGroup.value
137
+ }));
138
+ },
139
+ placeholder: "Group",
140
+ value: allowedGroups.filter(function (g) {
141
+ return g.value === region.groupId;
142
+ }),
143
+ options: allowedGroups
144
+ }), (allowedTags || []).length > 0 && React.createElement("div", {
145
+ style: {
146
+ marginTop: 4
147
+ }
148
+ }, React.createElement(Select, {
149
+ onChange: function onChange(newTags) {
150
+ return _onChange(_objectSpread({}, region, {
151
+ tags: newTags.map(function (t) {
152
+ return t.value;
153
+ })
154
+ }));
155
+ },
156
+ placeholder: "Tags",
157
+ value: (region.tags || []).map(function (c) {
158
+ return {
159
+ label: c,
160
+ value: c
161
+ };
162
+ }),
163
+ isMulti: true,
164
+ options: asMutable(allowedTags.map(function (c) {
165
+ return {
166
+ value: c,
167
+ label: c
168
+ };
169
+ }))
170
+ })), allowComments && React.createElement(TextField, {
171
+ InputProps: {
172
+ className: classes.commentBox
173
+ },
174
+ fullWidth: true,
175
+ multiline: true,
176
+ rows: 3,
177
+ ref: commentInputRef,
178
+ onClick: onCommentInputClick,
179
+ value: region.comment || "",
180
+ onChange: function onChange(event) {
181
+ return _onChange(_objectSpread({}, region, {
182
+ comment: event.target.value
183
+ }));
184
+ }
185
+ }), onClose && React.createElement("div", {
186
+ style: {
187
+ marginTop: 4,
188
+ display: "flex"
189
+ }
190
+ }, React.createElement("div", {
191
+ style: {
192
+ flexGrow: 1
193
+ }
194
+ }), React.createElement(Button, {
195
+ onClick: function onClick() {
196
+ return onClose(region);
197
+ },
198
+ size: "small",
199
+ variant: "contained",
200
+ color: "primary"
201
+ }, React.createElement(CheckIcon, null))))));
202
+ };
203
+ export default memo(RegionLabel, function (prevProps, nextProps) {
204
+ return prevProps.editing === nextProps.editing && prevProps.region === nextProps.region;
205
+ });
@@ -1,7 +1,4 @@
1
- // @flow
2
-
3
- import { grey } from "@mui/material/colors"
4
-
1
+ import { grey } from "@mui/material/colors";
5
2
  export default {
6
3
  regionInfo: {
7
4
  fontSize: 12,
@@ -10,13 +7,13 @@ export default {
10
7
  opacity: 0.5,
11
8
  "&:hover": {
12
9
  opacity: 0.9,
13
- cursor: "pointer",
10
+ cursor: "pointer"
14
11
  },
15
12
  "&.highlighted": {
16
13
  opacity: 0.9,
17
14
  "&:hover": {
18
- opacity: 1,
19
- },
15
+ opacity: 1
16
+ }
20
17
  },
21
18
  // pointerEvents: "none",
22
19
  fontWeight: 600,
@@ -31,8 +28,8 @@ export default {
31
28
  boxShadow: "0px 0px 2px rgba(0,0,0,0.4)",
32
29
  width: 10,
33
30
  height: 10,
34
- borderRadius: 5,
35
- },
31
+ borderRadius: 5
32
+ }
36
33
  },
37
34
  "& .tags": {
38
35
  "& .tag": {
@@ -40,12 +37,12 @@ export default {
40
37
  display: "inline-block",
41
38
  margin: 1,
42
39
  fontSize: 10,
43
- textDecoration: "underline",
44
- },
45
- },
40
+ textDecoration: "underline"
41
+ }
42
+ }
46
43
  },
47
44
  commentBox: {
48
45
  fontWeight: 400,
49
- fontSize: 13,
50
- },
51
- }
46
+ fontSize: 13
47
+ }
48
+ };
@@ -0,0 +1,167 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { Fragment, memo } from "react";
3
+ import HighlightBox from "../HighlightBox";
4
+ import { styled } from "@mui/material/styles";
5
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
6
+ import PreventScrollToParents from "../PreventScrollToParents";
7
+ import Tooltip from "@mui/material/Tooltip";
8
+ var theme = createTheme();
9
+ var TransformGrabber = styled("div")(function (_ref) {
10
+ var theme = _ref.theme;
11
+ return {
12
+ width: 8,
13
+ height: 8,
14
+ zIndex: 2,
15
+ border: "2px solid #FFF",
16
+ position: "absolute"
17
+ };
18
+ });
19
+ var boxCursorMap = [["nw-resize", "n-resize", "ne-resize"], ["w-resize", "grab", "e-resize"], ["sw-resize", "s-resize", "se-resize"]];
20
+
21
+ var arePropsEqual = function arePropsEqual(prev, next) {
22
+ return prev.region === next.region && prev.dragWithPrimary === next.dragWithPrimary && prev.createWithPrimary === next.createWithPrimary && prev.zoomWithPrimary === next.zoomWithPrimary && prev.mat === next.mat;
23
+ };
24
+
25
+ export var RegionSelectAndTransformBox = memo(function (_ref2) {
26
+ var r = _ref2.region,
27
+ mouseEvents = _ref2.mouseEvents,
28
+ projectRegionBox = _ref2.projectRegionBox,
29
+ dragWithPrimary = _ref2.dragWithPrimary,
30
+ createWithPrimary = _ref2.createWithPrimary,
31
+ zoomWithPrimary = _ref2.zoomWithPrimary,
32
+ onBeginMovePoint = _ref2.onBeginMovePoint,
33
+ onSelectRegion = _ref2.onSelectRegion,
34
+ layoutParams = _ref2.layoutParams,
35
+ _ref2$fullImageSegmen = _ref2.fullImageSegmentationMode,
36
+ fullImageSegmentationMode = _ref2$fullImageSegmen === void 0 ? false : _ref2$fullImageSegmen,
37
+ mat = _ref2.mat,
38
+ onBeginBoxTransform = _ref2.onBeginBoxTransform,
39
+ onBeginMovePolygonPoint = _ref2.onBeginMovePolygonPoint,
40
+ onBeginMoveKeypoint = _ref2.onBeginMoveKeypoint,
41
+ onAddPolygonPoint = _ref2.onAddPolygonPoint,
42
+ showHighlightBox = _ref2.showHighlightBox;
43
+ var pbox = projectRegionBox(r);
44
+ var _layoutParams$current = layoutParams.current,
45
+ iw = _layoutParams$current.iw,
46
+ ih = _layoutParams$current.ih;
47
+ return React.createElement(ThemeProvider, {
48
+ theme: theme
49
+ }, React.createElement(Fragment, null, React.createElement(PreventScrollToParents, null, showHighlightBox && r.type !== "polygon" && React.createElement(HighlightBox, {
50
+ region: r,
51
+ mouseEvents: mouseEvents,
52
+ dragWithPrimary: dragWithPrimary,
53
+ createWithPrimary: createWithPrimary,
54
+ zoomWithPrimary: zoomWithPrimary,
55
+ onBeginMovePoint: onBeginMovePoint,
56
+ onSelectRegion: onSelectRegion,
57
+ pbox: pbox
58
+ }), r.type === "box" && !dragWithPrimary && !zoomWithPrimary && !r.locked && r.highlighted && mat.a < 1.2 && [[0, 0], [0.5, 0], [1, 0], [1, 0.5], [1, 1], [0.5, 1], [0, 1], [0, 0.5], [0.5, 0.5]].map(function (_ref3, i) {
59
+ var _ref4 = _slicedToArray(_ref3, 2),
60
+ px = _ref4[0],
61
+ py = _ref4[1];
62
+
63
+ return React.createElement(TransformGrabber, Object.assign({
64
+ key: i
65
+ }, mouseEvents, {
66
+ onMouseDown: function onMouseDown(e) {
67
+ if (e.button === 0) return onBeginBoxTransform(r, [px * 2 - 1, py * 2 - 1]);
68
+ mouseEvents.onMouseDown(e);
69
+ },
70
+ style: {
71
+ left: pbox.x - 4 - 2 + pbox.w * px,
72
+ top: pbox.y - 4 - 2 + pbox.h * py,
73
+ cursor: boxCursorMap[py * 2][px * 2],
74
+ borderRadius: px === 0.5 && py === 0.5 ? 4 : undefined
75
+ }
76
+ }));
77
+ }), r.type === "polygon" && !dragWithPrimary && !zoomWithPrimary && !r.locked && r.highlighted && r.points.map(function (_ref5, i) {
78
+ var _ref6 = _slicedToArray(_ref5, 2),
79
+ px = _ref6[0],
80
+ py = _ref6[1];
81
+
82
+ var proj = mat.clone().inverse().applyToPoint(px * iw, py * ih);
83
+ return React.createElement(TransformGrabber, Object.assign({
84
+ key: i
85
+ }, mouseEvents, {
86
+ onMouseDown: function onMouseDown(e) {
87
+ if (e.button === 0 && (!r.open || i === 0)) return onBeginMovePolygonPoint(r, i);
88
+ mouseEvents.onMouseDown(e);
89
+ },
90
+ style: {
91
+ cursor: !r.open ? "move" : i === 0 ? "pointer" : undefined,
92
+ zIndex: 10,
93
+ pointerEvents: r.open && i === r.points.length - 1 ? "none" : undefined,
94
+ left: proj.x - 4,
95
+ top: proj.y - 4
96
+ }
97
+ }));
98
+ }), r.type === "polygon" && r.highlighted && !dragWithPrimary && !zoomWithPrimary && !r.locked && !r.open && r.points.length > 1 && r.points.map(function (p1, i) {
99
+ return [p1, r.points[(i + 1) % r.points.length]];
100
+ }).map(function (_ref7) {
101
+ var _ref8 = _slicedToArray(_ref7, 2),
102
+ p1 = _ref8[0],
103
+ p2 = _ref8[1];
104
+
105
+ return [(p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2];
106
+ }).map(function (pa, i) {
107
+ var proj = mat.clone().inverse().applyToPoint(pa[0] * iw, pa[1] * ih);
108
+ return React.createElement(TransformGrabber, Object.assign({
109
+ key: i
110
+ }, mouseEvents, {
111
+ onMouseDown: function onMouseDown(e) {
112
+ if (e.button === 0) return onAddPolygonPoint(r, pa, i + 1);
113
+ mouseEvents.onMouseDown(e);
114
+ },
115
+ style: {
116
+ cursor: "copy",
117
+ zIndex: 10,
118
+ left: proj.x - 4,
119
+ top: proj.y - 4,
120
+ border: "2px dotted #fff",
121
+ opacity: 0.5
122
+ }
123
+ }));
124
+ }), r.type === "keypoints" && !dragWithPrimary && !zoomWithPrimary && !r.locked && r.highlighted && Object.entries(r.points).map(function (_ref9, i) {
125
+ var _ref10 = _slicedToArray(_ref9, 2),
126
+ keypointId = _ref10[0],
127
+ _ref10$ = _ref10[1],
128
+ px = _ref10$.x,
129
+ py = _ref10$.y;
130
+
131
+ var proj = mat.clone().inverse().applyToPoint(px * iw, py * ih);
132
+ return React.createElement(Tooltip, {
133
+ title: keypointId,
134
+ key: i
135
+ }, React.createElement(TransformGrabber, Object.assign({
136
+ key: i
137
+ }, mouseEvents, {
138
+ onMouseDown: function onMouseDown(e) {
139
+ if (e.button === 0 && (!r.open || i === 0)) return onBeginMoveKeypoint(r, keypointId);
140
+ mouseEvents.onMouseDown(e);
141
+ },
142
+ style: {
143
+ cursor: !r.open ? "move" : i === 0 ? "pointer" : undefined,
144
+ zIndex: 10,
145
+ pointerEvents: r.open && i === r.points.length - 1 ? "none" : undefined,
146
+ left: proj.x - 4,
147
+ top: proj.y - 4
148
+ }
149
+ })));
150
+ }))));
151
+ }, arePropsEqual);
152
+ export var RegionSelectAndTransformBoxes = memo(function (props) {
153
+ return props.regions.filter(function (r) {
154
+ return r.visible || r.visible === undefined;
155
+ }).filter(function (r) {
156
+ return !r.locked;
157
+ }).map(function (r, i) {
158
+ return React.createElement(RegionSelectAndTransformBox, Object.assign({
159
+ key: r.id
160
+ }, props, {
161
+ region: r
162
+ }));
163
+ });
164
+ }, function (n, p) {
165
+ return n.regions === p.regions && n.mat === p.mat;
166
+ });
167
+ export default RegionSelectAndTransformBoxes;