@searpent/react-image-annotate 2.0.77 → 2.0.79

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 (224) hide show
  1. package/Annotator/exampleImages.js +41 -0
  2. package/Annotator/examplePhotos.js +6980 -0
  3. package/Annotator/index.js +417 -0
  4. package/Annotator/reducers/combine-reducers.js +14 -0
  5. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  6. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  7. package/Annotator/reducers/general-reducer.js +1430 -0
  8. package/Annotator/reducers/get-active-image.js +27 -0
  9. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  10. package/Annotator/reducers/history-handler.js +38 -0
  11. package/Annotator/reducers/image-reducer.js +20 -0
  12. package/Annotator/reducers/video-reducer.js +88 -0
  13. package/ClassSelectionMenu/index.js +140 -0
  14. package/Crosshairs/index.js +53 -0
  15. package/DebugSidebarBox/index.js +20 -0
  16. package/DemoSite/Editor.js +194 -0
  17. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  18. package/DemoSite/index.js +40 -0
  19. package/Editor/annotation-plugin/annotation.js +702 -0
  20. package/Editor/index.js +93 -0
  21. package/Editor/readOnly.js +123 -0
  22. package/{src/Editor → Editor}/tools.js +2 -3
  23. package/Errorer/index.js +11 -0
  24. package/FullImageSegmentationAnnotator/index.js +7 -0
  25. package/GroupSelectorSidebarBox/index.js +63 -0
  26. package/GroupsEditorSidebarBox/index.js +138 -0
  27. package/HelpSidebarBox/index.js +58 -0
  28. package/HighlightBox/index.js +102 -0
  29. package/HistorySidebarBox/index.js +71 -0
  30. package/ImageCanvas/index.js +441 -0
  31. package/ImageCanvas/region-tools.js +165 -0
  32. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  33. package/ImageCanvas/use-mouse.js +180 -0
  34. package/ImageCanvas/use-project-box.js +27 -0
  35. package/ImageCanvas/use-wasd-mode.js +62 -0
  36. package/ImageMask/index.js +133 -0
  37. package/ImageMask/load-image.js +25 -0
  38. package/ImageSelectorSidebarBox/index.js +60 -0
  39. package/KeyframeTimeline/get-time-string.js +27 -0
  40. package/KeyframeTimeline/index.js +233 -0
  41. package/KeyframesSelectorSidebarBox/index.js +93 -0
  42. package/LandingPage/index.js +159 -0
  43. package/Locker/index.js +11 -0
  44. package/MainLayout/RightSidebarItemsWrapper.js +19 -0
  45. package/MainLayout/icon-dictionary.js +104 -0
  46. package/MainLayout/index.js +526 -0
  47. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  48. package/MainLayout/types.js +0 -0
  49. package/MainLayout/use-implied-video-regions.js +13 -0
  50. package/MetadataEditorSidebarBox/index.js +231 -0
  51. package/PageSelector/index.js +180 -0
  52. package/PointDistances/index.js +73 -0
  53. package/PreventScrollToParents/index.js +51 -0
  54. package/RegionLabel/index.js +232 -0
  55. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  56. package/RegionSelectAndTransformBoxes/index.js +169 -0
  57. package/RegionSelectorSidebarBox/index.js +254 -0
  58. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  59. package/RegionShapes/index.js +294 -0
  60. package/RegionTags/index.js +144 -0
  61. package/SettingsDialog/index.js +52 -0
  62. package/SettingsProvider/index.js +60 -0
  63. package/Shortcuts/ShortcutField.js +46 -0
  64. package/Shortcuts/index.js +133 -0
  65. package/ShortcutsManager/index.js +155 -0
  66. package/Sidebar/index.js +69 -0
  67. package/SidebarBoxContainer/index.js +93 -0
  68. package/SmallToolButton/index.js +42 -0
  69. package/TagsSidebarBox/index.js +105 -0
  70. package/TaskDescriptionSidebarBox/index.js +58 -0
  71. package/Theme/index.js +30 -0
  72. package/VideoOrImageCanvasBackground/index.js +151 -0
  73. package/colors.js +14 -0
  74. package/hooks/use-colors.js +127 -0
  75. package/hooks/use-event-callback.js +10 -0
  76. package/hooks/use-exclude-pattern.js +24 -0
  77. package/hooks/use-load-image.js +26 -0
  78. package/hooks/use-window-size.js +46 -0
  79. package/{src/hooks → hooks}/xpattern.js +1 -1
  80. package/index.js +3 -0
  81. package/lib.js +3 -0
  82. package/package.json +1 -1
  83. package/stories.js +5 -0
  84. package/utils/blocks-to-article.js +60 -0
  85. package/{src/utils → utils}/blocks-to-article.test.js +5 -8
  86. package/{src/utils → utils}/default-locked-until.js +2 -1
  87. package/{src/utils → utils}/filter-only-unique.js +1 -1
  88. package/utils/get-from-local-storage.js +7 -0
  89. package/utils/get-hotkey-help-text.js +9 -0
  90. package/utils/get-landmarks-with-transform.js +40 -0
  91. package/utils/photosToImages.js +85 -0
  92. package/utils/regions-groups.js +28 -0
  93. package/utils/regions-to-blocks.js +18 -0
  94. package/utils/saveable-actions-enum.js +3 -0
  95. package/utils/set-in-local-storage.js +3 -0
  96. package/utils/sleep.js +7 -0
  97. package/utils/uuid-to-hash.js +5 -0
  98. package/.babelrc +0 -6
  99. package/.env +0 -1
  100. package/.flowconfig +0 -2
  101. package/.github/workflows/release-on-master.yml +0 -32
  102. package/.github/workflows/test.yml +0 -16
  103. package/.prettierrc +0 -3
  104. package/.releaserc.js +0 -18
  105. package/.storybook/addons.js +0 -2
  106. package/.storybook/config.js +0 -16
  107. package/LICENSE +0 -21
  108. package/public/favicon.ico +0 -0
  109. package/public/index.html +0 -38
  110. package/src/Annotator/bike-pic.png +0 -0
  111. package/src/Annotator/bike-pic2.png +0 -0
  112. package/src/Annotator/dab-keyframes.story.json +0 -1
  113. package/src/Annotator/exampleImages.js +0 -48
  114. package/src/Annotator/examplePhotos.js +0 -7603
  115. package/src/Annotator/index.js +0 -380
  116. package/src/Annotator/index.story.js +0 -899
  117. package/src/Annotator/poses.story.js +0 -150
  118. package/src/Annotator/reducers/combine-reducers.js +0 -7
  119. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  120. package/src/Annotator/reducers/general-reducer.js +0 -1228
  121. package/src/Annotator/reducers/get-active-image.js +0 -21
  122. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  123. package/src/Annotator/reducers/history-handler.js +0 -60
  124. package/src/Annotator/reducers/image-reducer.js +0 -23
  125. package/src/Annotator/reducers/video-reducer.js +0 -85
  126. package/src/Annotator/video.story.js +0 -51
  127. package/src/ClassSelectionMenu/index.js +0 -112
  128. package/src/Crosshairs/index.js +0 -64
  129. package/src/DebugSidebarBox/index.js +0 -36
  130. package/src/DemoSite/Editor.js +0 -235
  131. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  132. package/src/DemoSite/index.js +0 -41
  133. package/src/DemoSite/index.story.js +0 -10
  134. package/src/DemoSite/simple-segmentation-example.json +0 -572
  135. package/src/Editor/annotation-plugin/annotation.js +0 -546
  136. package/src/Editor/index.js +0 -50
  137. package/src/Editor/readOnly.js +0 -31
  138. package/src/Errorer/index.js +0 -13
  139. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  140. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  141. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  142. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  143. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  144. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  145. package/src/GroupSelectorSidebarBox/index.js +0 -48
  146. package/src/GroupsEditorSidebarBox/index.js +0 -108
  147. package/src/HelpSidebarBox/index.js +0 -43
  148. package/src/HighlightBox/index.js +0 -143
  149. package/src/HistorySidebarBox/index.js +0 -78
  150. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  151. package/src/ImageCanvas/index.js +0 -515
  152. package/src/ImageCanvas/index.story.js +0 -314
  153. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  154. package/src/ImageCanvas/region-tools.js +0 -171
  155. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  156. package/src/ImageCanvas/use-mouse.js +0 -168
  157. package/src/ImageCanvas/use-project-box.js +0 -23
  158. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  159. package/src/ImageMask/index.js +0 -127
  160. package/src/ImageMask/load-image.js +0 -32
  161. package/src/ImageSelectorSidebarBox/index.js +0 -54
  162. package/src/KeyframeTimeline/get-time-string.js +0 -25
  163. package/src/KeyframeTimeline/index.js +0 -223
  164. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  165. package/src/LandingPage/content.md +0 -57
  166. package/src/LandingPage/github-markdown.css +0 -964
  167. package/src/LandingPage/index.js +0 -147
  168. package/src/Locker/index.js +0 -13
  169. package/src/MainLayout/RightSidebarItemsWrapper.js +0 -21
  170. package/src/MainLayout/icon-dictionary.js +0 -79
  171. package/src/MainLayout/index.js +0 -564
  172. package/src/MainLayout/index.story.js +0 -240
  173. package/src/MainLayout/types.js +0 -171
  174. package/src/MainLayout/use-implied-video-regions.js +0 -17
  175. package/src/MetadataEditorSidebarBox/index.js +0 -160
  176. package/src/PageSelector/index.js +0 -159
  177. package/src/PointDistances/index.js +0 -90
  178. package/src/PreventScrollToParents/index.js +0 -48
  179. package/src/PreventScrollToParents/index.story.js +0 -23
  180. package/src/RegionLabel/index.js +0 -236
  181. package/src/RegionSelectAndTransformBoxes/index.js +0 -236
  182. package/src/RegionSelectorSidebarBox/index.js +0 -220
  183. package/src/RegionShapes/index.js +0 -254
  184. package/src/RegionTags/index.js +0 -136
  185. package/src/SettingsDialog/index.js +0 -58
  186. package/src/SettingsProvider/index.js +0 -57
  187. package/src/Shortcuts/ShortcutField.js +0 -44
  188. package/src/Shortcuts/index.js +0 -129
  189. package/src/ShortcutsManager/index.js +0 -162
  190. package/src/Sidebar/index.js +0 -117
  191. package/src/SidebarBoxContainer/index.js +0 -93
  192. package/src/SmallToolButton/index.js +0 -57
  193. package/src/TagsSidebarBox/index.js +0 -93
  194. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  195. package/src/Theme/index.js +0 -36
  196. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  197. package/src/colors.js +0 -32
  198. package/src/hooks/use-colors.js +0 -95
  199. package/src/hooks/use-event-callback.js +0 -11
  200. package/src/hooks/use-exclude-pattern.js +0 -27
  201. package/src/hooks/use-load-image.js +0 -21
  202. package/src/hooks/use-window-size.js +0 -46
  203. package/src/hooks/xpattern.png +0 -0
  204. package/src/index.js +0 -18
  205. package/src/lib.js +0 -7
  206. package/src/screenshot.png +0 -0
  207. package/src/site.css +0 -5
  208. package/src/stories.js +0 -2
  209. package/src/utils/blocks-to-article.js +0 -61
  210. package/src/utils/get-from-local-storage.js +0 -7
  211. package/src/utils/get-hotkey-help-text.js +0 -11
  212. package/src/utils/get-landmarks-with-transform.js +0 -23
  213. package/src/utils/photosToImages.js +0 -67
  214. package/src/utils/regions-groups.js +0 -19
  215. package/src/utils/regions-to-blocks.js +0 -16
  216. package/src/utils/saveable-actions-enum.js +0 -5
  217. package/src/utils/set-in-local-storage.js +0 -6
  218. package/src/utils/sleep.js +0 -3
  219. package/src/utils/uuid-to-hash.js +0 -5
  220. /package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  221. /package/{src/Errorer → Errorer}/errorer.css +0 -0
  222. /package/{src/Locker → Locker}/locker.css +0 -0
  223. /package/{src/PageSelector → PageSelector}/page-selector.css +0 -0
  224. /package/{src/utils → utils}/next-group-id.js +0 -0
