@searpent/react-image-annotate 2.0.3 → 2.0.4

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 (187) hide show
  1. package/.babelrc +6 -0
  2. package/.env +1 -0
  3. package/.flowconfig +2 -0
  4. package/.github/workflows/release-on-master.yml +32 -0
  5. package/.github/workflows/test.yml +16 -0
  6. package/.prettierrc +3 -0
  7. package/.releaserc.js +18 -0
  8. package/.storybook/addons.js +2 -0
  9. package/.storybook/config.js +16 -0
  10. package/LICENSE +21 -0
  11. package/package.json +4 -1
  12. package/public/favicon.ico +0 -0
  13. package/public/index.html +38 -0
  14. package/src/Annotator/bike-pic.png +0 -0
  15. package/src/Annotator/bike-pic2.png +0 -0
  16. package/src/Annotator/dab-keyframes.story.json +1 -0
  17. package/src/Annotator/examplePhotos.js +7601 -0
  18. package/src/Annotator/index.js +291 -0
  19. package/src/Annotator/index.story.js +807 -0
  20. package/src/Annotator/poses.story.js +150 -0
  21. package/src/Annotator/reducers/combine-reducers.js +7 -0
  22. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +53 -0
  23. package/{Annotator → src/Annotator}/reducers/fix-twisted.js +5 -3
  24. package/src/Annotator/reducers/general-reducer.js +996 -0
  25. package/src/Annotator/reducers/get-active-image.js +21 -0
  26. package/src/Annotator/reducers/get-implied-video-regions.js +115 -0
  27. package/src/Annotator/reducers/history-handler.js +60 -0
  28. package/src/Annotator/reducers/image-reducer.js +23 -0
  29. package/src/Annotator/reducers/video-reducer.js +85 -0
  30. package/src/Annotator/video.story.js +51 -0
  31. package/src/ClassSelectionMenu/index.js +108 -0
  32. package/src/Crosshairs/index.js +64 -0
  33. package/src/DebugSidebarBox/index.js +36 -0
  34. package/src/DemoSite/Editor.js +235 -0
  35. package/src/DemoSite/ErrorBoundaryDialog.js +34 -0
  36. package/src/DemoSite/index.js +41 -0
  37. package/src/DemoSite/index.story.js +10 -0
  38. package/src/DemoSite/simple-segmentation-example.json +572 -0
  39. package/src/Editor/annotation-plugin/annotation.css +46 -0
  40. package/src/Editor/annotation-plugin/annotation.js +515 -0
  41. package/src/Editor/index.js +24 -0
  42. package/src/Editor/tools.js +6 -0
  43. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  44. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  45. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  46. package/src/FullImageSegmentationAnnotator/index.js +7 -0
  47. package/src/FullImageSegmentationAnnotator/index.story.js +177 -0
  48. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  49. package/src/GroupSelectorSidebarBox/index.js +48 -0
  50. package/src/HighlightBox/index.js +143 -0
  51. package/src/HistorySidebarBox/index.js +78 -0
  52. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  53. package/src/ImageCanvas/index.js +494 -0
  54. package/src/ImageCanvas/index.story.js +314 -0
  55. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  56. package/src/ImageCanvas/region-tools.js +171 -0
  57. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  58. package/{ImageCanvas → src/ImageCanvas}/styles.js +8 -12
  59. package/src/ImageCanvas/use-mouse.js +168 -0
  60. package/src/ImageCanvas/use-project-box.js +23 -0
  61. package/src/ImageCanvas/use-wasd-mode.js +50 -0
  62. package/src/ImageMask/index.js +127 -0
  63. package/src/ImageMask/load-image.js +32 -0
  64. package/src/ImageSelectorSidebarBox/index.js +54 -0
  65. package/src/KeyframeTimeline/get-time-string.js +25 -0
  66. package/src/KeyframeTimeline/index.js +223 -0
  67. package/src/KeyframesSelectorSidebarBox/index.js +93 -0
  68. package/src/LandingPage/content.md +57 -0
  69. package/src/LandingPage/github-markdown.css +964 -0
  70. package/src/LandingPage/index.js +147 -0
  71. package/src/MainLayout/icon-dictionary.js +79 -0
  72. package/src/MainLayout/index.js +510 -0
  73. package/src/MainLayout/index.story.js +240 -0
  74. package/{MainLayout → src/MainLayout}/styles.js +7 -6
  75. package/src/MainLayout/types.js +164 -0
  76. package/src/MainLayout/use-implied-video-regions.js +17 -0
  77. package/src/MetadataEditorSidebarBox/index.js +98 -0
  78. package/src/PageSelector/index.js +76 -0
  79. package/src/PageSelector/page-selector.css +69 -0
  80. package/src/PointDistances/index.js +90 -0
  81. package/src/PreventScrollToParents/index.js +48 -0
  82. package/src/PreventScrollToParents/index.story.js +23 -0
  83. package/src/RegionLabel/index.js +222 -0
  84. package/{RegionLabel → src/RegionLabel}/styles.js +15 -12
  85. package/src/RegionSelectAndTransformBoxes/index.js +234 -0
  86. package/src/RegionSelectorSidebarBox/index.js +216 -0
  87. package/{RegionSelectorSidebarBox → src/RegionSelectorSidebarBox}/styles.js +14 -13
  88. package/src/RegionShapes/index.js +254 -0
  89. package/src/RegionTags/index.js +134 -0
  90. package/src/SettingsDialog/index.js +58 -0
  91. package/src/SettingsProvider/index.js +48 -0
  92. package/src/Shortcuts/ShortcutField.js +44 -0
  93. package/src/Shortcuts/index.js +129 -0
  94. package/src/ShortcutsManager/index.js +162 -0
  95. package/src/Sidebar/index.js +117 -0
  96. package/src/SidebarBoxContainer/index.js +93 -0
  97. package/src/SmallToolButton/index.js +57 -0
  98. package/src/TagsSidebarBox/index.js +93 -0
  99. package/src/TaskDescriptionSidebarBox/index.js +43 -0
  100. package/src/Theme/index.js +36 -0
  101. package/src/VideoOrImageCanvasBackground/index.js +170 -0
  102. package/src/colors.js +32 -0
  103. package/src/hooks/use-colors.js +74 -0
  104. package/src/hooks/use-event-callback.js +11 -0
  105. package/src/hooks/use-exclude-pattern.js +27 -0
  106. package/src/hooks/use-load-image.js +21 -0
  107. package/src/hooks/use-window-size.js +46 -0
  108. package/{hooks → src/hooks}/xpattern.js +1 -1
  109. package/src/hooks/xpattern.png +0 -0
  110. package/src/index.js +18 -0
  111. package/src/lib.js +7 -0
  112. package/src/screenshot.png +0 -0
  113. package/src/site.css +5 -0
  114. package/src/stories.js +2 -0
  115. package/src/utils/filter-only-unique.js +5 -0
  116. package/src/utils/get-from-local-storage.js +7 -0
  117. package/src/utils/get-hotkey-help-text.js +11 -0
  118. package/src/utils/get-landmarks-with-transform.js +23 -0
  119. package/src/utils/photosToImages.js +40 -0
  120. package/src/utils/regions-to-blocks.js +14 -0
  121. package/src/utils/set-in-local-storage.js +6 -0
  122. package/Annotator/index.js +0 -169
  123. package/Annotator/reducers/combine-reducers.js +0 -14
  124. package/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -73
  125. package/Annotator/reducers/general-reducer.js +0 -1058
  126. package/Annotator/reducers/get-active-image.js +0 -27
  127. package/Annotator/reducers/get-implied-video-regions.js +0 -180
  128. package/Annotator/reducers/history-handler.js +0 -38
  129. package/Annotator/reducers/image-reducer.js +0 -20
  130. package/Annotator/reducers/video-reducer.js +0 -88
  131. package/ClassSelectionMenu/index.js +0 -135
  132. package/Crosshairs/index.js +0 -53
  133. package/DebugSidebarBox/index.js +0 -20
  134. package/DemoSite/Editor.js +0 -194
  135. package/DemoSite/ErrorBoundaryDialog.js +0 -64
  136. package/DemoSite/index.js +0 -40
  137. package/FullImageSegmentationAnnotator/index.js +0 -7
  138. package/GroupSelectorSidebarBox/index.js +0 -63
  139. package/HighlightBox/index.js +0 -99
  140. package/HistorySidebarBox/index.js +0 -71
  141. package/ImageCanvas/index.js +0 -424
  142. package/ImageCanvas/region-tools.js +0 -165
  143. package/ImageCanvas/use-mouse.js +0 -180
  144. package/ImageCanvas/use-project-box.js +0 -27
  145. package/ImageCanvas/use-wasd-mode.js +0 -62
  146. package/ImageMask/index.js +0 -133
  147. package/ImageMask/load-image.js +0 -25
  148. package/ImageSelectorSidebarBox/index.js +0 -60
  149. package/KeyframeTimeline/get-time-string.js +0 -27
  150. package/KeyframeTimeline/index.js +0 -233
  151. package/KeyframesSelectorSidebarBox/index.js +0 -93
  152. package/LandingPage/index.js +0 -159
  153. package/MainLayout/icon-dictionary.js +0 -104
  154. package/MainLayout/index.js +0 -366
  155. package/MainLayout/types.js +0 -0
  156. package/MainLayout/use-implied-video-regions.js +0 -13
  157. package/PointDistances/index.js +0 -73
  158. package/PreventScrollToParents/index.js +0 -51
  159. package/RegionLabel/index.js +0 -191
  160. package/RegionSelectAndTransformBoxes/index.js +0 -167
  161. package/RegionSelectorSidebarBox/index.js +0 -248
  162. package/RegionShapes/index.js +0 -274
  163. package/RegionTags/index.js +0 -138
  164. package/SettingsDialog/index.js +0 -52
  165. package/SettingsProvider/index.js +0 -53
  166. package/Shortcuts/ShortcutField.js +0 -46
  167. package/Shortcuts/index.js +0 -133
  168. package/ShortcutsManager/index.js +0 -155
  169. package/Sidebar/index.js +0 -69
  170. package/SidebarBoxContainer/index.js +0 -93
  171. package/SmallToolButton/index.js +0 -42
  172. package/TagsSidebarBox/index.js +0 -105
  173. package/TaskDescriptionSidebarBox/index.js +0 -58
  174. package/Theme/index.js +0 -30
  175. package/VideoOrImageCanvasBackground/index.js +0 -151
  176. package/colors.js +0 -14
  177. package/hooks/use-event-callback.js +0 -10
  178. package/hooks/use-exclude-pattern.js +0 -24
  179. package/hooks/use-load-image.js +0 -26
  180. package/hooks/use-window-size.js +0 -46
  181. package/index.js +0 -3
  182. package/lib.js +0 -3
  183. package/stories.js +0 -5
  184. package/utils/get-from-local-storage.js +0 -7
  185. package/utils/get-hotkey-help-text.js +0 -9
  186. package/utils/get-landmarks-with-transform.js +0 -40
  187. package/utils/set-in-local-storage.js +0 -3
