@searpent/react-image-annotate 2.0.0 → 2.0.3

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 (174) hide show
  1. package/Annotator/index.js +169 -0
  2. package/Annotator/reducers/combine-reducers.js +14 -0
  3. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  4. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  5. package/Annotator/reducers/general-reducer.js +1058 -0
  6. package/Annotator/reducers/get-active-image.js +27 -0
  7. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  8. package/Annotator/reducers/history-handler.js +38 -0
  9. package/Annotator/reducers/image-reducer.js +20 -0
  10. package/Annotator/reducers/video-reducer.js +88 -0
  11. package/ClassSelectionMenu/index.js +135 -0
  12. package/Crosshairs/index.js +53 -0
  13. package/DebugSidebarBox/index.js +20 -0
  14. package/DemoSite/Editor.js +194 -0
  15. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  16. package/DemoSite/index.js +40 -0
  17. package/FullImageSegmentationAnnotator/index.js +7 -0
  18. package/GroupSelectorSidebarBox/index.js +63 -0
  19. package/HighlightBox/index.js +99 -0
  20. package/HistorySidebarBox/index.js +71 -0
  21. package/ImageCanvas/index.js +424 -0
  22. package/ImageCanvas/region-tools.js +165 -0
  23. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  24. package/ImageCanvas/use-mouse.js +180 -0
  25. package/ImageCanvas/use-project-box.js +27 -0
  26. package/ImageCanvas/use-wasd-mode.js +62 -0
  27. package/ImageMask/index.js +133 -0
  28. package/ImageMask/load-image.js +25 -0
  29. package/ImageSelectorSidebarBox/index.js +60 -0
  30. package/KeyframeTimeline/get-time-string.js +27 -0
  31. package/KeyframeTimeline/index.js +233 -0
  32. package/KeyframesSelectorSidebarBox/index.js +93 -0
  33. package/LandingPage/index.js +159 -0
  34. package/MainLayout/icon-dictionary.js +104 -0
  35. package/MainLayout/index.js +366 -0
  36. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  37. package/MainLayout/types.js +0 -0
  38. package/MainLayout/use-implied-video-regions.js +13 -0
  39. package/PointDistances/index.js +73 -0
  40. package/PreventScrollToParents/index.js +51 -0
  41. package/RegionLabel/index.js +191 -0
  42. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  43. package/RegionSelectAndTransformBoxes/index.js +167 -0
  44. package/RegionSelectorSidebarBox/index.js +248 -0
  45. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  46. package/RegionShapes/index.js +274 -0
  47. package/RegionTags/index.js +138 -0
  48. package/SettingsDialog/index.js +52 -0
  49. package/SettingsProvider/index.js +53 -0
  50. package/Shortcuts/ShortcutField.js +46 -0
  51. package/Shortcuts/index.js +133 -0
  52. package/ShortcutsManager/index.js +155 -0
  53. package/Sidebar/index.js +69 -0
  54. package/SidebarBoxContainer/index.js +93 -0
  55. package/SmallToolButton/index.js +42 -0
  56. package/TagsSidebarBox/index.js +105 -0
  57. package/TaskDescriptionSidebarBox/index.js +58 -0
  58. package/Theme/index.js +30 -0
  59. package/VideoOrImageCanvasBackground/index.js +151 -0
  60. package/colors.js +14 -0
  61. package/hooks/use-event-callback.js +10 -0
  62. package/hooks/use-exclude-pattern.js +24 -0
  63. package/hooks/use-load-image.js +26 -0
  64. package/hooks/use-window-size.js +46 -0
  65. package/{src/hooks → hooks}/xpattern.js +1 -1
  66. package/index.js +3 -0
  67. package/lib.js +3 -0
  68. package/package.json +1 -1
  69. package/stories.js +5 -0
  70. package/utils/get-from-local-storage.js +7 -0
  71. package/utils/get-hotkey-help-text.js +9 -0
  72. package/utils/get-landmarks-with-transform.js +40 -0
  73. package/utils/set-in-local-storage.js +3 -0
  74. package/.babelrc +0 -6
  75. package/.env +0 -1
  76. package/.flowconfig +0 -2
  77. package/.github/workflows/release-on-master.yml +0 -32
  78. package/.github/workflows/test.yml +0 -16
  79. package/.prettierrc +0 -3
  80. package/.releaserc.js +0 -18
  81. package/.storybook/addons.js +0 -2
  82. package/.storybook/config.js +0 -16
  83. package/LICENSE +0 -21
  84. package/public/favicon.ico +0 -0
  85. package/public/index.html +0 -38
  86. package/src/Annotator/bike-pic.png +0 -0
  87. package/src/Annotator/bike-pic2.png +0 -0
  88. package/src/Annotator/dab-keyframes.story.json +0 -1
  89. package/src/Annotator/index.js +0 -206
  90. package/src/Annotator/index.story.js +0 -727
  91. package/src/Annotator/poses.story.js +0 -150
  92. package/src/Annotator/reducers/combine-reducers.js +0 -7
  93. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  94. package/src/Annotator/reducers/general-reducer.js +0 -914
  95. package/src/Annotator/reducers/get-active-image.js +0 -21
  96. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  97. package/src/Annotator/reducers/history-handler.js +0 -60
  98. package/src/Annotator/reducers/image-reducer.js +0 -23
  99. package/src/Annotator/reducers/video-reducer.js +0 -85
  100. package/src/Annotator/video.story.js +0 -51
  101. package/src/ClassSelectionMenu/index.js +0 -108
  102. package/src/Crosshairs/index.js +0 -64
  103. package/src/DebugSidebarBox/index.js +0 -36
  104. package/src/DemoSite/Editor.js +0 -235
  105. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  106. package/src/DemoSite/index.js +0 -41
  107. package/src/DemoSite/index.story.js +0 -10
  108. package/src/DemoSite/simple-segmentation-example.json +0 -572
  109. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  110. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  111. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  112. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  113. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  114. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  115. package/src/HighlightBox/index.js +0 -143
  116. package/src/HistorySidebarBox/index.js +0 -78
  117. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  118. package/src/ImageCanvas/index.js +0 -488
  119. package/src/ImageCanvas/index.story.js +0 -214
  120. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  121. package/src/ImageCanvas/region-tools.js +0 -171
  122. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  123. package/src/ImageCanvas/use-mouse.js +0 -168
  124. package/src/ImageCanvas/use-project-box.js +0 -23
  125. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  126. package/src/ImageMask/index.js +0 -127
  127. package/src/ImageMask/load-image.js +0 -32
  128. package/src/ImageSelectorSidebarBox/index.js +0 -54
  129. package/src/KeyframeTimeline/get-time-string.js +0 -25
  130. package/src/KeyframeTimeline/index.js +0 -223
  131. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  132. package/src/LandingPage/content.md +0 -57
  133. package/src/LandingPage/github-markdown.css +0 -964
  134. package/src/LandingPage/index.js +0 -147
  135. package/src/MainLayout/icon-dictionary.js +0 -79
  136. package/src/MainLayout/index.js +0 -420
  137. package/src/MainLayout/index.story.js +0 -240
  138. package/src/MainLayout/types.js +0 -156
  139. package/src/MainLayout/use-implied-video-regions.js +0 -17
  140. package/src/PointDistances/index.js +0 -90
  141. package/src/PreventScrollToParents/index.js +0 -48
  142. package/src/PreventScrollToParents/index.story.js +0 -23
  143. package/src/RegionLabel/index.js +0 -201
  144. package/src/RegionSelectAndTransformBoxes/index.js +0 -234
  145. package/src/RegionSelectorSidebarBox/index.js +0 -216
  146. package/src/RegionShapes/index.js +0 -236
  147. package/src/RegionTags/index.js +0 -130
  148. package/src/SettingsDialog/index.js +0 -58
  149. package/src/SettingsProvider/index.js +0 -44
  150. package/src/Shortcuts/ShortcutField.js +0 -44
  151. package/src/Shortcuts/index.js +0 -129
  152. package/src/ShortcutsManager/index.js +0 -162
  153. package/src/Sidebar/index.js +0 -117
  154. package/src/SidebarBoxContainer/index.js +0 -93
  155. package/src/SmallToolButton/index.js +0 -57
  156. package/src/TagsSidebarBox/index.js +0 -93
  157. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  158. package/src/Theme/index.js +0 -36
  159. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  160. package/src/colors.js +0 -32
  161. package/src/hooks/use-event-callback.js +0 -11
  162. package/src/hooks/use-exclude-pattern.js +0 -27
  163. package/src/hooks/use-load-image.js +0 -21
  164. package/src/hooks/use-window-size.js +0 -46
  165. package/src/hooks/xpattern.png +0 -0
  166. package/src/index.js +0 -18
  167. package/src/lib.js +0 -7
  168. package/src/screenshot.png +0 -0
  169. package/src/site.css +0 -5
  170. package/src/stories.js +0 -2
  171. package/src/utils/get-from-local-storage.js +0 -7
  172. package/src/utils/get-hotkey-help-text.js +0 -11
  173. package/src/utils/get-landmarks-with-transform.js +0 -23
  174. package/src/utils/set-in-local-storage.js +0 -6
