@searpent/react-image-annotate 2.0.76 → 2.0.78

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/{src/Editor → Editor}/annotation-plugin/annotation.css +20 -0
  20. package/Editor/annotation-plugin/annotation.js +697 -0
  21. package/Editor/index.js +93 -0
  22. package/Editor/readOnly.js +123 -0
  23. package/{src/Editor → Editor}/tools.js +2 -3
  24. package/Errorer/index.js +11 -0
  25. package/FullImageSegmentationAnnotator/index.js +7 -0
  26. package/GroupSelectorSidebarBox/index.js +63 -0
  27. package/GroupsEditorSidebarBox/index.js +138 -0
  28. package/HelpSidebarBox/index.js +58 -0
  29. package/HighlightBox/index.js +102 -0
  30. package/HistorySidebarBox/index.js +71 -0
  31. package/ImageCanvas/index.js +441 -0
  32. package/ImageCanvas/region-tools.js +165 -0
  33. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  34. package/ImageCanvas/use-mouse.js +180 -0
  35. package/ImageCanvas/use-project-box.js +27 -0
  36. package/ImageCanvas/use-wasd-mode.js +62 -0
  37. package/ImageMask/index.js +133 -0
  38. package/ImageMask/load-image.js +25 -0
  39. package/ImageSelectorSidebarBox/index.js +60 -0
  40. package/KeyframeTimeline/get-time-string.js +27 -0
  41. package/KeyframeTimeline/index.js +233 -0
  42. package/KeyframesSelectorSidebarBox/index.js +93 -0
  43. package/LandingPage/index.js +159 -0
  44. package/Locker/index.js +11 -0
  45. package/MainLayout/RightSidebarItemsWrapper.js +19 -0
  46. package/MainLayout/icon-dictionary.js +104 -0
  47. package/MainLayout/index.js +526 -0
  48. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  49. package/MainLayout/types.js +0 -0
  50. package/MainLayout/use-implied-video-regions.js +13 -0
  51. package/MetadataEditorSidebarBox/index.js +231 -0
  52. package/PageSelector/index.js +180 -0
  53. package/PointDistances/index.js +73 -0
  54. package/PreventScrollToParents/index.js +51 -0
  55. package/RegionLabel/index.js +232 -0
  56. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  57. package/RegionSelectAndTransformBoxes/index.js +169 -0
  58. package/RegionSelectorSidebarBox/index.js +254 -0
  59. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  60. package/RegionShapes/index.js +294 -0
  61. package/RegionTags/index.js +144 -0
  62. package/SettingsDialog/index.js +52 -0
  63. package/SettingsProvider/index.js +60 -0
  64. package/Shortcuts/ShortcutField.js +46 -0
  65. package/Shortcuts/index.js +133 -0
  66. package/ShortcutsManager/index.js +155 -0
  67. package/Sidebar/index.js +69 -0
  68. package/SidebarBoxContainer/index.js +93 -0
  69. package/SmallToolButton/index.js +42 -0
  70. package/TagsSidebarBox/index.js +105 -0
  71. package/TaskDescriptionSidebarBox/index.js +58 -0
  72. package/Theme/index.js +30 -0
  73. package/VideoOrImageCanvasBackground/index.js +151 -0
  74. package/colors.js +14 -0
  75. package/hooks/use-colors.js +127 -0
  76. package/hooks/use-event-callback.js +10 -0
  77. package/hooks/use-exclude-pattern.js +24 -0
  78. package/hooks/use-load-image.js +26 -0
  79. package/hooks/use-window-size.js +46 -0
  80. package/{src/hooks → hooks}/xpattern.js +1 -1
  81. package/index.js +3 -0
  82. package/lib.js +3 -0
  83. package/package.json +1 -1
  84. package/stories.js +5 -0
  85. package/utils/blocks-to-article.js +60 -0
  86. package/{src/utils → utils}/blocks-to-article.test.js +5 -8
  87. package/{src/utils → utils}/default-locked-until.js +2 -1
  88. package/{src/utils → utils}/filter-only-unique.js +1 -1
  89. package/utils/get-from-local-storage.js +7 -0
  90. package/utils/get-hotkey-help-text.js +9 -0
  91. package/utils/get-landmarks-with-transform.js +40 -0
  92. package/utils/photosToImages.js +85 -0
  93. package/utils/regions-groups.js +28 -0
  94. package/utils/regions-to-blocks.js +18 -0
  95. package/utils/saveable-actions-enum.js +3 -0
  96. package/utils/set-in-local-storage.js +3 -0
  97. package/utils/sleep.js +7 -0
  98. package/utils/uuid-to-hash.js +5 -0
  99. package/.babelrc +0 -6
  100. package/.env +0 -1
  101. package/.flowconfig +0 -2
  102. package/.github/workflows/release-on-master.yml +0 -32
  103. package/.github/workflows/test.yml +0 -16
  104. package/.prettierrc +0 -3
  105. package/.releaserc.js +0 -18
  106. package/.storybook/addons.js +0 -2
  107. package/.storybook/config.js +0 -16
  108. package/LICENSE +0 -21
  109. package/public/favicon.ico +0 -0
  110. package/public/index.html +0 -38
  111. package/src/Annotator/bike-pic.png +0 -0
  112. package/src/Annotator/bike-pic2.png +0 -0
  113. package/src/Annotator/dab-keyframes.story.json +0 -1
  114. package/src/Annotator/exampleImages.js +0 -48
  115. package/src/Annotator/examplePhotos.js +0 -7603
  116. package/src/Annotator/index.js +0 -380
  117. package/src/Annotator/index.story.js +0 -877
  118. package/src/Annotator/poses.story.js +0 -150
  119. package/src/Annotator/reducers/combine-reducers.js +0 -7
  120. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  121. package/src/Annotator/reducers/general-reducer.js +0 -1228
  122. package/src/Annotator/reducers/get-active-image.js +0 -21
  123. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  124. package/src/Annotator/reducers/history-handler.js +0 -60
  125. package/src/Annotator/reducers/image-reducer.js +0 -23
  126. package/src/Annotator/reducers/video-reducer.js +0 -85
  127. package/src/Annotator/video.story.js +0 -51
  128. package/src/ClassSelectionMenu/index.js +0 -112
  129. package/src/Crosshairs/index.js +0 -64
  130. package/src/DebugSidebarBox/index.js +0 -36
  131. package/src/DemoSite/Editor.js +0 -235
  132. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  133. package/src/DemoSite/index.js +0 -41
  134. package/src/DemoSite/index.story.js +0 -10
  135. package/src/DemoSite/simple-segmentation-example.json +0 -572
  136. package/src/Editor/annotation-plugin/annotation.js +0 -536
  137. package/src/Editor/index.js +0 -50
  138. package/src/Editor/readOnly.js +0 -21
  139. package/src/Errorer/index.js +0 -13
  140. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  141. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  142. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  143. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  144. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  145. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  146. package/src/GroupSelectorSidebarBox/index.js +0 -48
  147. package/src/GroupsEditorSidebarBox/index.js +0 -108
  148. package/src/HelpSidebarBox/index.js +0 -43
  149. package/src/HighlightBox/index.js +0 -143
  150. package/src/HistorySidebarBox/index.js +0 -78
  151. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  152. package/src/ImageCanvas/index.js +0 -515
  153. package/src/ImageCanvas/index.story.js +0 -314
  154. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  155. package/src/ImageCanvas/region-tools.js +0 -171
  156. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  157. package/src/ImageCanvas/use-mouse.js +0 -168
  158. package/src/ImageCanvas/use-project-box.js +0 -23
  159. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  160. package/src/ImageMask/index.js +0 -127
  161. package/src/ImageMask/load-image.js +0 -32
  162. package/src/ImageSelectorSidebarBox/index.js +0 -54
  163. package/src/KeyframeTimeline/get-time-string.js +0 -25
  164. package/src/KeyframeTimeline/index.js +0 -223
  165. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  166. package/src/LandingPage/content.md +0 -57
  167. package/src/LandingPage/github-markdown.css +0 -964
  168. package/src/LandingPage/index.js +0 -147
  169. package/src/Locker/index.js +0 -13
  170. package/src/MainLayout/RightSidebarItemsWrapper.js +0 -21
  171. package/src/MainLayout/icon-dictionary.js +0 -79
  172. package/src/MainLayout/index.js +0 -564
  173. package/src/MainLayout/index.story.js +0 -240
  174. package/src/MainLayout/types.js +0 -171
  175. package/src/MainLayout/use-implied-video-regions.js +0 -17
  176. package/src/MetadataEditorSidebarBox/index.js +0 -160
  177. package/src/PageSelector/index.js +0 -159
  178. package/src/PointDistances/index.js +0 -90
  179. package/src/PreventScrollToParents/index.js +0 -48
  180. package/src/PreventScrollToParents/index.story.js +0 -23
  181. package/src/RegionLabel/index.js +0 -236
  182. package/src/RegionSelectAndTransformBoxes/index.js +0 -236
  183. package/src/RegionSelectorSidebarBox/index.js +0 -220
  184. package/src/RegionShapes/index.js +0 -254
  185. package/src/RegionTags/index.js +0 -136
  186. package/src/SettingsDialog/index.js +0 -58
  187. package/src/SettingsProvider/index.js +0 -57
  188. package/src/Shortcuts/ShortcutField.js +0 -44
  189. package/src/Shortcuts/index.js +0 -129
  190. package/src/ShortcutsManager/index.js +0 -162
  191. package/src/Sidebar/index.js +0 -117
  192. package/src/SidebarBoxContainer/index.js +0 -93
  193. package/src/SmallToolButton/index.js +0 -57
  194. package/src/TagsSidebarBox/index.js +0 -93
  195. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  196. package/src/Theme/index.js +0 -36
  197. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  198. package/src/colors.js +0 -32
  199. package/src/hooks/use-colors.js +0 -75
  200. package/src/hooks/use-event-callback.js +0 -11
  201. package/src/hooks/use-exclude-pattern.js +0 -27
  202. package/src/hooks/use-load-image.js +0 -21
  203. package/src/hooks/use-window-size.js +0 -46
  204. package/src/hooks/xpattern.png +0 -0
  205. package/src/index.js +0 -18
  206. package/src/lib.js +0 -7
  207. package/src/screenshot.png +0 -0
  208. package/src/site.css +0 -5
  209. package/src/stories.js +0 -2
  210. package/src/utils/blocks-to-article.js +0 -61
  211. package/src/utils/get-from-local-storage.js +0 -7
  212. package/src/utils/get-hotkey-help-text.js +0 -11
  213. package/src/utils/get-landmarks-with-transform.js +0 -23
  214. package/src/utils/photosToImages.js +0 -67
  215. package/src/utils/regions-groups.js +0 -19
  216. package/src/utils/regions-to-blocks.js +0 -16
  217. package/src/utils/saveable-actions-enum.js +0 -5
  218. package/src/utils/set-in-local-storage.js +0 -6
  219. package/src/utils/sleep.js +0 -3
  220. package/src/utils/uuid-to-hash.js +0 -5
  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,27 @@
