react-image-annotate-master-custom 0.0.1

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 (73) hide show
  1. package/Annotator/index.js +164 -0
  2. package/Annotator/reducers/combine-reducers.js +14 -0
  3. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  4. package/Annotator/reducers/fix-twisted.js +4 -0
  5. package/Annotator/reducers/general-reducer.js +1073 -0
  6. package/Annotator/reducers/get-active-image.js +27 -0
  7. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  8. package/Annotator/reducers/history-handler.js +38 -0
  9. package/Annotator/reducers/image-reducer.js +20 -0
  10. package/Annotator/reducers/video-reducer.js +88 -0
  11. package/ClassSelectionMenu/index.js +135 -0
  12. package/Crosshairs/index.js +53 -0
  13. package/DebugSidebarBox/index.js +20 -0
  14. package/DemoSite/Editor.js +194 -0
  15. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  16. package/DemoSite/index.js +69 -0
  17. package/FullImageSegmentationAnnotator/index.js +7 -0
  18. package/HighlightBox/index.js +105 -0
  19. package/HistorySidebarBox/index.js +71 -0
  20. package/ImageCanvas/index.js +428 -0
  21. package/ImageCanvas/region-tools.js +165 -0
  22. package/ImageCanvas/styles.js +31 -0
  23. package/ImageCanvas/use-mouse.js +180 -0
  24. package/ImageCanvas/use-project-box.js +27 -0
  25. package/ImageCanvas/use-wasd-mode.js +62 -0
  26. package/ImageMask/index.js +133 -0
  27. package/ImageMask/load-image.js +25 -0
  28. package/ImageSelectorSidebarBox/index.js +60 -0
  29. package/KeyframeTimeline/get-time-string.js +27 -0
  30. package/KeyframeTimeline/index.js +233 -0
  31. package/KeyframesSelectorSidebarBox/index.js +93 -0
  32. package/LandingPage/index.js +159 -0
  33. package/MainLayout/icon-dictionary.js +104 -0
  34. package/MainLayout/index.js +359 -0
  35. package/MainLayout/styles.js +25 -0
  36. package/MainLayout/types.js +0 -0
  37. package/MainLayout/use-implied-video-regions.js +13 -0
  38. package/PointDistances/index.js +73 -0
  39. package/PreventScrollToParents/index.js +51 -0
  40. package/README.md +101 -0
  41. package/RegionLabel/index.js +197 -0
  42. package/RegionLabel/styles.js +48 -0
  43. package/RegionSelectAndTransformBoxes/index.js +166 -0
  44. package/RegionSelectorSidebarBox/index.js +248 -0
  45. package/RegionSelectorSidebarBox/styles.js +53 -0
  46. package/RegionShapes/index.js +275 -0
  47. package/RegionTags/index.js +138 -0
  48. package/SettingsDialog/index.js +52 -0
  49. package/SettingsProvider/index.js +53 -0
  50. package/Shortcuts/ShortcutField.js +46 -0
  51. package/Shortcuts/index.js +133 -0
  52. package/ShortcutsManager/index.js +155 -0
  53. package/Sidebar/index.js +69 -0
  54. package/SidebarBoxContainer/index.js +93 -0
  55. package/SmallToolButton/index.js +42 -0
  56. package/TagsSidebarBox/index.js +105 -0
  57. package/TaskDescriptionSidebarBox/index.js +58 -0
  58. package/Theme/index.js +30 -0
  59. package/VideoOrImageCanvasBackground/index.js +151 -0
  60. package/colors.js +14 -0
  61. package/hooks/use-event-callback.js +10 -0
  62. package/hooks/use-exclude-pattern.js +24 -0
  63. package/hooks/use-load-image.js +26 -0
  64. package/hooks/use-window-size.js +46 -0
  65. package/hooks/xpattern.js +1 -0
  66. package/index.js +3 -0
  67. package/lib.js +3 -0
  68. package/package.json +91 -0
  69. package/stories.js +5 -0
  70. package/utils/get-from-local-storage.js +7 -0
  71. package/utils/get-hotkey-help-text.js +9 -0
  72. package/utils/get-landmarks-with-transform.js +40 -0
  73. package/utils/set-in-local-storage.js +3 -0