@@ -0,0 +1,232 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
3
+ import React, { useRef, memo } from "react";
4
+ import Paper from "@mui/material/Paper";
5
+ import { makeStyles } from "@mui/styles";
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
7
+ import styles from "./styles";
8
+ import classnames from "classnames";
9
+ import IconButton from "@mui/material/IconButton";
10
+ import Button from "@mui/material/Button";
11
+ import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
12
+ import DeleteForeverIcon from '@mui/icons-material/DeleteForever';
13
+ import CheckIcon from "@mui/icons-material/Check";
14
+ import TextField from "@mui/material/TextField";
15
+ import Select from "react-select";
16
+ import CreatableSelect from "react-select/creatable";
17
+ import uuidToHash from '../utils/uuid-to-hash';
18
+ import { asMutable } from "seamless-immutable";
19
+ var theme = createTheme();
20
+ var useStyles = makeStyles(function (theme) {
21
+ return styles;
22
+ });
23
+ export var RegionLabel = function RegionLabel(_ref) {
24
+ var region = _ref.region,
25
+ editing = _ref.editing,
26
+ allowedClasses = _ref.allowedClasses,
27
+ allowedTags = _ref.allowedTags,
28
+ onDelete = _ref.onDelete,
29
+ _onChange = _ref.onChange,
30
+ onClose = _ref.onClose,
31
+ onOpen = _ref.onOpen,
32
+ onRegionClassAdded = _ref.onRegionClassAdded,
33
+ allowComments = _ref.allowComments,
34
+ hideNotEditingLabel = _ref.hideNotEditingLabel,
35
+ allowedGroups = _ref.allowedGroups,
36
+ onDeleteGroup = _ref.onDeleteGroup;
37
+ var classes = useStyles();
38
+ var commentInputRef = useRef(null);
39
+
40
+ var onCommentInputClick = function onCommentInputClick(_) {
41
+ // The TextField wraps the <input> tag with two divs
42
+ var commentInput = commentInputRef.current.children[0].children[0];
43
+ if (commentInput) return commentInput.focus();
44
+ };
45
+
46
+ if (hideNotEditingLabel && !editing) return null;
47
+ var allowedGroupsForSelect = allowedGroups ? allowedGroups.map(function (g) {
48
+ return {
49
+ value: "".concat(g.id),
50
+ label: g.label || uuidToHash(g.id)
51
+ };
52
+ }) : [];
53
+ return React.createElement(ThemeProvider, {
54
+ theme: theme
55
+ }, React.createElement(Paper, {
56
+ onClick: function onClick() {
57
+ return !editing ? onOpen(region) : null;
58
+ },
59
+ className: classnames(classes.regionInfo, {
60
+ highlighted: region.highlighted
61
+ })
62
+ }, !editing ? React.createElement("div", null, region.cls && React.createElement("div", {
63
+ className: "name"
64
+ }, React.createElement("div", {
65
+ className: "circle",
66
+ style: {
67
+ backgroundColor: region.color
68
+ }
69
+ }), region.cls), region.tags && React.createElement("div", {
70
+ className: "tags"
71
+ }, region.tags.map(function (t) {
72
+ return React.createElement("div", {
73
+ key: t,
74
+ className: "tag"
75
+ }, t);
76
+ }))) : React.createElement("div", {
77
+ style: {
78
+ width: 200
79
+ }
80
+ }, React.createElement("div", {
81
+ style: {
82
+ display: "flex",
83
+ flexDirection: "row"
84
+ }
85
+ }, React.createElement("div", {
86
+ style: {
87
+ display: "flex",
88
+ backgroundColor: region.color || "#888",
89
+ color: "#fff",
90
+ padding: 4,
91
+ paddingLeft: 8,
92
+ paddingRight: 8,
93
+ borderRadius: 4,
94
+ fontWeight: "bold",
95
+ textShadow: "0px 0px 5px rgba(0,0,0,0.4)"
96
+ }
97
+ }, region.type), React.createElement("div", {
98
+ style: {
99
+ flexGrow: 1
100
+ }
101
+ }), React.createElement(IconButton, {
102
+ onClick: function onClick() {
103
+ return onDelete(region);
104
+ },
105
+ tabIndex: -1,
106
+ style: {
107
+ width: 22,
108
+ height: 22
109
+ },
110
+ size: "small",
111
+ variant: "outlined"
112
+ }, React.createElement(DeleteOutlineIcon, {
113
+ style: {
114
+ marginTop: -8,
115
+ width: 16,
116
+ height: 16
117
+ }
118
+ })), React.createElement(IconButton, {
119
+ onClick: function onClick() {
120
+ return onDeleteGroup(region.groupId);
121
+ },
122
+ tabIndex: -1,
123
+ style: {
124
+ width: 22,
125
+ height: 22
126
+ },
127
+ size: "small",
128
+ variant: "outlined"
129
+ }, React.createElement(DeleteForeverIcon, {
130
+ style: {
131
+ marginTop: -8,
132
+ width: 16,
133
+ height: 16
134
+ }
135
+ }))), (allowedClasses || []).length > 0 && React.createElement("div", {
136
+ style: {
137
+ marginTop: 6
138
+ }
139
+ }, React.createElement(CreatableSelect, {
140
+ placeholder: "Classification",
141
+ onChange: function onChange(o, actionMeta) {
142
+ if (actionMeta.action == "create-option") {
143
+ onRegionClassAdded(o.value);
144
+ }
145
+
146
+ return _onChange(_objectSpread({}, region, {
147
+ cls: o.value
148
+ }));
149
+ },
150
+ value: region.cls ? {
151
+ label: region.cls,
152
+ value: region.cls
153
+ } : null,
154
+ options: asMutable(allowedClasses.map(function (c) {
155
+ return {
156
+ value: c,
157
+ label: c
158
+ };
159
+ }))
160
+ })), (allowedGroups || []).length > 0 && React.createElement(Select, {
161
+ onChange: function onChange(newGroup) {
162
+ return _onChange(_objectSpread({}, region, {
163
+ groupId: newGroup.value
164
+ }));
165
+ },
166
+ placeholder: "Group",
167
+ value: allowedGroupsForSelect.find(function (g) {
168
+ return g.value === region.groupId;
169
+ }),
170
+ options: _toConsumableArray(allowedGroupsForSelect)
171
+ }), (allowedTags || []).length > 0 && React.createElement("div", {
172
+ style: {
173
+ marginTop: 4
174
+ }
175
+ }, React.createElement(Select, {
176
+ onChange: function onChange(newTags) {
177
+ return _onChange(_objectSpread({}, region, {
178
+ tags: newTags.map(function (t) {
179
+ return t.value;
180
+ })
181
+ }));
182
+ },
183
+ placeholder: "Tags",
184
+ value: (region.tags || []).map(function (c) {
185
+ return {
186
+ label: c,
187
+ value: c
188
+ };
189
+ }),
190
+ isMulti: true,
191
+ options: asMutable(allowedTags.map(function (c) {
192
+ return {
193
+ value: c,
194
+ label: c
195
+ };
196
+ }))
197
+ })), allowComments && React.createElement(TextField, {
198
+ InputProps: {
199
+ className: classes.commentBox
200
+ },
201
+ fullWidth: true,
202
+ multiline: true,
203
+ rows: 3,
204
+ ref: commentInputRef,
205
+ onClick: onCommentInputClick,
206
+ value: region.comment || "",
207
+ onChange: function onChange(event) {
208
+ return _onChange(_objectSpread({}, region, {
209
+ comment: event.target.value
210
+ }));
211
+ }
212
+ }), onClose && React.createElement("div", {
213
+ style: {
214
+ marginTop: 4,
215
+ display: "flex"
216
+ }
217
+ }, React.createElement("div", {
218
+ style: {
219
+ flexGrow: 1
220
+ }
221
+ }), React.createElement(Button, {
222
+ onClick: function onClick() {
223
+ return onClose(region);
224
+ },
225
+ size: "small",
226
+ variant: "contained",
227
+ color: "primary"
228
+ }, React.createElement(CheckIcon, null))))));
229
+ };
230
+ export default memo(RegionLabel, function (prevProps, nextProps) {
231
+ return prevProps.editing === nextProps.editing && prevProps.region === nextProps.region;
232
+ });
@@ -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,169 @@
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: 10,
15
+ backgroundColor: "#454545",
16
+ border: "2px solid black",
17
+ borderRadius: "50%",
18
+ position: "absolute"
19
+ };
20
+ });
21
+ var boxCursorMap = [["nw-resize", "n-resize", "ne-resize"], ["w-resize", "grab", "e-resize"], ["sw-resize", "s-resize", "se-resize"]];
22
+
23
+ var arePropsEqual = function arePropsEqual(prev, next) {
24
+ return prev.region === next.region && prev.dragWithPrimary === next.dragWithPrimary && prev.createWithPrimary === next.createWithPrimary && prev.zoomWithPrimary === next.zoomWithPrimary && prev.mat === next.mat;
25
+ };
26
+
27
+ export var RegionSelectAndTransformBox = memo(function (_ref2) {
28
+ var r = _ref2.region,
29
+ mouseEvents = _ref2.mouseEvents,
30
+ projectRegionBox = _ref2.projectRegionBox,
31
+ dragWithPrimary = _ref2.dragWithPrimary,
32
+ createWithPrimary = _ref2.createWithPrimary,
33
+ zoomWithPrimary = _ref2.zoomWithPrimary,
34
+ onBeginMovePoint = _ref2.onBeginMovePoint,
35
+ onSelectRegion = _ref2.onSelectRegion,
36
+ layoutParams = _ref2.layoutParams,
37
+ _ref2$fullImageSegmen = _ref2.fullImageSegmentationMode,
38
+ fullImageSegmentationMode = _ref2$fullImageSegmen === void 0 ? false : _ref2$fullImageSegmen,
39
+ mat = _ref2.mat,
40
+ onBeginBoxTransform = _ref2.onBeginBoxTransform,
41
+ onBeginMovePolygonPoint = _ref2.onBeginMovePolygonPoint,
42
+ onBeginMoveKeypoint = _ref2.onBeginMoveKeypoint,
43
+ onAddPolygonPoint = _ref2.onAddPolygonPoint,
44
+ showHighlightBox = _ref2.showHighlightBox;
45
+ var pbox = projectRegionBox(r);
46
+ var _layoutParams$current = layoutParams.current,
47
+ iw = _layoutParams$current.iw,
48
+ ih = _layoutParams$current.ih;
49
+ return React.createElement(ThemeProvider, {
50
+ theme: theme
51
+ }, React.createElement(Fragment, null, React.createElement(PreventScrollToParents, null, showHighlightBox && r.type !== "polygon" && React.createElement(HighlightBox, {
52
+ region: r,
53
+ mouseEvents: mouseEvents,
54
+ dragWithPrimary: dragWithPrimary,
55
+ createWithPrimary: createWithPrimary,
56
+ zoomWithPrimary: zoomWithPrimary,
57
+ onBeginMovePoint: onBeginMovePoint,
58
+ onSelectRegion: onSelectRegion,
59
+ pbox: pbox
60
+ }), 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) {
61
+ var _ref4 = _slicedToArray(_ref3, 2),
62
+ px = _ref4[0],
63
+ py = _ref4[1];
64
+
65
+ return React.createElement(TransformGrabber, Object.assign({
66
+ key: i
67
+ }, mouseEvents, {
68
+ onMouseDown: function onMouseDown(e) {
69
+ if (e.button === 0) return onBeginBoxTransform(r, [px * 2 - 1, py * 2 - 1]);
70
+ mouseEvents.onMouseDown(e);
71
+ },
72
+ style: {
73
+ left: pbox.x - 4 - 2 + pbox.w * px,
74
+ top: pbox.y - 4 - 2 + pbox.h * py,
75
+ cursor: boxCursorMap[py * 2][px * 2],
76
+ borderRadius: px === 0.5 && py === 0.5 ? 4 : undefined
77
+ }
78
+ }));
79
+ }), r.type === "polygon" && !dragWithPrimary && !zoomWithPrimary && !r.locked && r.highlighted && r.points.map(function (_ref5, i) {
80
+ var _ref6 = _slicedToArray(_ref5, 2),
81
+ px = _ref6[0],
82
+ py = _ref6[1];
83
+
84
+ var proj = mat.clone().inverse().applyToPoint(px * iw, py * ih);
85
+ return React.createElement(TransformGrabber, Object.assign({
86
+ key: i
87
+ }, mouseEvents, {
88
+ onMouseDown: function onMouseDown(e) {
89
+ if (e.button === 0 && (!r.open || i === 0)) return onBeginMovePolygonPoint(r, i);
90
+ mouseEvents.onMouseDown(e);
91
+ },
92
+ style: {
93
+ cursor: !r.open ? "move" : i === 0 ? "pointer" : undefined,
94
+ zIndex: 10,
95
+ pointerEvents: r.open && i === r.points.length - 1 ? "none" : undefined,
96
+ left: proj.x - 4,
97
+ top: proj.y - 4
98
+ }
99
+ }));
100
+ }), r.type === "polygon" && r.highlighted && !dragWithPrimary && !zoomWithPrimary && !r.locked && !r.open && r.points.length > 1 && r.points.map(function (p1, i) {
101
+ return [p1, r.points[(i + 1) % r.points.length]];
102
+ }).map(function (_ref7) {
103
+ var _ref8 = _slicedToArray(_ref7, 2),
104
+ p1 = _ref8[0],
105
+ p2 = _ref8[1];
106
+
107
+ return [(p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2];
108
+ }).map(function (pa, i) {
109
+ var proj = mat.clone().inverse().applyToPoint(pa[0] * iw, pa[1] * ih);
110
+ return React.createElement(TransformGrabber, Object.assign({
111
+ key: i
112
+ }, mouseEvents, {
113
+ onMouseDown: function onMouseDown(e) {
114
+ if (e.button === 0) return onAddPolygonPoint(r, pa, i + 1);
115
+ mouseEvents.onMouseDown(e);
116
+ },
117
+ style: {
118
+ cursor: "copy",
119
+ zIndex: 10,
120
+ left: proj.x - 4,
121
+ top: proj.y - 4,
122
+ border: "2px dotted #fff",
123
+ opacity: 0.5
124
+ }
125
+ }));
126
+ }), r.type === "keypoints" && !dragWithPrimary && !zoomWithPrimary && !r.locked && r.highlighted && Object.entries(r.points).map(function (_ref9, i) {
127
+ var _ref10 = _slicedToArray(_ref9, 2),
128
+ keypointId = _ref10[0],
129
+ _ref10$ = _ref10[1],
130
+ px = _ref10$.x,
131
+ py = _ref10$.y;
132
+
133
+ var proj = mat.clone().inverse().applyToPoint(px * iw, py * ih);
134
+ return React.createElement(Tooltip, {
135
+ title: keypointId,
136
+ key: i
137
+ }, React.createElement(TransformGrabber, Object.assign({
138
+ key: i
139
+ }, mouseEvents, {
140
+ onMouseDown: function onMouseDown(e) {
141
+ if (e.button === 0 && (!r.open || i === 0)) return onBeginMoveKeypoint(r, keypointId);
142
+ mouseEvents.onMouseDown(e);
143
+ },
144
+ style: {
145
+ cursor: !r.open ? "move" : i === 0 ? "pointer" : undefined,
146
+ zIndex: 10,
147
+ pointerEvents: r.open && i === r.points.length - 1 ? "none" : undefined,
148
+ left: proj.x - 4,
149
+ top: proj.y - 4
150
+ }
151
+ })));
152
+ }))));
153
+ }, arePropsEqual);
154
+ export var RegionSelectAndTransformBoxes = memo(function (props) {
155
+ return props.regions.filter(function (r) {
156
+ return r.visible || r.visible === undefined;
157
+ }).filter(function (r) {
158
+ return !r.locked;
159
+ }).map(function (r, i) {
160
+ return React.createElement(RegionSelectAndTransformBox, Object.assign({
161
+ key: r.id
162
+ }, props, {
163
+ region: r
164
+ }));
165
+ });
166
+ }, function (n, p) {
167
+ return n.regions === p.regions && n.mat === p.mat;
168
+ });
169
+ export default RegionSelectAndTransformBoxes;
@@ -0,0 +1,254 @@
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
+ import useColors from "../hooks/use-colors";
22
+ var theme = createTheme();
23
+ var useStyles = makeStyles(function (theme) {
24
+ return styles;
25
+ });
26
+ var HeaderSep = styled("div")(function (_ref) {
27
+ var theme = _ref.theme;
28
+ return {
29
+ borderTop: "1px solid ".concat(grey[200]),
30
+ marginTop: 2,
31
+ marginBottom: 2
32
+ };
33
+ });
34
+
35
+ var Chip = function Chip(_ref2) {
36
+ var color = _ref2.color,
37
+ text = _ref2.text;
38
+ var classes = useStyles();
39
+ return React.createElement("span", {
40
+ className: classes.chip
41
+ }, React.createElement("div", {
42
+ className: "color",
43
+ style: {
44
+ backgroundColor: color
45
+ }
46
+ }), React.createElement("div", {
47
+ className: "text"
48
+ }, text));
49
+ };
50
+
51
+ var RowLayout = function RowLayout(_ref3) {
52
+ var header = _ref3.header,
53
+ highlighted = _ref3.highlighted,
54
+ order = _ref3.order,
55
+ classification = _ref3.classification,
56
+ area = _ref3.area,
57
+ tags = _ref3.tags,
58
+ trash = _ref3.trash,
59
+ lock = _ref3.lock,
60
+ visible = _ref3.visible,
61
+ onClick = _ref3.onClick;
62
+ var classes = useStyles();
63
+
64
+ var _useState = useState(false),
65
+ _useState2 = _slicedToArray(_useState, 2),
66
+ mouseOver = _useState2[0],
67
+ changeMouseOver = _useState2[1];
68
+
69
+ return React.createElement("div", {
70
+ onClick: onClick,
71
+ onMouseEnter: function onMouseEnter() {
72
+ return changeMouseOver(true);
73
+ },
74
+ onMouseLeave: function onMouseLeave() {
75
+ return changeMouseOver(false);
76
+ },
77
+ className: classnames(classes.row, {
78
+ header: header,
79
+ highlighted: highlighted
80
+ })
81
+ }, React.createElement(Grid, {
82
+ container: true,
83
+ alignItems: "center"
84
+ }, React.createElement(Grid, {
85
+ item: true,
86
+ xs: 2
87
+ }, React.createElement("div", {
88
+ style: {
89
+ textAlign: "right",
90
+ paddingRight: 10
91
+ }
92
+ }, order)), React.createElement(Grid, {
93
+ item: true,
94
+ xs: 5
95
+ }, classification), React.createElement(Grid, {
96
+ item: true,
97
+ xs: 2
98
+ }, React.createElement("div", {
99
+ style: {
100
+ textAlign: "right",
101
+ paddingRight: 6
102
+ }
103
+ }, area)), React.createElement(Grid, {
104
+ item: true,
105
+ xs: 1
106
+ }, trash), React.createElement(Grid, {
107
+ item: true,
108
+ xs: 1
109
+ }, lock), React.createElement(Grid, {
110
+ item: true,
111
+ xs: 1
112
+ }, visible)));
113
+ };
114
+
115
+ var RowHeader = function RowHeader() {
116
+ return React.createElement(RowLayout, {
117
+ header: true,
118
+ highlighted: false,
119
+ order: React.createElement(ReorderIcon, {
120
+ className: "icon"
121
+ }),
122
+ classification: React.createElement("div", {
123
+ style: {
124
+ paddingLeft: 10
125
+ }
126
+ }, "Class"),
127
+ area: React.createElement(PieChartIcon, {
128
+ className: "icon"
129
+ }),
130
+ trash: React.createElement(TrashIcon, {
131
+ className: "icon"
132
+ }),
133
+ lock: React.createElement(LockIcon, {
134
+ className: "icon"
135
+ }),
136
+ visible: React.createElement(VisibleIcon, {
137
+ className: "icon"
138
+ })
139
+ });
140
+ };
141
+
142
+ var MemoRowHeader = memo(RowHeader);
143
+
144
+ var Row = function Row(_ref4) {
145
+ var r = _ref4.region,
146
+ highlighted = _ref4.highlighted,
147
+ onSelectRegion = _ref4.onSelectRegion,
148
+ onDeleteRegion = _ref4.onDeleteRegion,
149
+ onChangeRegion = _ref4.onChangeRegion,
150
+ visible = _ref4.visible,
151
+ locked = _ref4.locked,
152
+ color = _ref4.color,
153
+ cls = _ref4.cls,
154
+ index = _ref4.index;
155
+
156
+ var _useColors = useColors(),
157
+ groupColor = _useColors.groupColor;
158
+
159
+ var gc = groupColor(r.groupId);
160
+ return React.createElement(RowLayout, {
161
+ header: false,
162
+ highlighted: highlighted,
163
+ onClick: function onClick() {
164
+ return onSelectRegion(r);
165
+ },
166
+ order: "#".concat(index + 1),
167
+ classification: React.createElement(Chip, {
168
+ text: cls || "",
169
+ color: color || gc || "lime"
170
+ }),
171
+ area: "",
172
+ trash: React.createElement(TrashIcon, {
173
+ onClick: function onClick() {
174
+ return onDeleteRegion(r);
175
+ },
176
+ className: "icon2"
177
+ }),
178
+ lock: r.locked ? React.createElement(LockIcon, {
179
+ onClick: function onClick() {
180
+ return onChangeRegion(_objectSpread({}, r, {
181
+ locked: false
182
+ }));
183
+ },
184
+ className: "icon2"
185
+ }) : React.createElement(UnlockIcon, {
186
+ onClick: function onClick() {
187
+ return onChangeRegion(_objectSpread({}, r, {
188
+ locked: true
189
+ }));
190
+ },
191
+ className: "icon2"
192
+ }),
193
+ visible: r.visible || r.visible === undefined ? React.createElement(VisibleIcon, {
194
+ onClick: function onClick() {
195
+ return onChangeRegion(_objectSpread({}, r, {
196
+ visible: false
197
+ }));
198
+ },
199
+ className: "icon2"
200
+ }) : React.createElement(VisibleOffIcon, {
201
+ onClick: function onClick() {
202
+ return onChangeRegion(_objectSpread({}, r, {
203
+ visible: true
204
+ }));
205
+ },
206
+ className: "icon2"
207
+ })
208
+ });
209
+ };
210
+
211
+ var MemoRow = memo(Row, function (prevProps, nextProps) {
212
+ 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;
213
+ });
214
+ var emptyArr = [];
215
+ export var RegionSelectorSidebarBox = function RegionSelectorSidebarBox(_ref5) {
216
+ var _ref5$regions = _ref5.regions,
217
+ regions = _ref5$regions === void 0 ? emptyArr : _ref5$regions,
218
+ onDeleteRegion = _ref5.onDeleteRegion,
219
+ onChangeRegion = _ref5.onChangeRegion,
220
+ onSelectRegion = _ref5.onSelectRegion;
221
+ var classes = useStyles();
222
+ return React.createElement(ThemeProvider, {
223
+ theme: theme
224
+ }, React.createElement(SidebarBoxContainer, {
225
+ title: "Regions",
226
+ subTitle: "",
227
+ icon: React.createElement(RegionIcon, {
228
+ style: {
229
+ color: grey[700]
230
+ }
231
+ }),
232
+ expandedByDefault: true
233
+ }, React.createElement("div", {
234
+ className: classes.container
235
+ }, React.createElement(MemoRowHeader, null), React.createElement(HeaderSep, null), regions.map(function (r, i) {
236
+ return React.createElement(MemoRow, Object.assign({
237
+ key: r.id
238
+ }, r, {
239
+ region: r,
240
+ index: i,
241
+ onSelectRegion: onSelectRegion,
242
+ onDeleteRegion: onDeleteRegion,
243
+ onChangeRegion: onChangeRegion
244
+ }));
245
+ }))));
246
+ };
247
+
248
+ var mapUsedRegionProperties = function mapUsedRegionProperties(r) {
249
+ return [r.id, r.color, r.locked, r.visible, r.highlighted];
250
+ };
251
+
252
+ export default memo(RegionSelectorSidebarBox, function (prevProps, nextProps) {
253
+ return isEqual((prevProps.regions || emptyArr).map(mapUsedRegionProperties), (nextProps.regions || emptyArr).map(mapUsedRegionProperties));
254
+ });