1
+ import { getIn } from "seamless-immutable";
2
+ export default (function (state) {
3
+ var currentImageIndex = null,
4
+ pathToActiveImage,
5
+ activeImage;
6
+
7
+ if (state.annotationType === "image") {
8
+ currentImageIndex = state.selectedImage;
9
+
10
+ if (currentImageIndex === -1) {
11
+ currentImageIndex = null;
12
+ activeImage = null;
13
+ } else {
14
+ pathToActiveImage = ["images", currentImageIndex];
15
+ activeImage = getIn(state, pathToActiveImage);
16
+ }
17
+ } else if (state.annotationType === "video") {
18
+ pathToActiveImage = ["keyframes", state.currentVideoTime || 0];
19
+ activeImage = getIn(state, pathToActiveImage) || null;
20
+ }
21
+
22
+ return {
23
+ currentImageIndex: currentImageIndex,
24
+ pathToActiveImage: pathToActiveImage,
25
+ activeImage: activeImage
26
+ };
27
+ });
@@ -0,0 +1,180 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
3
+ var emptyArr = [];
4
+ export default (function (keyframes, time) {
5
+ if (keyframes[time || 0]) {
6
+ return keyframes[time || 0].regions;
7
+ } // Get surrounding video keyframes
8
+
9
+
10
+ var keyframeTimes = Object.keys(keyframes).map(function (a) {
11
+ return parseInt(a);
12
+ }).filter(function (a) {
13
+ return !isNaN(a);
14
+ });
15
+ if (keyframeTimes.length === 0) return emptyArr;
16
+ keyframeTimes.sort(function (a, b) {
17
+ return a - b;
18
+ });
19
+ var nextKeyframeTimeIndex = keyframeTimes.findIndex(function (kt) {
20
+ return kt >= time;
21
+ });
22
+
23
+ if (nextKeyframeTimeIndex === -1) {
24
+ return keyframes[keyframeTimes[keyframeTimes.length - 1]].regions || emptyArr;
25
+ } else if (nextKeyframeTimeIndex === 0) {
26
+ return emptyArr;
27
+ }
28
+
29
+ var t1 = keyframeTimes[nextKeyframeTimeIndex - 1];
30
+ var prevKeyframe = keyframes[t1];
31
+ var t2 = keyframeTimes[nextKeyframeTimeIndex];
32
+ var nextKeyframe = keyframes[t2];
33
+ var prevRegionMap = {},
34
+ nextRegionMap = {};
35
+ var _iteratorNormalCompletion = true;
36
+ var _didIteratorError = false;
37
+ var _iteratorError = undefined;
38
+
39
+ try {
40
+ for (var _iterator = prevKeyframe.regions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
41
+ var region = _step.value;
42
+ prevRegionMap[region.id] = region;
43
+ }
44
+ } catch (err) {
45
+ _didIteratorError = true;
46
+ _iteratorError = err;
47
+ } finally {
48
+ try {
49
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
50
+ _iterator.return();
51
+ }
52
+ } finally {
53
+ if (_didIteratorError) {
54
+ throw _iteratorError;
55
+ }
56
+ }
57
+ }
58
+
59
+ var _iteratorNormalCompletion2 = true;
60
+ var _didIteratorError2 = false;
61
+ var _iteratorError2 = undefined;
62
+
63
+ try {
64
+ for (var _iterator2 = nextKeyframe.regions[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
65
+ var _region = _step2.value;
66
+ nextRegionMap[_region.id] = _region;
67
+ }
68
+ } catch (err) {
69
+ _didIteratorError2 = true;
70
+ _iteratorError2 = err;
71
+ } finally {
72
+ try {
73
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
74
+ _iterator2.return();
75
+ }
76
+ } finally {
77
+ if (_didIteratorError2) {
78
+ throw _iteratorError2;
79
+ }
80
+ }
81
+ }
82
+
83
+ var impliedRegions = []; // Weighted time coefficients for linear transition
84
+
85
+ var w1 = (t2 - time) / (t2 - t1);
86
+ var w2 = 1 - w1;
87
+
88
+ var _loop = function _loop(regionId) {
89
+ var _ref = [prevRegionMap[regionId], nextRegionMap[regionId]],
90
+ prev = _ref[0],
91
+ next = _ref[1];
92
+
93
+ if (!next) {
94
+ impliedRegions.push(_objectSpread({}, prev, {
95
+ highlighted: false,
96
+ editingLabels: false
97
+ }));
98
+ return "continue";
99
+ }
100
+
101
+ switch (prev.type) {
102
+ case "point":
103
+ {
104
+ impliedRegions.push(_objectSpread({}, prev, {
105
+ highlighted: false,
106
+ editingLabels: false,
107
+ x: prev.x * w1 + next.x * w2,
108
+ y: prev.y * w1 + next.y * w2
109
+ }));
110
+ break;
111
+ }
112
+
113
+ case "box":
114
+ {
115
+ impliedRegions.push(_objectSpread({}, prev, {
116
+ highlighted: false,
117
+ editingLabels: false,
118
+ x: prev.x * w1 + next.x * w2,
119
+ y: prev.y * w1 + next.y * w2,
120
+ w: prev.w * w1 + next.w * w2,
121
+ h: prev.h * w1 + next.h * w2
122
+ }));
123
+ break;
124
+ }
125
+
126
+ case "polygon":
127
+ {
128
+ if (next.points.length === prev.points.length) {
129
+ impliedRegions.push(_objectSpread({}, prev, {
130
+ highlighted: false,
131
+ editingLabels: false,
132
+ points: prev.points.map(function (pp, i) {
133
+ return [pp[0] * w1 + next.points[i][0] * w2, pp[1] * w1 + next.points[i][1] * w2];
134
+ })
135
+ }));
136
+ } else {
137
+ impliedRegions.push(prev);
138
+ }
139
+
140
+ break;
141
+ }
142
+
143
+ case "keypoints":
144
+ {
145
+ var newPoints = {};
146
+
147
+ for (var _i = 0, _Object$entries = Object.entries(prev.points); _i < _Object$entries.length; _i++) {
148
+ var _ref4 = _Object$entries[_i];
149
+
150
+ var _ref3 = _slicedToArray(_ref4, 2);
151
+
152
+ var pointId = _ref3[0];
153
+ var prevPoint = _ref3[1];
154
+ newPoints[pointId] = {
155
+ x: prevPoint.x * w1 + next.points[pointId].x * w2,
156
+ y: prevPoint.y * w1 + next.points[pointId].y * w2
157
+ };
158
+ }
159
+
160
+ impliedRegions.push(_objectSpread({}, prev, {
161
+ highlighted: false,
162
+ editingLabels: false,
163
+ points: newPoints
164
+ }));
165
+ break;
166
+ }
167
+
168
+ default:
169
+ break;
170
+ }
171
+ };
172
+
173
+ for (var regionId in prevRegionMap) {
174
+ var _ret = _loop(regionId);
175
+
176
+ if (_ret === "continue") continue;
177
+ }
178
+
179
+ return impliedRegions;
180
+ });
@@ -0,0 +1,38 @@
1
+ import { setIn, updateIn, asMutable, without } from "seamless-immutable";
2
+ import moment from "moment";
3
+ var typesToSaveWithHistory = {
4
+ BEGIN_BOX_TRANSFORM: "Transform/Move Box",
5
+ BEGIN_MOVE_POINT: "Move Point",
6
+ DELETE_REGION: "Delete Region"
7
+ };
8
+ export var saveToHistory = function saveToHistory(state, name) {
9
+ return updateIn(state, ["history"], function (h) {
10
+ return [{
11
+ time: moment().toDate(),
12
+ state: without(state, "history"),
13
+ name: name
14
+ }].concat((h || []).slice(0, 9));
15
+ });
16
+ };
17
+ export default (function (reducer) {
18
+ return function (state, action) {
19
+ var prevState = state;
20
+ var nextState = reducer(state, action);
21
+
22
+ if (action.type === "RESTORE_HISTORY") {
23
+ if (state.history.length > 0) {
24
+ return setIn(nextState.history[0].state, ["history"], nextState.history.slice(1));
25
+ }
26
+ } else {
27
+ if (prevState !== nextState && Object.keys(typesToSaveWithHistory).includes(action.type)) {
28
+ return setIn(nextState, ["history"], [{
29
+ time: moment().toDate(),
30
+ state: without(prevState, "history"),
31
+ name: typesToSaveWithHistory[action.type] || action.type
32
+ }].concat(nextState.history || []).slice(0, 9));
33
+ }
34
+ }
35
+
36
+ return nextState;
37
+ };
38
+ });
@@ -0,0 +1,20 @@
1
+ import { setIn } from "seamless-immutable";
2
+ import getActiveImage from "./get-active-image";
3
+ export default (function (state, action) {
4
+ var _getActiveImage = getActiveImage(state),
5
+ currentImageIndex = _getActiveImage.currentImageIndex,
6
+ pathToActiveImage = _getActiveImage.pathToActiveImage,
7
+ activeImage = _getActiveImage.activeImage;
8
+
9
+ switch (action.type) {
10
+ case "IMAGE_OR_VIDEO_LOADED":
11
+ {
12
+ return setIn(state, ["images", currentImageIndex, "pixelSize"], {
13
+ w: action.metadata.naturalWidth,
14
+ h: action.metadata.naturalHeight
15
+ });
16
+ }
17
+ }
18
+
19
+ return state;
20
+ });
@@ -0,0 +1,88 @@
1
+ import { setIn, without } from "seamless-immutable";
2
+ import getImpliedVideoRegions from "./get-implied-video-regions";
3
+ import { saveToHistory } from "./history-handler.js";
4
+ export default (function (state, action) {
5
+ var copyImpliedRegions = function copyImpliedRegions() {
6
+ return setIn(saveToHistory(state, "Add Keyframe"), ["keyframes", state.currentVideoTime || 0], {
7
+ regions: getImpliedVideoRegions(state.keyframes, state.currentVideoTime)
8
+ });
9
+ };
10
+
11
+ switch (action.type) {
12
+ case "IMAGE_OR_VIDEO_LOADED":
13
+ {
14
+ var duration = action.metadata.duration;
15
+
16
+ if (typeof duration === "number") {
17
+ return setIn(state, ["videoDuration"], duration * 1000);
18
+ }
19
+ }
20
+
21
+ case "HEADER_BUTTON_CLICKED":
22
+ {
23
+ switch (action.buttonName.toLowerCase()) {
24
+ case "play":
25
+ return setIn(state, ["videoPlaying"], true);
26
+
27
+ case "pause":
28
+ return setIn(state, ["videoPlaying"], false);
29
+ }
30
+ }
31
+
32
+ case "CHANGE_VIDEO_TIME":
33
+ {
34
+ return setIn(state, ["currentVideoTime"], action.newTime);
35
+ }
36
+
37
+ case "CHANGE_VIDEO_PLAYING":
38
+ {
39
+ return setIn(state, ["videoPlaying"], action.isPlaying);
40
+ }
41
+
42
+ case "DELETE_KEYFRAME":
43
+ {
44
+ return setIn(state, ["keyframes"], without(state.keyframes, action.time));
45
+ }
46
+
47
+ default:
48
+ break;
49
+ } // Before the user modifies regions, copy the interpolated regions over to a
50
+ // new keyframe
51
+
52
+
53
+ if (!state.keyframes[state.currentVideoTime]) {
54
+ switch (action.type) {
55
+ case "BEGIN_BOX_TRANSFORM":
56
+ case "BEGIN_MOVE_POINT":
57
+ case "BEGIN_MOVE_KEYPOINT":
58
+ case "BEGIN_MOVE_POLYGON_POINT":
59
+ case "ADD_POLYGON_POINT":
60
+ case "SELECT_REGION":
61
+ case "CHANGE_REGION":
62
+ case "DELETE_REGION":
63
+ case "OPEN_REGION_EDITOR":
64
+ return copyImpliedRegions();
65
+
66
+ case "MOUSE_DOWN":
67
+ {
68
+ switch (state.selectedTool) {
69
+ case "create-point":
70
+ case "create-polygon":
71
+ case "create-box":
72
+ case "create-keypoints":
73
+ return copyImpliedRegions();
74
+
75
+ default:
76
+ break;
77
+ }
78
+
79
+ break;
80
+ }
81
+
82
+ default:
83
+ break;
84
+ }
85
+ }
86
+
87
+ return state;
88
+ });
@@ -0,0 +1,140 @@
1
+ import React, { useEffect } from "react";
2
+ import { styled } from "@mui/material/styles";
3
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
4
+ import Box from "@mui/material/Box";
5
+ import * as muiColors from "@mui/material/colors";
6
+ import SidebarBoxContainer from "../SidebarBoxContainer";
7
+ import BallotIcon from "@mui/icons-material/Ballot";
8
+ import capitalize from "lodash/capitalize";
9
+ import classnames from "classnames";
10
+ import useColors from "../hooks/use-colors";
11
+ var theme = createTheme();
12
+ var LabelContainer = styled("div")(function (_ref) {
13
+ var theme = _ref.theme;
14
+ return {
15
+ display: "flex",
16
+ paddingTop: 4,
17
+ paddingBottom: 4,
18
+ paddingLeft: 16,
19
+ paddingRight: 16,
20
+ alignItems: "center",
21
+ cursor: "pointer",
22
+ opacity: 0.7,
23
+ backgroundColor: "#fff",
24
+ "&:hover": {
25
+ opacity: 1
26
+ },
27
+ "&.selected": {
28
+ opacity: 1,
29
+ fontWeight: "bold"
30
+ }
31
+ };
32
+ });
33
+ var Circle = styled("div")(function (_ref2) {
34
+ var theme = _ref2.theme;
35
+ return {
36
+ width: 12,
37
+ height: 12,
38
+ borderRadius: 12,
39
+ marginRight: 8
40
+ };
41
+ });
42
+ var Label = styled("div")(function (_ref3) {
43
+ var theme = _ref3.theme;
44
+ return {
45
+ fontSize: 11
46
+ };
47
+ });
48
+ var DashSep = styled("div")(function (_ref4) {
49
+ var theme = _ref4.theme;
50
+ return {
51
+ flexGrow: 1,
52
+ borderBottom: "2px dotted ".concat(muiColors.grey[300]),
53
+ marginLeft: 8,
54
+ marginRight: 8
55
+ };
56
+ });
57
+ var Number = styled("div")(function (_ref5) {
58
+ var theme = _ref5.theme;
59
+ return {
60
+ fontSize: 11,
61
+ textAlign: "center",
62
+ minWidth: 14,
63
+ paddingTop: 2,
64
+ paddingBottom: 2,
65
+ fontWeight: "bold",
66
+ color: muiColors.grey[700]
67
+ };
68
+ });
69
+ export var ClassSelectionMenu = function ClassSelectionMenu(_ref6) {
70
+ var selectedCls = _ref6.selectedCls,
71
+ regionClsList = _ref6.regionClsList,
72
+ onSelectCls = _ref6.onSelectCls;
73
+
74
+ var _useColors = useColors(),
75
+ clsColor = _useColors.clsColor;
76
+
77
+ useEffect(function () {
78
+ var keyMapping = {};
79
+
80
+ var _loop = function _loop(i) {
81
+ keyMapping[i + 1] = function () {
82
+ return onSelectCls(regionClsList[i]);
83
+ };
84
+ };
85
+
86
+ for (var i = 0; i < 9 && i < regionClsList.length; i++) {
87
+ _loop(i);
88
+ }
89
+
90
+ var onKeyDown = function onKeyDown(e) {
91
+ if (keyMapping[e.key]) {
92
+ keyMapping[e.key]();
93
+ e.preventDefault();
94
+ e.stopPropagation();
95
+ }
96
+ };
97
+
98
+ window.addEventListener("keydown", onKeyDown);
99
+ return function () {
100
+ return window.removeEventListener("keydown", onKeyDown);
101
+ };
102
+ }, [regionClsList, selectedCls]);
103
+ return React.createElement(ThemeProvider, {
104
+ theme: theme
105
+ }, React.createElement(SidebarBoxContainer, {
106
+ title: "Classifications",
107
+ subTitle: "",
108
+ icon: React.createElement(BallotIcon, {
109
+ style: {
110
+ color: muiColors.grey[700]
111
+ }
112
+ }),
113
+ expandedByDefault: true
114
+ }, regionClsList.map(function (label, index) {
115
+ return React.createElement(LabelContainer, {
116
+ key: label,
117
+ className: classnames({
118
+ selected: label === selectedCls
119
+ }),
120
+ onClick: function onClick() {
121
+ return onSelectCls(label);
122
+ }
123
+ }, React.createElement(Circle, {
124
+ style: {
125
+ backgroundColor: clsColor(label)
126
+ }
127
+ }), React.createElement(Label, {
128
+ className: classnames({
129
+ selected: label === selectedCls
130
+ })
131
+ }, capitalize(label)), React.createElement(DashSep, null), React.createElement(Number, {
132
+ className: classnames({
133
+ selected: label === selectedCls
134
+ })
135
+ }, index < 9 ? "Key [".concat(index + 1, "]") : ""));
136
+ }), React.createElement(Box, {
137
+ pb: 2
138
+ })));
139
+ };
140
+ export default ClassSelectionMenu;
@@ -0,0 +1,53 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { Fragment, useEffect, useState } from "react";
3
+ export var Crosshairs = function Crosshairs(_ref) {
4
+ var mousePosition = _ref.mousePosition,
5
+ x = _ref.x,
6
+ y = _ref.y;
7
+
8
+ var _useState = useState(),
9
+ _useState2 = _slicedToArray(_useState, 2),
10
+ forceRenderState = _useState2[0],
11
+ changeForceRenderState = _useState2[1];
12
+
13
+ if (mousePosition) {
14
+ x = mousePosition.current.x;
15
+ y = mousePosition.current.y;
16
+ }
17
+
18
+ useEffect(function () {
19
+ if (!mousePosition) return;
20
+ var interval = setInterval(function () {
21
+ if (x !== mousePosition.current.x || y !== mousePosition.current.y) {
22
+ changeForceRenderState([mousePosition.current.x, mousePosition.current.y]);
23
+ }
24
+ }, 10);
25
+ return function () {
26
+ return clearInterval(interval);
27
+ };
28
+ });
29
+ return React.createElement(Fragment, null, React.createElement("div", {
30
+ style: {
31
+ position: "absolute",
32
+ height: "100%",
33
+ width: 1,
34
+ zIndex: 10,
35
+ backgroundColor: "#f00",
36
+ left: x,
37
+ pointerEvents: "none",
38
+ top: 0
39
+ }
40
+ }), React.createElement("div", {
41
+ style: {
42
+ position: "absolute",
43
+ width: "100%",
44
+ zIndex: 10,
45
+ height: 1,
46
+ backgroundColor: "#f00",
47
+ top: y,
48
+ pointerEvents: "none",
49
+ left: 0
50
+ }
51
+ }));
52
+ };
53
+ export default Crosshairs;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import SidebarBoxContainer from "../SidebarBoxContainer";
3
+ export var DebugSidebarBox = function DebugSidebarBox(_ref) {
4
+ var state = _ref.state,
5
+ lastAction = _ref.lastAction;
6
+ var image = (state.images || [])[state.selectedImage];
7
+ var region = image ? (image.regions || []).filter(function (r) {
8
+ return r.highlighted;
9
+ }) : null;
10
+ return React.createElement(SidebarBoxContainer, {
11
+ title: "Debug",
12
+ icon: React.createElement("span", null),
13
+ expandedByDefault: true
14
+ }, React.createElement("div", {
15
+ style: {
16
+ padding: 4
17
+ }
18
+ }, React.createElement("div", null, React.createElement("b", null, "region"), ":"), React.createElement("pre", null, JSON.stringify(region, null, " ")), React.createElement("div", null, React.createElement("b", null, "lastAction"), ":"), React.createElement("pre", null, JSON.stringify(lastAction, null, " ")), React.createElement("div", null, React.createElement("b", null, "mode"), ":"), React.createElement("pre", null, JSON.stringify(state.mode, null, " ")), React.createElement("div", null, React.createElement("b", null, "frame:")), React.createElement("pre", null, JSON.stringify(state.selectedImageFrameTime, null, " "))));
19
+ };
20
+ export default DebugSidebarBox;