@@ -1,366 +0,0 @@
1
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
2
- import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- import { FullScreen, useFullScreenHandle } from "react-full-screen";
4
- import React, { useCallback, useRef } from "react";
5
- import { makeStyles } from "@mui/styles";
6
- import { createTheme, ThemeProvider } from "@mui/material/styles";
7
- import { styled } from "@mui/material/styles";
8
- import ClassSelectionMenu from "../ClassSelectionMenu";
9
- import DebugBox from "../DebugSidebarBox";
10
- import HistorySidebarBox from "../HistorySidebarBox";
11
- import ImageCanvas from "../ImageCanvas";
12
- import ImageSelector from "../ImageSelectorSidebarBox";
13
- import GroupSelector from "../GroupSelectorSidebarBox";
14
- import KeyframeTimeline from "../KeyframeTimeline";
15
- import KeyframesSelector from "../KeyframesSelectorSidebarBox";
16
- import RegionSelector from "../RegionSelectorSidebarBox";
17
- import SettingsDialog from "../SettingsDialog";
18
- import TagsSidebarBox from "../TagsSidebarBox";
19
- import TaskDescription from "../TaskDescriptionSidebarBox";
20
- import Workspace from "react-material-workspace-layout/Workspace";
21
- import classnames from "classnames";
22
- import getActiveImage from "../Annotator/reducers/get-active-image";
23
- import getHotkeyHelpText from "../utils/get-hotkey-help-text";
24
- import iconDictionary from "./icon-dictionary";
25
- import styles from "./styles";
26
- import { useDispatchHotkeyHandlers } from "../ShortcutsManager";
27
- import useEventCallback from "use-event-callback";
28
- import useImpliedVideoRegions from "./use-implied-video-regions";
29
- import useKey from "use-key-hook";
30
- import { useSettings } from "../SettingsProvider";
31
- import { withHotKeys } from "react-hotkeys"; // import Fullscreen from "../Fullscreen"
32
-
33
- var emptyArr = [];
34
- var theme = createTheme();
35
- var useStyles = makeStyles(function (theme) {
36
- return styles;
37
- });
38
- var HotkeyDiv = withHotKeys(function (_ref) {
39
- var hotKeys = _ref.hotKeys,
40
- children = _ref.children,
41
- divRef = _ref.divRef,
42
- props = _objectWithoutProperties(_ref, ["hotKeys", "children", "divRef"]);
43
-
44
- return React.createElement("div", Object.assign({}, _objectSpread({}, hotKeys, props), {
45
- ref: divRef
46
- }), children);
47
- });
48
- var FullScreenContainer = styled("div")(function (_ref2) {
49
- var theme = _ref2.theme;
50
- return {
51
- width: "100%",
52
- height: "100%",
53
- "& .fullscreen": {
54
- width: "100%",
55
- height: "100%"
56
- }
57
- };
58
- });
59
- export var MainLayout = function MainLayout(_ref3) {
60
- var state = _ref3.state,
61
- dispatch = _ref3.dispatch,
62
- _ref3$alwaysShowNextB = _ref3.alwaysShowNextButton,
63
- alwaysShowNextButton = _ref3$alwaysShowNextB === void 0 ? false : _ref3$alwaysShowNextB,
64
- _ref3$alwaysShowPrevB = _ref3.alwaysShowPrevButton,
65
- alwaysShowPrevButton = _ref3$alwaysShowPrevB === void 0 ? false : _ref3$alwaysShowPrevB,
66
- RegionEditLabel = _ref3.RegionEditLabel,
67
- onRegionClassAdded = _ref3.onRegionClassAdded,
68
- hideHeader = _ref3.hideHeader,
69
- hideHeaderText = _ref3.hideHeaderText,
70
- _ref3$hideNext = _ref3.hideNext,
71
- hideNext = _ref3$hideNext === void 0 ? false : _ref3$hideNext,
72
- _ref3$hidePrev = _ref3.hidePrev,
73
- hidePrev = _ref3$hidePrev === void 0 ? false : _ref3$hidePrev,
74
- _ref3$hideClone = _ref3.hideClone,
75
- hideClone = _ref3$hideClone === void 0 ? false : _ref3$hideClone,
76
- _ref3$hideSettings = _ref3.hideSettings,
77
- hideSettings = _ref3$hideSettings === void 0 ? false : _ref3$hideSettings,
78
- _ref3$hideFullScreen = _ref3.hideFullScreen,
79
- hideFullScreen = _ref3$hideFullScreen === void 0 ? false : _ref3$hideFullScreen,
80
- _ref3$hideSave = _ref3.hideSave,
81
- hideSave = _ref3$hideSave === void 0 ? false : _ref3$hideSave,
82
- _ref3$groups = _ref3.groups,
83
- groups = _ref3$groups === void 0 ? [] : _ref3$groups,
84
- _ref3$onGroupSelect = _ref3.onGroupSelect,
85
- onGroupSelect = _ref3$onGroupSelect === void 0 ? function () {} : _ref3$onGroupSelect,
86
- _ref3$selectedGroupId = _ref3.selectedGroupId,
87
- selectedGroupId = _ref3$selectedGroupId === void 0 ? null : _ref3$selectedGroupId,
88
- _ref3$hideHistory = _ref3.hideHistory,
89
- hideHistory = _ref3$hideHistory === void 0 ? false : _ref3$hideHistory;
90
- var classes = useStyles();
91
- var settings = useSettings();
92
- var fullScreenHandle = useFullScreenHandle();
93
- var memoizedActionFns = useRef({});
94
-
95
- var action = function action(type) {
96
- for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
97
- params[_key - 1] = arguments[_key];
98
- }
99
-
100
- var fnKey = "".concat(type, "(").concat(params.join(","), ")");
101
- if (memoizedActionFns.current[fnKey]) return memoizedActionFns.current[fnKey];
102
-
103
- var fn = function fn() {
104
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
105
- args[_key2] = arguments[_key2];
106
- }
107
-
108
- return params.length > 0 ? dispatch(_objectSpread({
109
- type: type
110
- }, params.reduce(function (acc, p, i) {
111
- return acc[p] = args[i], acc;
112
- }, {}))) : dispatch(_objectSpread({
113
- type: type
114
- }, args[0]));
115
- };
116
-
117
- memoizedActionFns.current[fnKey] = fn;
118
- return fn;
119
- };
120
-
121
- var _getActiveImage = getActiveImage(state),
122
- currentImageIndex = _getActiveImage.currentImageIndex,
123
- activeImage = _getActiveImage.activeImage;
124
-
125
- var nextImage;
126
-
127
- if (currentImageIndex !== null) {
128
- nextImage = state.images[currentImageIndex + 1];
129
- }
130
-
131
- useKey(function () {
132
- return dispatch({
133
- type: "CANCEL"
134
- });
135
- }, {
136
- detectKeys: [27]
137
- });
138
- var isAVideoFrame = activeImage && activeImage.frameTime !== undefined;
139
- var innerContainerRef = useRef();
140
- var hotkeyHandlers = useDispatchHotkeyHandlers({
141
- dispatch: dispatch
142
- });
143
- var impliedVideoRegions = useImpliedVideoRegions(state);
144
- var refocusOnMouseEvent = useCallback(function (e) {
145
- if (!innerContainerRef.current) return;
146
- if (innerContainerRef.current.contains(document.activeElement)) return;
147
-
148
- if (innerContainerRef.current.contains(e.target)) {
149
- innerContainerRef.current.focus();
150
- e.target.focus();
151
- }
152
- }, []);
153
- var canvas = React.createElement(ImageCanvas, Object.assign({}, settings, {
154
- showCrosshairs: settings.showCrosshairs && !["select", "pan", "zoom"].includes(state.selectedTool),
155
- key: state.selectedImage,
156
- showMask: state.showMask,
157
- fullImageSegmentationMode: state.fullImageSegmentationMode,
158
- autoSegmentationOptions: state.autoSegmentationOptions,
159
- showTags: state.showTags,
160
- allowedArea: state.allowedArea,
161
- modifyingAllowedArea: state.selectedTool === "modify-allowed-area",
162
- regionClsList: state.regionClsList,
163
- regionTagList: state.regionTagList,
164
- regions: state.annotationType === "image" ? activeImage.regions || [] : impliedVideoRegions,
165
- realSize: activeImage ? activeImage.realSize : undefined,
166
- videoPlaying: state.videoPlaying,
167
- imageSrc: state.annotationType === "image" ? activeImage.src : null,
168
- videoSrc: state.annotationType === "video" ? state.videoSrc : null,
169
- pointDistancePrecision: state.pointDistancePrecision,
170
- createWithPrimary: state.selectedTool.includes("create"),
171
- dragWithPrimary: state.selectedTool === "pan",
172
- zoomWithPrimary: state.selectedTool === "zoom",
173
- showPointDistances: state.showPointDistances,
174
- videoTime: state.annotationType === "image" ? state.selectedImageFrameTime : state.currentVideoTime,
175
- keypointDefinitions: state.keypointDefinitions,
176
- onMouseMove: action("MOUSE_MOVE"),
177
- onMouseDown: action("MOUSE_DOWN"),
178
- onMouseUp: action("MOUSE_UP"),
179
- onChangeRegion: action("CHANGE_REGION", "region"),
180
- onBeginRegionEdit: action("OPEN_REGION_EDITOR", "region"),
181
- onCloseRegionEdit: action("CLOSE_REGION_EDITOR", "region"),
182
- onDeleteRegion: action("DELETE_REGION", "region"),
183
- onBeginBoxTransform: action("BEGIN_BOX_TRANSFORM", "box", "directions"),
184
- onBeginMovePolygonPoint: action("BEGIN_MOVE_POLYGON_POINT", "polygon", "pointIndex"),
185
- onBeginMoveKeypoint: action("BEGIN_MOVE_KEYPOINT", "region", "keypointId"),
186
- onAddPolygonPoint: action("ADD_POLYGON_POINT", "polygon", "point", "pointIndex"),
187
- onSelectRegion: action("SELECT_REGION", "region"),
188
- onBeginMovePoint: action("BEGIN_MOVE_POINT", "point"),
189
- onImageLoaded: action("IMAGE_LOADED", "image"),
190
- RegionEditLabel: RegionEditLabel,
191
- onImageOrVideoLoaded: action("IMAGE_OR_VIDEO_LOADED", "metadata"),
192
- onChangeVideoTime: action("CHANGE_VIDEO_TIME", "newTime"),
193
- onChangeVideoPlaying: action("CHANGE_VIDEO_PLAYING", "isPlaying"),
194
- onRegionClassAdded: onRegionClassAdded,
195
- allowComments: state.allowComments
196
- }));
197
- var onClickIconSidebarItem = useEventCallback(function (item) {
198
- dispatch({
199
- type: "SELECT_TOOL",
200
- selectedTool: item.name
201
- });
202
- });
203
- var onClickHeaderItem = useEventCallback(function (item) {
204
- if (item.name === "Fullscreen") {
205
- fullScreenHandle.enter();
206
- } else if (item.name === "Window") {
207
- fullScreenHandle.exit();
208
- }
209
-
210
- dispatch({
211
- type: "HEADER_BUTTON_CLICKED",
212
- buttonName: item.name
213
- });
214
- });
215
- var debugModeOn = Boolean(window.localStorage.$ANNOTATE_DEBUG_MODE && state);
216
- var nextImageHasRegions = !nextImage || nextImage.regions && nextImage.regions.length > 0;
217
- return React.createElement(ThemeProvider, {
218
- theme: theme
219
- }, React.createElement(FullScreenContainer, null, React.createElement(FullScreen, {
220
- handle: fullScreenHandle,
221
- onChange: function onChange(open) {
222
- if (!open) {
223
- fullScreenHandle.exit();
224
- action("HEADER_BUTTON_CLICKED", "buttonName")("Window");
225
- }
226
- }
227
- }, React.createElement(HotkeyDiv, {
228
- tabIndex: -1,
229
- divRef: innerContainerRef,
230
- onMouseDown: refocusOnMouseEvent,
231
- onMouseOver: refocusOnMouseEvent,
232
- allowChanges: true,
233
- handlers: hotkeyHandlers,
234
- className: classnames(classes.container, state.fullScreen && "Fullscreen")
235
- }, React.createElement(Workspace, {
236
- allowFullscreen: true,
237
- iconDictionary: iconDictionary,
238
- hideHeader: hideHeader,
239
- hideHeaderText: hideHeaderText,
240
- headerLeftSide: [state.annotationType === "video" ? React.createElement(KeyframeTimeline, {
241
- currentTime: state.currentVideoTime,
242
- duration: state.videoDuration,
243
- onChangeCurrentTime: action("CHANGE_VIDEO_TIME", "newTime"),
244
- keyframes: state.keyframes
245
- }) : activeImage ? React.createElement("div", {
246
- className: classes.headerTitle
247
- }, activeImage.name) : null].filter(Boolean),
248
- headerItems: [!hidePrev && {
249
- name: "Prev"
250
- }, !hideNext && {
251
- name: "Next"
252
- }, state.annotationType !== "video" ? null : !state.videoPlaying ? {
253
- name: "Play"
254
- } : {
255
- name: "Pause"
256
- }, !hideClone && !nextImageHasRegions && activeImage.regions && {
257
- name: "Clone"
258
- }, !hideSettings && {
259
- name: "Settings"
260
- }, !hideFullScreen && (state.fullScreen ? {
261
- name: "Window"
262
- } : {
263
- name: "Fullscreen"
264
- }), !hideSave && {
265
- name: "Save"
266
- }].filter(Boolean),
267
- onClickHeaderItem: onClickHeaderItem,
268
- onClickIconSidebarItem: onClickIconSidebarItem,
269
- selectedTools: [state.selectedTool, state.showTags && "show-tags", state.showMask && "show-mask"].filter(Boolean),
270
- iconSidebarItems: [{
271
- name: "select",
272
- helperText: "Select" + getHotkeyHelpText("select_tool"),
273
- alwaysShowing: true
274
- }, {
275
- name: "pan",
276
- helperText: "Drag/Pan (right or middle click)" + getHotkeyHelpText("pan_tool"),
277
- alwaysShowing: true
278
- }, {
279
- name: "zoom",
280
- helperText: "Zoom In/Out (scroll)" + getHotkeyHelpText("zoom_tool"),
281
- alwaysShowing: true
282
- }, {
283
- name: "show-tags",
284
- helperText: "Show / Hide Tags",
285
- alwaysShowing: true
286
- }, {
287
- name: "create-point",
288
- helperText: "Add Point" + getHotkeyHelpText("create_point")
289
- }, {
290
- name: "create-box",
291
- helperText: "Add Bounding Box" + getHotkeyHelpText("create_bounding_box")
292
- }, {
293
- name: "create-polygon",
294
- helperText: "Add Polygon" + getHotkeyHelpText("create_polygon")
295
- }, {
296
- name: "create-line",
297
- helperText: "Add Line"
298
- }, {
299
- name: "create-expanding-line",
300
- helperText: "Add Expanding Line"
301
- }, {
302
- name: "create-keypoints",
303
- helperText: "Add Keypoints (Pose)"
304
- }, state.fullImageSegmentationMode && {
305
- name: "show-mask",
306
- alwaysShowing: true,
307
- helperText: "Show / Hide Mask"
308
- }, {
309
- name: "modify-allowed-area",
310
- helperText: "Modify Allowed Area"
311
- }].filter(Boolean).filter(function (a) {
312
- return a.alwaysShowing || state.enabledTools.includes(a.name);
313
- }),
314
- rightSidebarItems: [debugModeOn && React.createElement(DebugBox, {
315
- state: debugModeOn,
316
- lastAction: state.lastAction
317
- }), state.taskDescription && React.createElement(TaskDescription, {
318
- description: state.taskDescription
319
- }), state.regionClsList && React.createElement(ClassSelectionMenu, {
320
- selectedCls: state.selectedCls,
321
- regionClsList: state.regionClsList,
322
- onSelectCls: action("SELECT_CLASSIFICATION", "cls")
323
- }), state.labelImages && React.createElement(TagsSidebarBox, {
324
- currentImage: activeImage,
325
- imageClsList: state.imageClsList,
326
- imageTagList: state.imageTagList,
327
- onChangeImage: action("CHANGE_IMAGE", "delta"),
328
- expandedByDefault: true
329
- }), // (state.images?.length || 0) > 1 && (
330
- // <ImageSelector
331
- // onSelect={action("SELECT_REGION", "region")}
332
- // images={state.images}
333
- // />
334
- // ),
335
- groups && React.createElement(GroupSelector, {
336
- title: "Articles",
337
- groups: groups,
338
- selectedGroupId: selectedGroupId,
339
- onSelect: onGroupSelect
340
- }), React.createElement(RegionSelector, {
341
- regions: activeImage ? activeImage.regions : emptyArr,
342
- onSelectRegion: action("SELECT_REGION", "region"),
343
- onDeleteRegion: action("DELETE_REGION", "region"),
344
- onChangeRegion: action("CHANGE_REGION", "region")
345
- }), state.keyframes && React.createElement(KeyframesSelector, {
346
- onChangeVideoTime: action("CHANGE_VIDEO_TIME", "newTime"),
347
- onDeleteKeyframe: action("DELETE_KEYFRAME", "time"),
348
- onChangeCurrentTime: action("CHANGE_VIDEO_TIME", "newTime"),
349
- currentTime: state.currentVideoTime,
350
- duration: state.videoDuration,
351
- keyframes: state.keyframes
352
- }), !hideHistory && React.createElement(HistorySidebarBox, {
353
- history: state.history,
354
- onRestoreHistory: action("RESTORE_HISTORY")
355
- })].filter(Boolean)
356
- }, canvas), React.createElement(SettingsDialog, {
357
- open: state.settingsOpen,
358
- onClose: function onClose() {
359
- return dispatch({
360
- type: "HEADER_BUTTON_CLICKED",
361
- buttonName: "Settings"
362
- });
363
- }
364
- })))));
365
- };
366
- export default MainLayout;
File without changes
@@ -1,13 +0,0 @@
1
- import { useMemo } from "react";
2
- import getImpliedVideoRegions from "../Annotator/reducers/get-implied-video-regions.js";
3
- var emptyArr = [];
4
- export default (function (state) {
5
- if (state.annotationType !== "video") return emptyArr;
6
- var keyframes = state.keyframes,
7
- _state$currentVideoTi = state.currentVideoTime,
8
- currentVideoTime = _state$currentVideoTi === void 0 ? 0 : _state$currentVideoTi; // TODO memoize
9
-
10
- return useMemo(function () {
11
- return getImpliedVideoRegions(keyframes, currentVideoTime);
12
- }, [keyframes, currentVideoTime]);
13
- });
@@ -1,73 +0,0 @@
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;
@@ -1,51 +0,0 @@
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;
@@ -1,191 +0,0 @@
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
- });