@@ -0,0 +1,191 @@
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
+ var classes = useStyles();
32
+ var commentInputRef = useRef(null);
33
+
34
+ var onCommentInputClick = function onCommentInputClick(_) {
35
+ // The TextField wraps the <input> tag with two divs
36
+ var commentInput = commentInputRef.current.children[0].children[0];
37
+ if (commentInput) return commentInput.focus();
38
+ };
39
+
40
+ return React.createElement(ThemeProvider, {
41
+ theme: theme
42
+ }, React.createElement(Paper, {
43
+ onClick: function onClick() {
44
+ return !editing ? onOpen(region) : null;
45
+ },
46
+ className: classnames(classes.regionInfo, {
47
+ highlighted: region.highlighted
48
+ })
49
+ }, !editing ? React.createElement("div", null, region.cls && React.createElement("div", {
50
+ className: "name"
51
+ }, React.createElement("div", {
52
+ className: "circle",
53
+ style: {
54
+ backgroundColor: region.color
55
+ }
56
+ }), region.cls), region.tags && React.createElement("div", {
57
+ className: "tags"
58
+ }, region.tags.map(function (t) {
59
+ return React.createElement("div", {
60
+ key: t,
61
+ className: "tag"
62
+ }, t);
63
+ }))) : React.createElement("div", {
64
+ style: {
65
+ width: 200
66
+ }
67
+ }, React.createElement("div", {
68
+ style: {
69
+ display: "flex",
70
+ flexDirection: "row"
71
+ }
72
+ }, React.createElement("div", {
73
+ style: {
74
+ display: "flex",
75
+ backgroundColor: region.color || "#888",
76
+ color: "#fff",
77
+ padding: 4,
78
+ paddingLeft: 8,
79
+ paddingRight: 8,
80
+ borderRadius: 4,
81
+ fontWeight: "bold",
82
+ textShadow: "0px 0px 5px rgba(0,0,0,0.4)"
83
+ }
84
+ }, region.type), React.createElement("div", {
85
+ style: {
86
+ flexGrow: 1
87
+ }
88
+ }), React.createElement(IconButton, {
89
+ onClick: function onClick() {
90
+ return onDelete(region);
91
+ },
92
+ tabIndex: -1,
93
+ style: {
94
+ width: 22,
95
+ height: 22
96
+ },
97
+ size: "small",
98
+ variant: "outlined"
99
+ }, React.createElement(TrashIcon, {
100
+ style: {
101
+ marginTop: -8,
102
+ width: 16,
103
+ height: 16
104
+ }
105
+ }))), (allowedClasses || []).length > 0 && React.createElement("div", {
106
+ style: {
107
+ marginTop: 6
108
+ }
109
+ }, React.createElement(CreatableSelect, {
110
+ placeholder: "Classification",
111
+ onChange: function onChange(o, actionMeta) {
112
+ if (actionMeta.action == "create-option") {
113
+ onRegionClassAdded(o.value);
114
+ }
115
+
116
+ return _onChange(_objectSpread({}, region, {
117
+ cls: o.value
118
+ }));
119
+ },
120
+ value: region.cls ? {
121
+ label: region.cls,
122
+ value: region.cls
123
+ } : null,
124
+ options: asMutable(allowedClasses.map(function (c) {
125
+ return {
126
+ value: c,
127
+ label: c
128
+ };
129
+ }))
130
+ })), (allowedTags || []).length > 0 && React.createElement("div", {
131
+ style: {
132
+ marginTop: 4
133
+ }
134
+ }, React.createElement(Select, {
135
+ onChange: function onChange(newTags) {
136
+ return _onChange(_objectSpread({}, region, {
137
+ tags: newTags.map(function (t) {
138
+ return t.value;
139
+ })
140
+ }));
141
+ },
142
+ placeholder: "Tags",
143
+ value: (region.tags || []).map(function (c) {
144
+ return {
145
+ label: c,
146
+ value: c
147
+ };
148
+ }),
149
+ isMulti: true,
150
+ options: asMutable(allowedTags.map(function (c) {
151
+ return {
152
+ value: c,
153
+ label: c
154
+ };
155
+ }))
156
+ })), allowComments && React.createElement(TextField, {
157
+ InputProps: {
158
+ className: classes.commentBox
159
+ },
160
+ fullWidth: true,
161
+ multiline: true,
162
+ rows: 3,
163
+ ref: commentInputRef,
164
+ onClick: onCommentInputClick,
165
+ value: region.comment || "",
166
+ onChange: function onChange(event) {
167
+ return _onChange(_objectSpread({}, region, {
168
+ comment: event.target.value
169
+ }));
170
+ }
171
+ }), onClose && React.createElement("div", {
172
+ style: {
173
+ marginTop: 4,
174
+ display: "flex"
175
+ }
176
+ }, React.createElement("div", {
177
+ style: {
178
+ flexGrow: 1
179
+ }
180
+ }), React.createElement(Button, {
181
+ onClick: function onClick() {
182
+ return onClose(region);
183
+ },
184
+ size: "small",
185
+ variant: "contained",
186
+ color: "primary"
187
+ }, React.createElement(CheckIcon, null))))));
188
+ };
189
+ export default memo(RegionLabel, function (prevProps, nextProps) {
190
+ return prevProps.editing === nextProps.editing && prevProps.region === nextProps.region;
191
+ });
@@ -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;
@@ -0,0 +1,248 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import React, { Fragment, useState, memo } from "react";
4
+ import SidebarBoxContainer from "../SidebarBoxContainer";
5
+ import { makeStyles } from "@mui/styles";
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
7
+ import { styled } from "@mui/material/styles";
8
+ import { grey } from "@mui/material/colors";
9
+ import RegionIcon from "@mui/icons-material/PictureInPicture";
10
+ import Grid from "@mui/material/Grid";
11
+ import ReorderIcon from "@mui/icons-material/SwapVert";
12
+ import PieChartIcon from "@mui/icons-material/PieChart";
13
+ import TrashIcon from "@mui/icons-material/Delete";
14
+ import LockIcon from "@mui/icons-material/Lock";
15
+ import UnlockIcon from "@mui/icons-material/LockOpen";
16
+ import VisibleIcon from "@mui/icons-material/Visibility";
17
+ import VisibleOffIcon from "@mui/icons-material/VisibilityOff";
18
+ import styles from "./styles";
19
+ import classnames from "classnames";
20
+ import isEqual from "lodash/isEqual";
21
+ var theme = createTheme();
22
+ var useStyles = makeStyles(function (theme) {
23
+ return styles;
24
+ });
25
+ var HeaderSep = styled("div")(function (_ref) {
26
+ var theme = _ref.theme;
27
+ return {
28
+ borderTop: "1px solid ".concat(grey[200]),
29
+ marginTop: 2,
30
+ marginBottom: 2
31
+ };
32
+ });
33
+
34
+ var Chip = function Chip(_ref2) {
35
+ var color = _ref2.color,
36
+ text = _ref2.text;
37
+ var classes = useStyles();
38
+ return React.createElement("span", {
39
+ className: classes.chip
40
+ }, React.createElement("div", {
41
+ className: "color",
42
+ style: {
43
+ backgroundColor: color
44
+ }
45
+ }), React.createElement("div", {
46
+ className: "text"
47
+ }, text));
48
+ };
49
+
50
+ var RowLayout = function RowLayout(_ref3) {
51
+ var header = _ref3.header,
52
+ highlighted = _ref3.highlighted,
53
+ order = _ref3.order,
54
+ classification = _ref3.classification,
55
+ area = _ref3.area,
56
+ tags = _ref3.tags,
57
+ trash = _ref3.trash,
58
+ lock = _ref3.lock,
59
+ visible = _ref3.visible,
60
+ onClick = _ref3.onClick;
61
+ var classes = useStyles();
62
+
63
+ var _useState = useState(false),
64
+ _useState2 = _slicedToArray(_useState, 2),
65
+ mouseOver = _useState2[0],
66
+ changeMouseOver = _useState2[1];
67
+
68
+ return React.createElement("div", {
69
+ onClick: onClick,
70
+ onMouseEnter: function onMouseEnter() {
71
+ return changeMouseOver(true);
72
+ },
73
+ onMouseLeave: function onMouseLeave() {
74
+ return changeMouseOver(false);
75
+ },
76
+ className: classnames(classes.row, {
77
+ header: header,
78
+ highlighted: highlighted
79
+ })
80
+ }, React.createElement(Grid, {
81
+ container: true,
82
+ alignItems: "center"
83
+ }, React.createElement(Grid, {
84
+ item: true,
85
+ xs: 2
86
+ }, React.createElement("div", {
87
+ style: {
88
+ textAlign: "right",
89
+ paddingRight: 10
90
+ }
91
+ }, order)), React.createElement(Grid, {
92
+ item: true,
93
+ xs: 5
94
+ }, classification), React.createElement(Grid, {
95
+ item: true,
96
+ xs: 2
97
+ }, React.createElement("div", {
98
+ style: {
99
+ textAlign: "right",
100
+ paddingRight: 6
101
+ }
102
+ }, area)), React.createElement(Grid, {
103
+ item: true,
104
+ xs: 1
105
+ }, trash), React.createElement(Grid, {
106
+ item: true,
107
+ xs: 1
108
+ }, lock), React.createElement(Grid, {
109
+ item: true,
110
+ xs: 1
111
+ }, visible)));
112
+ };
113
+
114
+ var RowHeader = function RowHeader() {
115
+ return React.createElement(RowLayout, {
116
+ header: true,
117
+ highlighted: false,
118
+ order: React.createElement(ReorderIcon, {
119
+ className: "icon"
120
+ }),
121
+ classification: React.createElement("div", {
122
+ style: {
123
+ paddingLeft: 10
124
+ }
125
+ }, "Class"),
126
+ area: React.createElement(PieChartIcon, {
127
+ className: "icon"
128
+ }),
129
+ trash: React.createElement(TrashIcon, {
130
+ className: "icon"
131
+ }),
132
+ lock: React.createElement(LockIcon, {
133
+ className: "icon"
134
+ }),
135
+ visible: React.createElement(VisibleIcon, {
136
+ className: "icon"
137
+ })
138
+ });
139
+ };
140
+
141
+ var MemoRowHeader = memo(RowHeader);
142
+
143
+ var Row = function Row(_ref4) {
144
+ var r = _ref4.region,
145
+ highlighted = _ref4.highlighted,
146
+ onSelectRegion = _ref4.onSelectRegion,
147
+ onDeleteRegion = _ref4.onDeleteRegion,
148
+ onChangeRegion = _ref4.onChangeRegion,
149
+ visible = _ref4.visible,
150
+ locked = _ref4.locked,
151
+ color = _ref4.color,
152
+ cls = _ref4.cls,
153
+ index = _ref4.index;
154
+ return React.createElement(RowLayout, {
155
+ header: false,
156
+ highlighted: highlighted,
157
+ onClick: function onClick() {
158
+ return onSelectRegion(r);
159
+ },
160
+ order: "#".concat(index + 1),
161
+ classification: React.createElement(Chip, {
162
+ text: cls || "",
163
+ color: color || "#ddd"
164
+ }),
165
+ area: "",
166
+ trash: React.createElement(TrashIcon, {
167
+ onClick: function onClick() {
168
+ return onDeleteRegion(r);
169
+ },
170
+ className: "icon2"
171
+ }),
172
+ lock: r.locked ? React.createElement(LockIcon, {
173
+ onClick: function onClick() {
174
+ return onChangeRegion(_objectSpread({}, r, {
175
+ locked: false
176
+ }));
177
+ },
178
+ className: "icon2"
179
+ }) : React.createElement(UnlockIcon, {
180
+ onClick: function onClick() {
181
+ return onChangeRegion(_objectSpread({}, r, {
182
+ locked: true
183
+ }));
184
+ },
185
+ className: "icon2"
186
+ }),
187
+ visible: r.visible || r.visible === undefined ? React.createElement(VisibleIcon, {
188
+ onClick: function onClick() {
189
+ return onChangeRegion(_objectSpread({}, r, {
190
+ visible: false
191
+ }));
192
+ },
193
+ className: "icon2"
194
+ }) : React.createElement(VisibleOffIcon, {
195
+ onClick: function onClick() {
196
+ return onChangeRegion(_objectSpread({}, r, {
197
+ visible: true
198
+ }));
199
+ },
200
+ className: "icon2"
201
+ })
202
+ });
203
+ };
204
+
205
+ var MemoRow = memo(Row, function (prevProps, nextProps) {
206
+ return prevProps.highlighted === nextProps.highlighted && prevProps.visible === nextProps.visible && prevProps.locked === nextProps.locked && prevProps.id === nextProps.id && prevProps.index === nextProps.index && prevProps.cls === nextProps.cls && prevProps.color === nextProps.color;
207
+ });
208
+ var emptyArr = [];
209
+ export var RegionSelectorSidebarBox = function RegionSelectorSidebarBox(_ref5) {
210
+ var _ref5$regions = _ref5.regions,
211
+ regions = _ref5$regions === void 0 ? emptyArr : _ref5$regions,
212
+ onDeleteRegion = _ref5.onDeleteRegion,
213
+ onChangeRegion = _ref5.onChangeRegion,
214
+ onSelectRegion = _ref5.onSelectRegion;
215
+ var classes = useStyles();
216
+ return React.createElement(ThemeProvider, {
217
+ theme: theme
218
+ }, React.createElement(SidebarBoxContainer, {
219
+ title: "Regions",
220
+ subTitle: "",
221
+ icon: React.createElement(RegionIcon, {
222
+ style: {
223
+ color: grey[700]
224
+ }
225
+ }),
226
+ expandedByDefault: true
227
+ }, React.createElement("div", {
228
+ className: classes.container
229
+ }, React.createElement(MemoRowHeader, null), React.createElement(HeaderSep, null), regions.map(function (r, i) {
230
+ return React.createElement(MemoRow, Object.assign({
231
+ key: r.id
232
+ }, r, {
233
+ region: r,
234
+ index: i,
235
+ onSelectRegion: onSelectRegion,
236
+ onDeleteRegion: onDeleteRegion,
237
+ onChangeRegion: onChangeRegion
238
+ }));
239
+ }))));
240
+ };
241
+
242
+ var mapUsedRegionProperties = function mapUsedRegionProperties(r) {
243
+ return [r.id, r.color, r.locked, r.visible, r.highlighted];
244
+ };
245
+
246
+ export default memo(RegionSelectorSidebarBox, function (prevProps, nextProps) {
247
+ return isEqual((prevProps.regions || emptyArr).map(mapUsedRegionProperties), (nextProps.regions || emptyArr).map(mapUsedRegionProperties));
248
+ });