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.
- package/Annotator/index.js +164 -0
- package/Annotator/reducers/combine-reducers.js +14 -0
- package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
- package/Annotator/reducers/fix-twisted.js +4 -0
- package/Annotator/reducers/general-reducer.js +1073 -0
- package/Annotator/reducers/get-active-image.js +27 -0
- package/Annotator/reducers/get-implied-video-regions.js +180 -0
- package/Annotator/reducers/history-handler.js +38 -0
- package/Annotator/reducers/image-reducer.js +20 -0
- package/Annotator/reducers/video-reducer.js +88 -0
- package/ClassSelectionMenu/index.js +135 -0
- package/Crosshairs/index.js +53 -0
- package/DebugSidebarBox/index.js +20 -0
- package/DemoSite/Editor.js +194 -0
- package/DemoSite/ErrorBoundaryDialog.js +64 -0
- package/DemoSite/index.js +69 -0
- package/FullImageSegmentationAnnotator/index.js +7 -0
- package/HighlightBox/index.js +105 -0
- package/HistorySidebarBox/index.js +71 -0
- package/ImageCanvas/index.js +428 -0
- package/ImageCanvas/region-tools.js +165 -0
- package/ImageCanvas/styles.js +31 -0
- package/ImageCanvas/use-mouse.js +180 -0
- package/ImageCanvas/use-project-box.js +27 -0
- package/ImageCanvas/use-wasd-mode.js +62 -0
- package/ImageMask/index.js +133 -0
- package/ImageMask/load-image.js +25 -0
- package/ImageSelectorSidebarBox/index.js +60 -0
- package/KeyframeTimeline/get-time-string.js +27 -0
- package/KeyframeTimeline/index.js +233 -0
- package/KeyframesSelectorSidebarBox/index.js +93 -0
- package/LandingPage/index.js +159 -0
- package/MainLayout/icon-dictionary.js +104 -0
- package/MainLayout/index.js +359 -0
- package/MainLayout/styles.js +25 -0
- package/MainLayout/types.js +0 -0
- package/MainLayout/use-implied-video-regions.js +13 -0
- package/PointDistances/index.js +73 -0
- package/PreventScrollToParents/index.js +51 -0
- package/README.md +101 -0
- package/RegionLabel/index.js +197 -0
- package/RegionLabel/styles.js +48 -0
- package/RegionSelectAndTransformBoxes/index.js +166 -0
- package/RegionSelectorSidebarBox/index.js +248 -0
- package/RegionSelectorSidebarBox/styles.js +53 -0
- package/RegionShapes/index.js +275 -0
- package/RegionTags/index.js +138 -0
- package/SettingsDialog/index.js +52 -0
- package/SettingsProvider/index.js +53 -0
- package/Shortcuts/ShortcutField.js +46 -0
- package/Shortcuts/index.js +133 -0
- package/ShortcutsManager/index.js +155 -0
- package/Sidebar/index.js +69 -0
- package/SidebarBoxContainer/index.js +93 -0
- package/SmallToolButton/index.js +42 -0
- package/TagsSidebarBox/index.js +105 -0
- package/TaskDescriptionSidebarBox/index.js +58 -0
- package/Theme/index.js +30 -0
- package/VideoOrImageCanvasBackground/index.js +151 -0
- package/colors.js +14 -0
- package/hooks/use-event-callback.js +10 -0
- package/hooks/use-exclude-pattern.js +24 -0
- package/hooks/use-load-image.js +26 -0
- package/hooks/use-window-size.js +46 -0
- package/hooks/xpattern.js +1 -0
- package/index.js +3 -0
- package/lib.js +3 -0
- package/package.json +91 -0
- package/stories.js +5 -0
- package/utils/get-from-local-storage.js +7 -0
- package/utils/get-hotkey-help-text.js +9 -0
- package/utils/get-landmarks-with-transform.js +40 -0
- 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
|
+
});
|