@@ -0,0 +1,1073 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
4
+ import { moveRegion } from "../../ImageCanvas/region-tools.js";
5
+ import { getIn, setIn, updateIn } from "seamless-immutable";
6
+ import moment from "moment";
7
+ import isEqual from "lodash/isEqual";
8
+ import getActiveImage from "./get-active-image";
9
+ import { saveToHistory } from "./history-handler.js";
10
+ import colors from "../../colors";
11
+ import fixTwisted from "./fix-twisted";
12
+ import convertExpandingLineToPolygon from "./convert-expanding-line-to-polygon";
13
+ import clamp from "clamp";
14
+ import getLandmarksWithTransform from "../../utils/get-landmarks-with-transform";
15
+ import setInLocalStorage from "../../utils/set-in-local-storage";
16
+
17
+ var getRandomId = function getRandomId() {
18
+ return Math.random().toString().split(".")[1];
19
+ };
20
+
21
+ export default (function (state, action) {
22
+ if (state.allowedArea && state.selectedTool !== "modify-allowed-area" && ["MOUSE_DOWN", "MOUSE_UP", "MOUSE_MOVE"].includes(action.type)) {
23
+ var aa = state.allowedArea;
24
+ action.x = clamp(action.x, aa.x, aa.x + aa.w);
25
+ action.y = clamp(action.y, aa.y, aa.y + aa.h);
26
+ }
27
+
28
+ if (action.type === "ON_CLS_ADDED" && action.cls && action.cls !== "") {
29
+ var oldRegionClsList = state.regionClsList;
30
+
31
+ var newState = _objectSpread({}, state, {
32
+ regionClsList: oldRegionClsList.concat(action.cls)
33
+ });
34
+
35
+ return newState;
36
+ } // Throttle certain actions
37
+
38
+
39
+ if (action.type === "MOUSE_MOVE") {
40
+ if (Date.now() - (state.lastMouseMoveCall || 0) < 16) return state;
41
+ state = setIn(state, ["lastMouseMoveCall"], Date.now());
42
+ }
43
+
44
+ if (!action.type.includes("MOUSE")) {
45
+ state = setIn(state, ["lastAction"], action);
46
+ }
47
+
48
+ var _getActiveImage = getActiveImage(state),
49
+ currentImageIndex = _getActiveImage.currentImageIndex,
50
+ pathToActiveImage = _getActiveImage.pathToActiveImage,
51
+ activeImage = _getActiveImage.activeImage;
52
+
53
+ var getRegionIndex = function getRegionIndex(region) {
54
+ var regionId = typeof region === "string" || typeof region === "number" ? region : region.id;
55
+ if (!activeImage) return null;
56
+ var regionIndex = (activeImage.regions || []).findIndex(function (r) {
57
+ return r.id === regionId;
58
+ });
59
+ return regionIndex === -1 ? null : regionIndex;
60
+ };
61
+
62
+ var getRegion = function getRegion(regionId) {
63
+ if (!activeImage) return null;
64
+ var regionIndex = getRegionIndex(regionId);
65
+ if (regionIndex === null) return [null, null];
66
+ var region = activeImage.regions[regionIndex];
67
+ return [region, regionIndex];
68
+ };
69
+
70
+ var modifyRegion = function modifyRegion(regionId, obj) {
71
+ var _getRegion = getRegion(regionId),
72
+ _getRegion2 = _slicedToArray(_getRegion, 2),
73
+ region = _getRegion2[0],
74
+ regionIndex = _getRegion2[1];
75
+
76
+ if (!region) return state;
77
+
78
+ if (obj !== null) {
79
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", regionIndex]), _objectSpread({}, region, obj));
80
+ } else {
81
+ // delete region
82
+ var regions = activeImage.regions;
83
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (regions || []).filter(function (r) {
84
+ return r.id !== region.id;
85
+ }));
86
+ }
87
+ };
88
+
89
+ var unselectRegions = function unselectRegions(state) {
90
+ if (!activeImage) return state;
91
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).map(function (r) {
92
+ return _objectSpread({}, r, {
93
+ highlighted: false
94
+ });
95
+ }));
96
+ };
97
+
98
+ var closeEditors = function closeEditors(state) {
99
+ if (currentImageIndex === null) return state;
100
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).map(function (r) {
101
+ return _objectSpread({}, r, {
102
+ editingLabels: false
103
+ });
104
+ }));
105
+ };
106
+
107
+ var setNewImage = function setNewImage(img, index) {
108
+ var _ref = typeof img === "object" ? img : {
109
+ src: img
110
+ },
111
+ src = _ref.src,
112
+ frameTime = _ref.frameTime;
113
+
114
+ return setIn(setIn(state, ["selectedImage"], index), ["selectedImageFrameTime"], frameTime);
115
+ };
116
+
117
+ switch (action.type) {
118
+ case "@@INIT":
119
+ {
120
+ return state;
121
+ }
122
+
123
+ case "SELECT_IMAGE":
124
+ {
125
+ return setNewImage(action.image, action.imageIndex);
126
+ }
127
+
128
+ case "SELECT_CLASSIFICATION":
129
+ {
130
+ return setIn(state, ["selectedCls"], action.cls);
131
+ }
132
+
133
+ case "CHANGE_REGION":
134
+ {
135
+ var regionIndex = getRegionIndex(action.region);
136
+ if (regionIndex === null) return state;
137
+ var oldRegion = activeImage.regions[regionIndex];
138
+
139
+ if (oldRegion.cls !== action.region.cls) {
140
+ state = saveToHistory(state, "Change Region Classification");
141
+ var clsIndex = state.regionClsList.indexOf(action.region.cls);
142
+
143
+ if (clsIndex !== -1) {
144
+ state = setIn(state, ["selectedCls"], action.region.cls);
145
+ action.region.color = colors[clsIndex % colors.length];
146
+ }
147
+ }
148
+
149
+ if (!isEqual(oldRegion.tags, action.region.tags)) {
150
+ state = saveToHistory(state, "Change Region Tags");
151
+ }
152
+
153
+ if (!isEqual(oldRegion.comment, action.region.comment)) {
154
+ state = saveToHistory(state, "Change Region Comment");
155
+ }
156
+
157
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", regionIndex]), action.region);
158
+ }
159
+
160
+ case "CHANGE_IMAGE":
161
+ {
162
+ if (!activeImage) return state;
163
+ var delta = action.delta;
164
+
165
+ for (var _i = 0, _Object$keys = Object.keys(delta); _i < _Object$keys.length; _i++) {
166
+ var key = _Object$keys[_i];
167
+ if (key === "cls") saveToHistory(state, "Change Image Class");
168
+ if (key === "tags") saveToHistory(state, "Change Image Tags");
169
+ state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), [key]), delta[key]);
170
+ }
171
+
172
+ return state;
173
+ }
174
+
175
+ case "SELECT_REGION":
176
+ {
177
+ var region = action.region;
178
+
179
+ var _regionIndex = getRegionIndex(action.region);
180
+
181
+ if (_regionIndex === null) return state;
182
+
183
+ var regions = _toConsumableArray(activeImage.regions || []).map(function (r) {
184
+ return _objectSpread({}, r, {
185
+ highlighted: r.id === region.id,
186
+ editingLabels: r.id === region.id
187
+ });
188
+ });
189
+
190
+ state.onClickAnno(regions[_regionIndex]); //customize
191
+
192
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), regions);
193
+ }
194
+
195
+ case "BEGIN_MOVE_POINT":
196
+ {
197
+ state = closeEditors(state);
198
+ return setIn(state, ["mode"], {
199
+ mode: "MOVE_REGION",
200
+ regionId: action.point.id
201
+ });
202
+ }
203
+
204
+ case "BEGIN_BOX_TRANSFORM":
205
+ {
206
+ var box = action.box,
207
+ directions = action.directions;
208
+ state = closeEditors(state);
209
+
210
+ if (directions[0] === 0 && directions[1] === 0) {
211
+ return setIn(state, ["mode"], {
212
+ mode: "MOVE_REGION",
213
+ regionId: box.id
214
+ });
215
+ } else {
216
+ return setIn(state, ["mode"], {
217
+ mode: "RESIZE_BOX",
218
+ regionId: box.id,
219
+ freedom: directions,
220
+ original: {
221
+ x: box.x,
222
+ y: box.y,
223
+ w: box.w,
224
+ h: box.h
225
+ }
226
+ });
227
+ }
228
+ }
229
+
230
+ case "BEGIN_MOVE_POLYGON_POINT":
231
+ {
232
+ var polygon = action.polygon,
233
+ pointIndex = action.pointIndex;
234
+ state = closeEditors(state);
235
+
236
+ if (state.mode && state.mode.mode === "DRAW_POLYGON" && pointIndex === 0) {
237
+ return setIn(modifyRegion(polygon, {
238
+ points: polygon.points.slice(0, -1),
239
+ open: false
240
+ }), ["mode"], null);
241
+ } else {
242
+ state = saveToHistory(state, "Move Polygon Point");
243
+ }
244
+
245
+ return setIn(state, ["mode"], {
246
+ mode: "MOVE_POLYGON_POINT",
247
+ regionId: polygon.id,
248
+ pointIndex: pointIndex
249
+ });
250
+ }
251
+
252
+ case "BEGIN_MOVE_KEYPOINT":
253
+ {
254
+ var _region = action.region,
255
+ keypointId = action.keypointId;
256
+ state = closeEditors(state);
257
+ state = saveToHistory(state, "Move Keypoint");
258
+ return setIn(state, ["mode"], {
259
+ mode: "MOVE_KEYPOINT",
260
+ regionId: _region.id,
261
+ keypointId: keypointId
262
+ });
263
+ }
264
+
265
+ case "ADD_POLYGON_POINT":
266
+ {
267
+ var _polygon = action.polygon,
268
+ point = action.point,
269
+ _pointIndex = action.pointIndex;
270
+
271
+ var _regionIndex2 = getRegionIndex(_polygon);
272
+
273
+ if (_regionIndex2 === null) return state;
274
+
275
+ var points = _toConsumableArray(_polygon.points);
276
+
277
+ points.splice(_pointIndex, 0, point);
278
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex2]), _objectSpread({}, _polygon, {
279
+ points: points
280
+ }));
281
+ }
282
+
283
+ case "MOUSE_MOVE":
284
+ {
285
+ var x = action.x,
286
+ y = action.y;
287
+ if (!state.mode) return state;
288
+ if (!activeImage) return state;
289
+ var _state = state,
290
+ mouseDownAt = _state.mouseDownAt;
291
+
292
+ switch (state.mode.mode) {
293
+ case "MOVE_POLYGON_POINT":
294
+ {
295
+ var _state$mode = state.mode,
296
+ _pointIndex2 = _state$mode.pointIndex,
297
+ regionId = _state$mode.regionId;
298
+
299
+ var _regionIndex3 = getRegionIndex(regionId);
300
+
301
+ if (_regionIndex3 === null) return state;
302
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex3, "points", _pointIndex2]), [x, y]);
303
+ }
304
+
305
+ case "MOVE_KEYPOINT":
306
+ {
307
+ var _state$mode2 = state.mode,
308
+ _keypointId = _state$mode2.keypointId,
309
+ _regionId = _state$mode2.regionId;
310
+
311
+ var _getRegion3 = getRegion(_regionId),
312
+ _getRegion4 = _slicedToArray(_getRegion3, 2),
313
+ _region2 = _getRegion4[0],
314
+ _regionIndex4 = _getRegion4[1];
315
+
316
+ if (_regionIndex4 === null) return state;
317
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex4, "points", _keypointId]), _objectSpread({}, _region2.points[_keypointId], {
318
+ x: x,
319
+ y: y
320
+ }));
321
+ }
322
+
323
+ case "MOVE_REGION":
324
+ {
325
+ var _regionId2 = state.mode.regionId;
326
+
327
+ if (_regionId2 === "$$allowed_area") {
328
+ var _state2 = state,
329
+ _state2$allowedArea = _state2.allowedArea,
330
+ w = _state2$allowedArea.w,
331
+ h = _state2$allowedArea.h;
332
+ return setIn(state, ["allowedArea"], {
333
+ x: x - w / 2,
334
+ y: y - h / 2,
335
+ w: w,
336
+ h: h
337
+ });
338
+ }
339
+
340
+ var _regionIndex5 = getRegionIndex(_regionId2);
341
+
342
+ if (_regionIndex5 === null) return state;
343
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex5]), moveRegion(activeImage.regions[_regionIndex5], x, y));
344
+ }
345
+
346
+ case "RESIZE_BOX":
347
+ {
348
+ var _state$mode3 = state.mode,
349
+ _regionId3 = _state$mode3.regionId,
350
+ _state$mode3$freedom = _slicedToArray(_state$mode3.freedom, 2),
351
+ xFree = _state$mode3$freedom[0],
352
+ yFree = _state$mode3$freedom[1],
353
+ _state$mode3$original = _state$mode3.original,
354
+ ox = _state$mode3$original.x,
355
+ oy = _state$mode3$original.y,
356
+ ow = _state$mode3$original.w,
357
+ oh = _state$mode3$original.h;
358
+
359
+ var dx = xFree === 0 ? ox : xFree === -1 ? Math.min(ox + ow, x) : ox;
360
+ var dw = xFree === 0 ? ow : xFree === -1 ? ow + (ox - dx) : Math.max(0, ow + (x - ox - ow));
361
+ var dy = yFree === 0 ? oy : yFree === -1 ? Math.min(oy + oh, y) : oy;
362
+ var dh = yFree === 0 ? oh : yFree === -1 ? oh + (oy - dy) : Math.max(0, oh + (y - oy - oh)); // determine if we should switch the freedom
363
+
364
+ if (dw <= 0.001) {
365
+ state = setIn(state, ["mode", "freedom"], [xFree * -1, yFree]);
366
+ }
367
+
368
+ if (dh <= 0.001) {
369
+ state = setIn(state, ["mode", "freedom"], [xFree, yFree * -1]);
370
+ }
371
+
372
+ if (_regionId3 === "$$allowed_area") {
373
+ return setIn(state, ["allowedArea"], {
374
+ x: dx,
375
+ w: dw,
376
+ y: dy,
377
+ h: dh
378
+ });
379
+ }
380
+
381
+ var _regionIndex6 = getRegionIndex(_regionId3);
382
+
383
+ if (_regionIndex6 === null) return state;
384
+ var _box = activeImage.regions[_regionIndex6];
385
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex6]), _objectSpread({}, _box, {
386
+ x: dx,
387
+ w: dw,
388
+ y: dy,
389
+ h: dh
390
+ }));
391
+ }
392
+
393
+ case "RESIZE_KEYPOINTS":
394
+ {
395
+ var _state$mode4 = state.mode,
396
+ _regionId4 = _state$mode4.regionId,
397
+ landmarks = _state$mode4.landmarks,
398
+ centerX = _state$mode4.centerX,
399
+ centerY = _state$mode4.centerY;
400
+ var distFromCenter = Math.sqrt(Math.pow(centerX - x, 2) + Math.pow(centerY - y, 2));
401
+ var scale = distFromCenter / 0.15;
402
+ return modifyRegion(_regionId4, {
403
+ points: getLandmarksWithTransform({
404
+ landmarks: landmarks,
405
+ center: {
406
+ x: centerX,
407
+ y: centerY
408
+ },
409
+ scale: scale
410
+ })
411
+ });
412
+ }
413
+
414
+ case "DRAW_POLYGON":
415
+ {
416
+ var _regionId5 = state.mode.regionId;
417
+
418
+ var _getRegion5 = getRegion(_regionId5),
419
+ _getRegion6 = _slicedToArray(_getRegion5, 2),
420
+ _region3 = _getRegion6[0],
421
+ _regionIndex7 = _getRegion6[1];
422
+
423
+ if (!_region3) return setIn(state, ["mode"], null);
424
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex7, "points", _region3.points.length - 1]), [x, y]);
425
+ }
426
+
427
+ case "DRAW_LINE":
428
+ {
429
+ var _regionId6 = state.mode.regionId;
430
+
431
+ var _getRegion7 = getRegion(_regionId6),
432
+ _getRegion8 = _slicedToArray(_getRegion7, 2),
433
+ _region4 = _getRegion8[0],
434
+ _regionIndex8 = _getRegion8[1];
435
+
436
+ if (!_region4) return setIn(state, ["mode"], null);
437
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex8]), _objectSpread({}, _region4, {
438
+ x2: x,
439
+ y2: y
440
+ }));
441
+ }
442
+
443
+ case "DRAW_EXPANDING_LINE":
444
+ {
445
+ var _regionId7 = state.mode.regionId;
446
+
447
+ var _getRegion9 = getRegion(_regionId7),
448
+ _getRegion10 = _slicedToArray(_getRegion9, 2),
449
+ expandingLine = _getRegion10[0],
450
+ _regionIndex9 = _getRegion10[1];
451
+
452
+ if (!expandingLine) return state;
453
+ var isMouseDown = Boolean(state.mouseDownAt);
454
+
455
+ if (isMouseDown) {
456
+ // If the mouse is down, set width/angle
457
+ var lastPoint = expandingLine.points.slice(-1)[0];
458
+ var mouseDistFromLastPoint = Math.sqrt(Math.pow(lastPoint.x - x, 2) + Math.pow(lastPoint.y - y, 2));
459
+ if (mouseDistFromLastPoint < 0.002 && !lastPoint.width) return state;
460
+
461
+ var _newState = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex9, "points"]), expandingLine.points.slice(0, -1).concat([_objectSpread({}, lastPoint, {
462
+ width: mouseDistFromLastPoint * 2,
463
+ angle: Math.atan2(lastPoint.x - x, lastPoint.y - y)
464
+ })]));
465
+
466
+ return _newState;
467
+ } else {
468
+ // If mouse is up, move the next candidate point
469
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex9]), _objectSpread({}, expandingLine, {
470
+ candidatePoint: {
471
+ x: x,
472
+ y: y
473
+ }
474
+ }));
475
+ }
476
+
477
+ return state;
478
+ }
479
+
480
+ case "SET_EXPANDING_LINE_WIDTH":
481
+ {
482
+ var _regionId8 = state.mode.regionId;
483
+
484
+ var _getRegion11 = getRegion(_regionId8),
485
+ _getRegion12 = _slicedToArray(_getRegion11, 2),
486
+ _expandingLine = _getRegion12[0],
487
+ _regionIndex10 = _getRegion12[1];
488
+
489
+ if (!_expandingLine) return state;
490
+
491
+ var _lastPoint = _expandingLine.points.slice(-1)[0];
492
+
493
+ var _state3 = state,
494
+ _mouseDownAt = _state3.mouseDownAt;
495
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex10, "expandingWidth"]), Math.sqrt(Math.pow(_lastPoint.x - x, 2) + Math.pow(_lastPoint.y - y, 2)));
496
+ }
497
+
498
+ default:
499
+ return state;
500
+ }
501
+ }
502
+
503
+ case "MOUSE_DOWN":
504
+ {
505
+ var _getIn$regions;
506
+
507
+ if (!activeImage) return state;
508
+ var _x = action.x,
509
+ _y = action.y;
510
+ state = setIn(state, ["mouseDownAt"], {
511
+ x: _x,
512
+ y: _y
513
+ });
514
+
515
+ if (state.mode) {
516
+ switch (state.mode.mode) {
517
+ case "DRAW_POLYGON":
518
+ {
519
+ var _getRegion13 = getRegion(state.mode.regionId),
520
+ _getRegion14 = _slicedToArray(_getRegion13, 2),
521
+ _polygon2 = _getRegion14[0],
522
+ _regionIndex11 = _getRegion14[1];
523
+
524
+ if (!_polygon2) break;
525
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex11]), _objectSpread({}, _polygon2, {
526
+ points: _polygon2.points.concat([[_x, _y]])
527
+ }));
528
+ }
529
+
530
+ case "DRAW_LINE":
531
+ {
532
+ var _getRegion15 = getRegion(state.mode.regionId),
533
+ _getRegion16 = _slicedToArray(_getRegion15, 2),
534
+ line = _getRegion16[0],
535
+ _regionIndex12 = _getRegion16[1];
536
+
537
+ if (!line) break;
538
+ setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex12]), _objectSpread({}, line, {
539
+ x2: _x,
540
+ y2: _y
541
+ }));
542
+ return setIn(state, ["mode"], null);
543
+ }
544
+
545
+ case "DRAW_EXPANDING_LINE":
546
+ {
547
+ var _getRegion17 = getRegion(state.mode.regionId),
548
+ _getRegion18 = _slicedToArray(_getRegion17, 2),
549
+ _expandingLine2 = _getRegion18[0],
550
+ _regionIndex13 = _getRegion18[1];
551
+
552
+ if (!_expandingLine2) break;
553
+
554
+ var _lastPoint2 = _expandingLine2.points.slice(-1)[0];
555
+
556
+ if (_expandingLine2.points.length > 1 && Math.sqrt(Math.pow(_lastPoint2.x - _x, 2) + Math.pow(_lastPoint2.y - _y, 2)) < 0.002) {
557
+ if (!_lastPoint2.width) {
558
+ return setIn(state, ["mode"], {
559
+ mode: "SET_EXPANDING_LINE_WIDTH",
560
+ regionId: state.mode.regionId
561
+ });
562
+ } else {
563
+ return state.setIn([].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex13]), convertExpandingLineToPolygon(_expandingLine2)).setIn(["mode"], null);
564
+ }
565
+ } // Create new point
566
+
567
+
568
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex13, "points"]), _expandingLine2.points.concat([{
569
+ x: _x,
570
+ y: _y,
571
+ angle: null,
572
+ width: null
573
+ }]));
574
+ }
575
+
576
+ case "SET_EXPANDING_LINE_WIDTH":
577
+ {
578
+ var _getRegion19 = getRegion(state.mode.regionId),
579
+ _getRegion20 = _slicedToArray(_getRegion19, 2),
580
+ _expandingLine3 = _getRegion20[0],
581
+ _regionIndex14 = _getRegion20[1];
582
+
583
+ if (!_expandingLine3) break;
584
+ var expandingWidth = _expandingLine3.expandingWidth;
585
+ return state.setIn([].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex14]), convertExpandingLineToPolygon(_objectSpread({}, _expandingLine3, {
586
+ points: _expandingLine3.points.map(function (p) {
587
+ return p.width ? p : _objectSpread({}, p, {
588
+ width: expandingWidth
589
+ });
590
+ }),
591
+ expandingWidth: undefined
592
+ }))).setIn(["mode"], null);
593
+ }
594
+
595
+ default:
596
+ break;
597
+ }
598
+ }
599
+
600
+ var newRegion;
601
+ var defaultRegionCls = state.selectedCls,
602
+ defaultRegionColor = "#e45b21"; // customize color
603
+
604
+ var _clsIndex = (state.regionClsList || []).indexOf(defaultRegionCls);
605
+
606
+ if (_clsIndex !== -1) {
607
+ defaultRegionColor = colors[_clsIndex % colors.length];
608
+ }
609
+
610
+ switch (state.selectedTool) {
611
+ case "create-point":
612
+ {
613
+ state = saveToHistory(state, "Create Point");
614
+ newRegion = {
615
+ type: "point",
616
+ x: _x,
617
+ y: _y,
618
+ highlighted: true,
619
+ editingLabels: true,
620
+ color: defaultRegionColor,
621
+ id: getRandomId(),
622
+ cls: defaultRegionCls
623
+ };
624
+ break;
625
+ }
626
+
627
+ case "create-box":
628
+ {
629
+ state = saveToHistory(state, "Create Box");
630
+ newRegion = {
631
+ type: "box",
632
+ x: _x,
633
+ y: _y,
634
+ w: 0,
635
+ h: 0,
636
+ highlighted: true,
637
+ editingLabels: false,
638
+ color: defaultRegionColor,
639
+ cls: defaultRegionCls,
640
+ id: getRandomId()
641
+ };
642
+ state = setIn(state, ["mode"], {
643
+ mode: "RESIZE_BOX",
644
+ editLabelEditorAfter: true,
645
+ regionId: newRegion.id,
646
+ freedom: [1, 1],
647
+ original: {
648
+ x: _x,
649
+ y: _y,
650
+ w: newRegion.w,
651
+ h: newRegion.h
652
+ },
653
+ isNew: true
654
+ });
655
+ break;
656
+ }
657
+
658
+ case "create-polygon":
659
+ {
660
+ if (state.mode && state.mode.mode === "DRAW_POLYGON") break;
661
+ state = saveToHistory(state, "Create Polygon");
662
+ newRegion = {
663
+ type: "polygon",
664
+ points: [[_x, _y], [_x, _y]],
665
+ open: true,
666
+ highlighted: true,
667
+ color: defaultRegionColor,
668
+ cls: defaultRegionCls,
669
+ id: getRandomId()
670
+ };
671
+ state = setIn(state, ["mode"], {
672
+ mode: "DRAW_POLYGON",
673
+ regionId: newRegion.id
674
+ });
675
+ break;
676
+ }
677
+
678
+ case "create-expanding-line":
679
+ {
680
+ state = saveToHistory(state, "Create Expanding Line");
681
+ newRegion = {
682
+ type: "expanding-line",
683
+ unfinished: true,
684
+ points: [{
685
+ x: _x,
686
+ y: _y,
687
+ angle: null,
688
+ width: null
689
+ }],
690
+ open: true,
691
+ highlighted: true,
692
+ color: defaultRegionColor,
693
+ cls: defaultRegionCls,
694
+ id: getRandomId()
695
+ };
696
+ state = setIn(state, ["mode"], {
697
+ mode: "DRAW_EXPANDING_LINE",
698
+ regionId: newRegion.id
699
+ });
700
+ break;
701
+ }
702
+
703
+ case "create-line":
704
+ {
705
+ if (state.mode && state.mode.mode === "DRAW_LINE") break;
706
+ state = saveToHistory(state, "Create Line");
707
+ newRegion = {
708
+ type: "line",
709
+ x1: _x,
710
+ y1: _y,
711
+ x2: _x,
712
+ y2: _y,
713
+ highlighted: true,
714
+ editingLabels: false,
715
+ color: defaultRegionColor,
716
+ cls: defaultRegionCls,
717
+ id: getRandomId()
718
+ };
719
+ state = setIn(state, ["mode"], {
720
+ mode: "DRAW_LINE",
721
+ regionId: newRegion.id
722
+ });
723
+ break;
724
+ }
725
+
726
+ case "create-keypoints":
727
+ {
728
+ state = saveToHistory(state, "Create Keypoints");
729
+
730
+ var _ref2 = Object.entries(state.keypointDefinitions),
731
+ _ref3 = _slicedToArray(_ref2, 1),
732
+ _ref3$ = _slicedToArray(_ref3[0], 2),
733
+ keypointsDefinitionId = _ref3$[0],
734
+ _ref3$$ = _ref3$[1],
735
+ _landmarks = _ref3$$.landmarks,
736
+ connections = _ref3$$.connections;
737
+
738
+ newRegion = {
739
+ type: "keypoints",
740
+ keypointsDefinitionId: keypointsDefinitionId,
741
+ points: getLandmarksWithTransform({
742
+ landmarks: _landmarks,
743
+ center: {
744
+ x: _x,
745
+ y: _y
746
+ },
747
+ scale: 1
748
+ }),
749
+ highlighted: true,
750
+ editingLabels: false,
751
+ id: getRandomId()
752
+ };
753
+ state = setIn(state, ["mode"], {
754
+ mode: "RESIZE_KEYPOINTS",
755
+ landmarks: _landmarks,
756
+ centerX: _x,
757
+ centerY: _y,
758
+ regionId: newRegion.id,
759
+ isNew: true
760
+ });
761
+ break;
762
+ }
763
+
764
+ default:
765
+ break;
766
+ }
767
+
768
+ if ( // customize create only one annotation
769
+ (_getIn$regions = getIn(state, pathToActiveImage).regions[getIn(state, pathToActiveImage).regions.length - 1]) === null || _getIn$regions === void 0 ? void 0 : _getIn$regions.isNew) {
770
+ var _regions = _toConsumableArray(getIn(state, pathToActiveImage).regions || []);
771
+
772
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions);
773
+ } else {
774
+ state.onCreateAnno(newRegion); // customize
775
+
776
+ var _regions2 = _toConsumableArray(getIn(state, pathToActiveImage).regions || []).map(function (r) {
777
+ return setIn(r, ["editingLabels"], false).setIn(["highlighted"], false);
778
+ }).concat(newRegion ? [_objectSpread({}, newRegion, {
779
+ isNew: true
780
+ })] : []);
781
+
782
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions2);
783
+ }
784
+ }
785
+
786
+ case "MOUSE_UP":
787
+ {
788
+ var _x2 = action.x,
789
+ _y2 = action.y;
790
+
791
+ var _state4 = state,
792
+ _state4$mouseDownAt = _state4.mouseDownAt,
793
+ _mouseDownAt2 = _state4$mouseDownAt === void 0 ? {
794
+ x: _x2,
795
+ y: _y2
796
+ } : _state4$mouseDownAt;
797
+
798
+ if (!state.mode) return state;
799
+ state = setIn(state, ["mouseDownAt"], null);
800
+
801
+ switch (state.mode.mode) {
802
+ case "RESIZE_BOX":
803
+ {
804
+ if (state.mode.isNew) {
805
+ if (Math.abs(state.mode.original.x - _x2) < 0.002 || Math.abs(state.mode.original.y - _y2) < 0.002) {
806
+ return setIn(modifyRegion(state.mode.regionId, null), ["mode"], null);
807
+ }
808
+ }
809
+
810
+ if (state.mode.editLabelEditorAfter) {
811
+ return _objectSpread({}, modifyRegion(state.mode.regionId, {
812
+ editingLabels: true
813
+ }), {
814
+ mode: null
815
+ });
816
+ }
817
+ }
818
+
819
+ case "MOVE_REGION":
820
+ case "RESIZE_KEYPOINTS":
821
+ case "MOVE_POLYGON_POINT":
822
+ {
823
+ return _objectSpread({}, state, {
824
+ mode: null
825
+ });
826
+ }
827
+
828
+ case "MOVE_KEYPOINT":
829
+ {
830
+ return _objectSpread({}, state, {
831
+ mode: null
832
+ });
833
+ }
834
+
835
+ case "CREATE_POINT_LINE":
836
+ {
837
+ return state;
838
+ }
839
+
840
+ case "DRAW_EXPANDING_LINE":
841
+ {
842
+ var _getRegion21 = getRegion(state.mode.regionId),
843
+ _getRegion22 = _slicedToArray(_getRegion21, 2),
844
+ _expandingLine4 = _getRegion22[0],
845
+ _regionIndex15 = _getRegion22[1];
846
+
847
+ if (!_expandingLine4) return state;
848
+ var newExpandingLine = _expandingLine4;
849
+
850
+ var _lastPoint3 = _expandingLine4.points.length !== 0 ? _expandingLine4.points.slice(-1)[0] : _mouseDownAt2;
851
+
852
+ var jointStart;
853
+
854
+ if (_expandingLine4.points.length > 1) {
855
+ jointStart = _expandingLine4.points.slice(-2)[0];
856
+ } else {
857
+ jointStart = _lastPoint3;
858
+ }
859
+
860
+ var _mouseDistFromLastPoint = Math.sqrt(Math.pow(_lastPoint3.x - _x2, 2) + Math.pow(_lastPoint3.y - _y2, 2));
861
+
862
+ if (_mouseDistFromLastPoint > 0.002) {
863
+ // The user is drawing has drawn the width for the last point
864
+ var newPoints = _toConsumableArray(_expandingLine4.points);
865
+
866
+ for (var i = 0; i < newPoints.length - 1; i++) {
867
+ if (newPoints[i].width) continue;
868
+ newPoints[i] = _objectSpread({}, newPoints[i], {
869
+ width: _lastPoint3.width
870
+ });
871
+ }
872
+
873
+ newExpandingLine = setIn(_expandingLine4, ["points"], fixTwisted(newPoints));
874
+ } else {
875
+ return state;
876
+ }
877
+
878
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex15]), newExpandingLine);
879
+ }
880
+
881
+ default:
882
+ return state;
883
+ }
884
+ }
885
+
886
+ case "OPEN_REGION_EDITOR":
887
+ {
888
+ var _region5 = action.region;
889
+
890
+ var _regionIndex16 = getRegionIndex(action.region);
891
+
892
+ if (_regionIndex16 === null) return state;
893
+ var newRegions = setIn(activeImage.regions.map(function (r) {
894
+ return _objectSpread({}, r, {
895
+ highlighted: false,
896
+ editingLabels: false
897
+ });
898
+ }), [_regionIndex16], _objectSpread({}, (activeImage.regions || [])[_regionIndex16], {
899
+ highlighted: true,
900
+ editingLabels: true
901
+ }));
902
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), newRegions);
903
+ }
904
+
905
+ case "CLOSE_REGION_EDITOR":
906
+ {
907
+ var _region6 = action.region;
908
+
909
+ var _regionIndex17 = getRegionIndex(action.region);
910
+
911
+ if (_regionIndex17 === null) return state;
912
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex17]), _objectSpread({}, (activeImage.regions || [])[_regionIndex17], {
913
+ editingLabels: false
914
+ }));
915
+ }
916
+
917
+ case "DELETE_REGION":
918
+ {
919
+ var _regionIndex18 = getRegionIndex(action.region);
920
+
921
+ if (_regionIndex18 === null) return state;
922
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
923
+ return r.id !== action.region.id;
924
+ }));
925
+ }
926
+
927
+ case "DELETE_SELECTED_REGION":
928
+ {
929
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
930
+ return !r.highlighted;
931
+ }));
932
+ }
933
+
934
+ case "HEADER_BUTTON_CLICKED":
935
+ {
936
+ var buttonName = action.buttonName.toLowerCase();
937
+
938
+ switch (buttonName) {
939
+ case "prev":
940
+ {
941
+ if (currentImageIndex === null) return state;
942
+ if (currentImageIndex === 0) return state;
943
+ return setNewImage(state.images[currentImageIndex - 1], currentImageIndex - 1);
944
+ }
945
+
946
+ case "next":
947
+ {
948
+ if (currentImageIndex === null) return state;
949
+ if (currentImageIndex === state.images.length - 1) return state;
950
+ return setNewImage(state.images[currentImageIndex + 1], currentImageIndex + 1);
951
+ }
952
+
953
+ case "clone":
954
+ {
955
+ if (currentImageIndex === null) return state;
956
+ if (currentImageIndex === state.images.length - 1) return state;
957
+ return setIn(setNewImage(state.images[currentImageIndex + 1], currentImageIndex + 1), ["images", currentImageIndex + 1, "regions"], activeImage.regions);
958
+ }
959
+
960
+ case "settings":
961
+ {
962
+ return setIn(state, ["settingsOpen"], !state.settingsOpen);
963
+ }
964
+
965
+ case "help":
966
+ {
967
+ return state;
968
+ }
969
+
970
+ case "fullscreen":
971
+ {
972
+ return setIn(state, ["fullScreen"], true);
973
+ }
974
+
975
+ case "exit fullscreen":
976
+ case "window":
977
+ {
978
+ return setIn(state, ["fullScreen"], false);
979
+ }
980
+
981
+ case "hotkeys":
982
+ {
983
+ return state;
984
+ }
985
+
986
+ case "exit":
987
+ case "done":
988
+ {
989
+ return state;
990
+ }
991
+
992
+ default:
993
+ return state;
994
+ }
995
+ }
996
+
997
+ case "SELECT_TOOL":
998
+ {
999
+ if (action.selectedTool === "show-tags") {
1000
+ setInLocalStorage("showTags", !state.showTags);
1001
+ return setIn(state, ["showTags"], !state.showTags);
1002
+ } else if (action.selectedTool === "show-mask") {
1003
+ return setIn(state, ["showMask"], !state.showMask);
1004
+ }
1005
+
1006
+ if (action.selectedTool === "modify-allowed-area" && !state.allowedArea) {
1007
+ state = setIn(state, ["allowedArea"], {
1008
+ x: 0,
1009
+ y: 0,
1010
+ w: 1,
1011
+ h: 1
1012
+ });
1013
+ }
1014
+
1015
+ state = setIn(state, ["mode"], null);
1016
+ return setIn(state, ["selectedTool"], action.selectedTool);
1017
+ }
1018
+
1019
+ case "CANCEL":
1020
+ {
1021
+ var _state5 = state,
1022
+ mode = _state5.mode;
1023
+
1024
+ if (mode) {
1025
+ switch (mode.mode) {
1026
+ case "DRAW_EXPANDING_LINE":
1027
+ case "SET_EXPANDING_LINE_WIDTH":
1028
+ case "DRAW_POLYGON":
1029
+ {
1030
+ var _regionId9 = mode.regionId;
1031
+ return modifyRegion(_regionId9, null);
1032
+ }
1033
+
1034
+ case "MOVE_POLYGON_POINT":
1035
+ case "RESIZE_BOX":
1036
+ case "MOVE_REGION":
1037
+ {
1038
+ return setIn(state, ["mode"], null);
1039
+ }
1040
+
1041
+ default:
1042
+ return state;
1043
+ }
1044
+ } // Close any open boxes
1045
+
1046
+
1047
+ var _regions3 = activeImage.regions;
1048
+
1049
+ if (_regions3 && _regions3.some(function (r) {
1050
+ return r.editingLabels;
1051
+ })) {
1052
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions3.map(function (r) {
1053
+ return _objectSpread({}, r, {
1054
+ editingLabels: false
1055
+ });
1056
+ }));
1057
+ } else if (_regions3) {
1058
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions3.map(function (r) {
1059
+ return _objectSpread({}, r, {
1060
+ highlighted: false
1061
+ });
1062
+ }));
1063
+ }
1064
+
1065
+ break;
1066
+ }
1067
+
1068
+ default:
1069
+ break;
1070
+ }
1071
+
1072
+ return state;
1073
+ });