lost-sia 2.0.0-alpha0 → 2.0.0-alpha2

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 (87) hide show
  1. package/package.json +20 -3
  2. package/src/AnnoExampleViewer.jsx +61 -48
  3. package/src/AnnoLabelInput.jsx +94 -84
  4. package/src/AnnoToolBar.jsx +118 -97
  5. package/src/Annotation/AnnoBar.jsx +137 -131
  6. package/src/Annotation/Annotation.jsx +364 -328
  7. package/src/Annotation/Annotation.scss +24 -24
  8. package/src/Annotation/BBox.jsx +259 -251
  9. package/src/Annotation/Edge.jsx +79 -69
  10. package/src/Annotation/InfSelectionArea.jsx +56 -55
  11. package/src/Annotation/Line.jsx +60 -52
  12. package/src/Annotation/Node.jsx +242 -238
  13. package/src/Annotation/Point.jsx +175 -171
  14. package/src/Annotation/Polygon.jsx +337 -310
  15. package/src/Canvas.jsx +1910 -1720
  16. package/src/ImgBar.jsx +115 -107
  17. package/src/InfoBoxes/AnnoDetails.jsx +141 -141
  18. package/src/InfoBoxes/AnnoStats.jsx +90 -87
  19. package/src/InfoBoxes/InfoBox.jsx +63 -65
  20. package/src/InfoBoxes/InfoBoxArea.jsx +132 -130
  21. package/src/InfoBoxes/LabelInfo.jsx +103 -83
  22. package/src/LabelInput.jsx +204 -190
  23. package/src/Prompt.jsx +37 -38
  24. package/src/SIA.scss +8 -9
  25. package/src/SIAFilterButton.jsx +178 -169
  26. package/src/SIASettingButton.jsx +112 -107
  27. package/src/Sia.jsx +272 -285
  28. package/src/SiaPopup.jsx +13 -8
  29. package/src/ToolBar.jsx +394 -375
  30. package/src/Toolbar.css +8 -8
  31. package/src/ToolbarItem.jsx +28 -22
  32. package/src/filterTools.js +3 -3
  33. package/src/index.js +9 -11
  34. package/src/scss/_custom.scss +3 -0
  35. package/src/scss/_fixes.scss +6 -0
  36. package/src/scss/_layout.scss +6 -0
  37. package/src/scss/_variables.scss +4 -0
  38. package/src/scss/style-wrapper.scss +4 -0
  39. package/src/scss/style.scss +13 -0
  40. package/src/siaDummyData.js +241 -243
  41. package/src/stories/Button.jsx +54 -0
  42. package/src/stories/Button.stories.js +48 -0
  43. package/src/stories/Configure.mdx +369 -0
  44. package/src/stories/Header.jsx +69 -0
  45. package/src/stories/Header.stories.js +28 -0
  46. package/src/stories/Page.jsx +87 -0
  47. package/src/stories/Page.stories.js +28 -0
  48. package/src/stories/Sia.stories.jsx +61 -0
  49. package/src/stories/assets/accessibility.png +0 -0
  50. package/src/stories/assets/accessibility.svg +5 -0
  51. package/src/stories/assets/addon-library.png +0 -0
  52. package/src/stories/assets/assets.png +0 -0
  53. package/src/stories/assets/avif-test-image.avif +0 -0
  54. package/src/stories/assets/context.png +0 -0
  55. package/src/stories/assets/discord.svg +15 -0
  56. package/src/stories/assets/docs.png +0 -0
  57. package/src/stories/assets/figma-plugin.png +0 -0
  58. package/src/stories/assets/github.svg +3 -0
  59. package/src/stories/assets/share.png +0 -0
  60. package/src/stories/assets/styling.png +0 -0
  61. package/src/stories/assets/testing.png +0 -0
  62. package/src/stories/assets/theming.png +0 -0
  63. package/src/stories/assets/tutorials.svg +12 -0
  64. package/src/stories/assets/youtube.svg +4 -0
  65. package/src/stories/button.css +30 -0
  66. package/src/stories/header.css +32 -0
  67. package/src/stories/lost.js +54 -0
  68. package/src/stories/page.css +69 -0
  69. package/src/stories/siaDummyData.js +263 -0
  70. package/src/stories/store.js +18 -0
  71. package/src/types/annoStatus.js +4 -4
  72. package/src/types/canvasActions.js +51 -51
  73. package/src/types/cursorstyles.js +3 -3
  74. package/src/types/modes.js +8 -8
  75. package/src/types/notificationType.js +4 -4
  76. package/src/types/toolbarEvents.js +31 -31
  77. package/src/types/tools.js +9 -9
  78. package/src/utils/annoConversion.js +129 -99
  79. package/src/utils/colorlut.js +33 -32
  80. package/src/utils/constraints.js +76 -70
  81. package/src/utils/hist.js +52 -53
  82. package/src/utils/keyActions.js +96 -97
  83. package/src/utils/mouse.js +10 -10
  84. package/src/utils/siaIcons.jsx +106 -67
  85. package/src/utils/transform.js +259 -241
  86. package/src/utils/uiConfig.js +45 -45
  87. package/src/utils/windowViewport.js +26 -27
@@ -1,361 +1,388 @@
1
- import React, {Component} from 'react'
1
+ import React, { Component } from "react";
2
2
 
3
- import Edge from './Edge'
4
- import Node from './Node'
5
- import InfSelectionArea from './InfSelectionArea'
3
+ import Edge from "./Edge";
4
+ import Node from "./Node";
5
+ import InfSelectionArea from "./InfSelectionArea";
6
6
 
7
- import * as transform from '../utils/transform'
8
- import * as canvasActions from '../types/canvasActions'
7
+ import * as transform from "../utils/transform";
8
+ import * as canvasActions from "../types/canvasActions";
9
9
 
10
- import './Annotation.scss'
11
- import * as modes from '../types/modes'
12
- import * as mouse from '../utils/mouse'
10
+ import "./Annotation.scss";
11
+ import * as modes from "../types/modes";
12
+ import * as mouse from "../utils/mouse";
13
13
 
14
+ class Polygon extends Component {
15
+ /*************
16
+ * LIFECYCLE *
17
+ **************/
18
+ constructor(props) {
19
+ super(props);
20
+ this.state = {
21
+ anno: undefined,
22
+ };
23
+ }
14
24
 
15
- class Polygon extends Component{
16
-
17
- /*************
18
- * LIFECYCLE *
19
- **************/
20
- constructor(props){
21
- super(props)
22
- this.state = {
23
- anno: undefined,
24
- }
25
+ componentDidMount() {
26
+ if (this.props.anno.mode === modes.CREATE) {
27
+ const data = this.props.anno.data[0];
28
+ const newAnno = {
29
+ ...this.props.anno,
30
+ data: [
31
+ { x: data.x, y: data.y },
32
+ { x: data.x + 1, y: data.y },
33
+ ],
34
+ selectedNode: 1,
35
+ };
36
+ this.setState({
37
+ anno: newAnno,
38
+ });
39
+ } else {
40
+ this.setState({ anno: { ...this.props.anno } });
25
41
  }
42
+ }
26
43
 
27
- componentDidMount(){
28
- if (this.props.anno.mode === modes.CREATE){
29
- const data = this.props.anno.data[0]
30
- const newAnno = {
31
- ...this.props.anno,
32
- data: [
33
- {x: data.x, y: data.y},
34
- {x: data.x+1, y: data.y},
35
- ],
36
- selectedNode: 1
37
- }
38
- this.setState({
39
- anno: newAnno
40
- })
41
- } else {
42
- this.setState({anno: {...this.props.anno}})
43
- }
44
+ componentDidUpdate(prevProps) {
45
+ if (prevProps.anno !== this.props.anno) {
46
+ this.setState({ anno: { ...this.props.anno } });
44
47
  }
48
+ }
45
49
 
46
- componentDidUpdate(prevProps){
47
- if (prevProps.anno !== this.props.anno){
48
- this.setState({anno: {...this.props.anno}})
49
- }
50
+ /**************
51
+ * ANNO EVENTS *
52
+ ***************/
53
+ onMouseMove(e) {
54
+ switch (this.state.anno.mode) {
55
+ case modes.MOVE:
56
+ this.move(
57
+ e.movementX / this.props.svg.scale,
58
+ e.movementY / this.props.svg.scale,
59
+ );
60
+ break;
61
+ default:
62
+ break;
50
63
  }
64
+ }
51
65
 
52
-
53
- /**************
54
- * ANNO EVENTS *
55
- ***************/
56
- onMouseMove(e){
57
- switch (this.state.anno.mode){
58
- case modes.MOVE:
59
- this.move(
60
- e.movementX/this.props.svg.scale,
61
- e.movementY/this.props.svg.scale
62
- )
63
- break
64
- default:
65
- break
66
+ onMouseUp(e) {
67
+ switch (this.state.anno.mode) {
68
+ case modes.MOVE:
69
+ if (e.button === 0) {
70
+ this.performedAction(this.state.anno, canvasActions.ANNO_MOVED);
71
+ this.requestModeChange(this.state.anno, modes.VIEW);
66
72
  }
73
+ break;
74
+ default:
75
+ break;
67
76
  }
77
+ }
68
78
 
69
- onMouseUp(e){
70
- switch (this.state.anno.mode){
71
- case modes.MOVE:
72
- if (e.button === 0){
73
- this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)
74
- this.requestModeChange(this.state.anno, modes.VIEW)
75
- }
76
- break
77
- default:
78
- break
79
+ onMouseDown(e) {
80
+ switch (this.state.anno.mode) {
81
+ case modes.VIEW:
82
+ if (e.button === 0) {
83
+ if (this.props.isSelected) {
84
+ this.requestModeChange(this.state.anno, modes.MOVE);
85
+ }
79
86
  }
87
+ break;
88
+ default:
89
+ break;
80
90
  }
91
+ }
92
+ /**************
93
+ * NODE EVENTS *
94
+ ***************/
81
95
 
82
- onMouseDown(e){
83
- switch (this.state.anno.mode){
84
- case modes.VIEW:
85
- if (e.button === 0){
86
- if (this.props.isSelected){
87
- this.requestModeChange(this.state.anno, modes.MOVE)
88
- }
89
- }
90
- break
91
- default:
92
- break
93
- }
96
+ onNodeMouseUp(e, idx) {
97
+ switch (this.state.anno.mode) {
98
+ case modes.EDIT:
99
+ this.performedAction(this.state.anno, canvasActions.ANNO_EDITED);
100
+ this.requestModeChange(this.state.anno, modes.VIEW);
101
+ break;
102
+ default:
103
+ break;
94
104
  }
95
- /**************
96
- * NODE EVENTS *
97
- ***************/
105
+ }
98
106
 
99
- onNodeMouseUp(e, idx){
100
- switch (this.state.anno.mode){
101
- case modes.EDIT:
102
- this.performedAction(this.state.anno, canvasActions.ANNO_EDITED)
103
- this.requestModeChange(this.state.anno, modes.VIEW)
104
- break
105
- default:
106
- break
107
+ onNodeMouseDown(e, idx) {
108
+ switch (this.state.anno.mode) {
109
+ case modes.CREATE:
110
+ if (e.button === 2) {
111
+ let newAnnoData = [...this.state.anno.data];
112
+ newAnnoData.push({
113
+ x: newAnnoData[idx].x,
114
+ y: newAnnoData[idx].y,
115
+ });
116
+ const newAnno = {
117
+ ...this.state.anno,
118
+ data: newAnnoData,
119
+ selectedNode: this.state.anno.selectedNode + 1,
120
+ };
121
+ this.setState({
122
+ anno: newAnno,
123
+ });
124
+ this.performedAction(newAnno, canvasActions.ANNO_CREATED_NODE);
107
125
  }
108
- }
109
-
110
- onNodeMouseDown(e,idx){
111
- switch (this.state.anno.mode){
112
- case modes.CREATE:
113
- if (e.button === 2){
114
- let newAnnoData = [...this.state.anno.data]
115
- newAnnoData.push({
116
- x: newAnnoData[idx].x,
117
- y: newAnnoData[idx].y
118
- })
119
- const newAnno = {
120
- ...this.state.anno,
121
- data: newAnnoData,
122
- selectedNode: this.state.anno.selectedNode + 1
123
- }
124
- this.setState({
125
- anno: newAnno
126
- })
127
- this.performedAction(newAnno,
128
- canvasActions.ANNO_CREATED_NODE)
129
- }
130
- break
131
- case modes.VIEW:
132
- if (e.button === 0){
133
- this.requestModeChange({
134
- ...this.state.anno,
135
- selectedNode: idx
136
- }, modes.EDIT)
137
- }
138
- break
139
- default:
140
- break
126
+ break;
127
+ case modes.VIEW:
128
+ if (e.button === 0) {
129
+ this.requestModeChange(
130
+ {
131
+ ...this.state.anno,
132
+ selectedNode: idx,
133
+ },
134
+ modes.EDIT,
135
+ );
141
136
  }
137
+ break;
138
+ default:
139
+ break;
142
140
  }
141
+ }
143
142
 
144
- onNodeMouseMove(e, idx){
145
- switch (this.state.anno.mode){
146
- case modes.CREATE:
147
- this.updateAnnoByMousePos(e, idx)
148
- break
149
- case modes.EDIT:
150
- e.stopPropagation()
151
- this.updateAnnoByMousePos(e, idx)
152
- break
153
- default:
154
- break
155
- }
143
+ onNodeMouseMove(e, idx) {
144
+ switch (this.state.anno.mode) {
145
+ case modes.CREATE:
146
+ this.updateAnnoByMousePos(e, idx);
147
+ break;
148
+ case modes.EDIT:
149
+ e.stopPropagation();
150
+ this.updateAnnoByMousePos(e, idx);
151
+ break;
152
+ default:
153
+ break;
156
154
  }
155
+ }
157
156
 
158
- onNodeDoubleClick(e, idx){
159
- switch (this.state.anno.mode){
160
- case modes.CREATE:
161
- this.performedAction(this.state.anno, canvasActions.ANNO_CREATED_FINAL_NODE)
162
- break
163
- default:
164
- break
165
- }
166
- }
167
-
168
- /**************
169
- * EDGE EVENTS *
170
- ***************/
171
- onEdgeMouseDown(e, idx){
172
- switch (this.state.anno.mode){
173
- case modes.ADD:
174
- this.addNode(e, idx)
175
- break
176
- case modes.VIEW:
177
- if (e.button === 0){
178
- this.requestModeChange(this.state.anno, modes.MOVE)
179
- }
180
- break
181
- default:
182
- break
183
- }
157
+ onNodeDoubleClick(e, idx) {
158
+ switch (this.state.anno.mode) {
159
+ case modes.CREATE:
160
+ this.performedAction(
161
+ this.state.anno,
162
+ canvasActions.ANNO_CREATED_FINAL_NODE,
163
+ );
164
+ break;
165
+ default:
166
+ break;
184
167
  }
168
+ }
185
169
 
186
- /*************
187
- * LOGIC *
188
- *************/
189
- performedAction(anno, pAction){
190
- if (this.props.onAction){
191
- this.props.onAction(anno, pAction)
170
+ /**************
171
+ * EDGE EVENTS *
172
+ ***************/
173
+ onEdgeMouseDown(e, idx) {
174
+ switch (this.state.anno.mode) {
175
+ case modes.ADD:
176
+ this.addNode(e, idx);
177
+ break;
178
+ case modes.VIEW:
179
+ if (e.button === 0) {
180
+ this.requestModeChange(this.state.anno, modes.MOVE);
192
181
  }
182
+ break;
183
+ default:
184
+ break;
193
185
  }
186
+ }
194
187
 
195
- toPolygonStr(data){
196
- return data.map( (e => {
197
- return `${e.x},${e.y}`
198
- })).join(' ')
199
-
188
+ /*************
189
+ * LOGIC *
190
+ *************/
191
+ performedAction(anno, pAction) {
192
+ if (this.props.onAction) {
193
+ this.props.onAction(anno, pAction);
200
194
  }
195
+ }
201
196
 
202
- requestModeChange(anno, mode){
203
- this.props.onModeChangeRequest(anno, mode)
204
- }
197
+ toPolygonStr(data) {
198
+ return data
199
+ .map((e) => {
200
+ return `${e.x},${e.y}`;
201
+ })
202
+ .join(" ");
203
+ }
205
204
 
206
- move(movementX, movementY){
207
- this.setState({
208
- anno : {...this.state.anno,
209
- data: transform.move(this.state.anno.data, movementX, movementY)
210
- }
211
- })
212
- }
205
+ requestModeChange(anno, mode) {
206
+ this.props.onModeChangeRequest(anno, mode);
207
+ }
213
208
 
214
- addNode(e, idx){
215
- const mPos = mouse.getMousePosition(e, this.props.svg)
216
- let newAnnoData = this.state.anno.data.slice(0,idx)
217
- newAnnoData.push(mPos)
218
- const oldRest = this.state.anno.data.slice(idx)
219
- const newAnno = {
220
- ...this.state.anno,
221
- data: newAnnoData.concat(oldRest)
222
- }
223
- this.setState({anno: newAnno
224
- })
225
- this.performedAction(newAnno, canvasActions.ANNO_ADDED_NODE)
226
- }
209
+ move(movementX, movementY) {
210
+ this.setState({
211
+ anno: {
212
+ ...this.state.anno,
213
+ data: transform.move(this.state.anno.data, movementX, movementY),
214
+ },
215
+ });
216
+ }
227
217
 
228
- removeLastNode(){
229
- const newAnno = {
230
- ...this.state.anno,
231
- data: [...this.state.anno.data.slice(0, this.state.anno.data.length-1)],
232
- selectedNode: this.state.anno.selectedNode - 1
233
- }
234
- this.setState({anno: newAnno
235
- })
236
- this.performedAction(newAnno, canvasActions.ANNO_REMOVED_NODE)
237
- }
218
+ addNode(e, idx) {
219
+ const mPos = mouse.getMousePosition(e, this.props.svg);
220
+ let newAnnoData = this.state.anno.data.slice(0, idx);
221
+ newAnnoData.push(mPos);
222
+ const oldRest = this.state.anno.data.slice(idx);
223
+ const newAnno = {
224
+ ...this.state.anno,
225
+ data: newAnnoData.concat(oldRest),
226
+ };
227
+ this.setState({ anno: newAnno });
228
+ this.performedAction(newAnno, canvasActions.ANNO_ADDED_NODE);
229
+ }
238
230
 
239
- updateAnnoByMousePos(e, idx){
240
- const mousePos = mouse.getMousePosition(e, this.props.svg)
241
- let newAnnoData = [...this.state.anno.data]
242
- newAnnoData[idx].x = mousePos.x
243
- newAnnoData[idx].y = mousePos.y
244
- this.setState({
245
- anno: {
246
- ...this.state.anno,
247
- data: newAnnoData
248
- }
249
- })
250
- }
231
+ removeLastNode() {
232
+ const newAnno = {
233
+ ...this.state.anno,
234
+ data: [...this.state.anno.data.slice(0, this.state.anno.data.length - 1)],
235
+ selectedNode: this.state.anno.selectedNode - 1,
236
+ };
237
+ this.setState({ anno: newAnno });
238
+ this.performedAction(newAnno, canvasActions.ANNO_REMOVED_NODE);
239
+ }
251
240
 
252
- getResult(){
253
- return this.state.anno
254
- }
241
+ updateAnnoByMousePos(e, idx) {
242
+ const mousePos = mouse.getMousePosition(e, this.props.svg);
243
+ let newAnnoData = [...this.state.anno.data];
244
+ newAnnoData[idx].x = mousePos.x;
245
+ newAnnoData[idx].y = mousePos.y;
246
+ this.setState({
247
+ anno: {
248
+ ...this.state.anno,
249
+ data: newAnnoData,
250
+ },
251
+ });
252
+ }
255
253
 
256
- /*************
257
- * RENDERING *
258
- **************/
254
+ getResult() {
255
+ return this.state.anno;
256
+ }
259
257
 
260
- renderNodes(){
261
- if (!this.props.isSelected) return null
262
- switch (this.state.anno.mode){
263
- case modes.MOVE:
264
- return null
265
- case modes.EDIT:
266
- case modes.CREATE:
267
- return <Node anno={this.state.anno.data} idx={this.state.anno.selectedNode}
268
- key={this.state.anno.selectedNode} style={this.props.style}
269
- className={this.props.className}
270
- isSelected={this.props.isSelected}
271
- mode={this.state.anno.mode}
272
- svg={this.props.svg}
273
- onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}
274
- onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}
275
- onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}
276
- onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}
277
- />
278
- default:
279
- return this.state.anno.data.map((e, idx) => {
280
- return <Node anno={this.state.anno.data} idx={idx}
281
- key={idx} style={this.props.style}
282
- className={this.props.className}
283
- isSelected={this.props.isSelected}
284
- mode={this.state.anno.mode}
285
- svg={this.props.svg}
286
- onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}
287
- onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}
288
- onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}
289
- onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}
290
- />
291
- })
292
- }
293
- }
258
+ /*************
259
+ * RENDERING *
260
+ **************/
294
261
 
295
- renderEdges(){
296
- if (!this.props.isSelected) return null
297
- switch (this.state.anno.mode){
298
- case modes.VIEW:
299
- case modes.ADD:
300
- let edges = this.state.anno.data.map((e, idx) => {
301
- return <Edge anno={this.state.anno.data}
302
- idx={idx} key={idx} style={this.props.style}
303
- className={this.props.className}
304
- isSelected={this.props.isSelected}
305
- onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}}
306
- />
307
- })
308
- edges.push(<Edge anno={this.state.anno.data}
309
- closingEdge={true} key={edges.length}
310
- idx={0}
311
- style={this.props.style}
312
- className={this.props.className}
313
- isSelected={this.props.isSelected}
314
- onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}}
315
- />)
316
- return edges
317
- default:
318
- return null
319
- }
262
+ renderNodes() {
263
+ if (!this.props.isSelected) return null;
264
+ switch (this.state.anno.mode) {
265
+ case modes.MOVE:
266
+ return null;
267
+ case modes.EDIT:
268
+ case modes.CREATE:
269
+ return (
270
+ <Node
271
+ anno={this.state.anno.data}
272
+ idx={this.state.anno.selectedNode}
273
+ key={this.state.anno.selectedNode}
274
+ style={this.props.style}
275
+ className={this.props.className}
276
+ isSelected={this.props.isSelected}
277
+ mode={this.state.anno.mode}
278
+ svg={this.props.svg}
279
+ onMouseDown={(e, idx) => this.onNodeMouseDown(e, idx)}
280
+ onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}
281
+ onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}
282
+ onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}
283
+ />
284
+ );
285
+ default:
286
+ return this.state.anno.data.map((e, idx) => {
287
+ return (
288
+ <Node
289
+ anno={this.state.anno.data}
290
+ idx={idx}
291
+ key={idx}
292
+ style={this.props.style}
293
+ className={this.props.className}
294
+ isSelected={this.props.isSelected}
295
+ mode={this.state.anno.mode}
296
+ svg={this.props.svg}
297
+ onMouseDown={(e, idx) => this.onNodeMouseDown(e, idx)}
298
+ onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}
299
+ onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}
300
+ onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}
301
+ />
302
+ );
303
+ });
320
304
  }
305
+ }
321
306
 
322
- renderPolygon(){
323
- return <polygon points={this.toPolygonStr(this.state.anno.data)}
324
- fill='none' stroke="purple"
307
+ renderEdges() {
308
+ if (!this.props.isSelected) return null;
309
+ switch (this.state.anno.mode) {
310
+ case modes.VIEW:
311
+ case modes.ADD:
312
+ let edges = this.state.anno.data.map((e, idx) => {
313
+ return (
314
+ <Edge
315
+ anno={this.state.anno.data}
316
+ idx={idx}
317
+ key={idx}
318
+ style={this.props.style}
319
+ className={this.props.className}
320
+ isSelected={this.props.isSelected}
321
+ onMouseDown={(e, idx) => {
322
+ this.onEdgeMouseDown(e, idx);
323
+ }}
324
+ />
325
+ );
326
+ });
327
+ edges.push(
328
+ <Edge
329
+ anno={this.state.anno.data}
330
+ closingEdge={true}
331
+ key={edges.length}
332
+ idx={0}
325
333
  style={this.props.style}
326
334
  className={this.props.className}
327
- />
335
+ isSelected={this.props.isSelected}
336
+ onMouseDown={(e, idx) => {
337
+ this.onEdgeMouseDown(e, idx);
338
+ }}
339
+ />,
340
+ );
341
+ return edges;
342
+ default:
343
+ return null;
328
344
  }
345
+ }
329
346
 
330
- renderInfSelectionArea(){
331
- switch (this.state.anno.mode){
332
- case modes.MOVE:
333
- return <InfSelectionArea enable={true}
334
- svg={this.props.svg}
335
- />
336
- default:
337
- return null
338
- }
347
+ renderPolygon() {
348
+ return (
349
+ <polygon
350
+ points={this.toPolygonStr(this.state.anno.data)}
351
+ fill="none"
352
+ stroke="purple"
353
+ style={this.props.style}
354
+ className={this.props.className}
355
+ />
356
+ );
357
+ }
358
+
359
+ renderInfSelectionArea() {
360
+ switch (this.state.anno.mode) {
361
+ case modes.MOVE:
362
+ return <InfSelectionArea enable={true} svg={this.props.svg} />;
363
+ default:
364
+ return null;
339
365
  }
366
+ }
340
367
 
341
- render(){
342
- if (this.state.anno){
343
- return (
344
- <g
345
- onMouseMove={e => this.onMouseMove(e)}
346
- onMouseUp={e => this.onMouseUp(e)}
347
- onMouseDown={e => this.onMouseDown(e)}
348
- >
349
- {this.renderPolygon()}
350
- {this.renderEdges()}
351
- {this.renderNodes()}
352
- {this.renderInfSelectionArea()}
353
- </g>
354
- )
355
- } else {
356
- return <g></g>
357
- }
368
+ render() {
369
+ if (this.state.anno) {
370
+ return (
371
+ <g
372
+ onMouseMove={(e) => this.onMouseMove(e)}
373
+ onMouseUp={(e) => this.onMouseUp(e)}
374
+ onMouseDown={(e) => this.onMouseDown(e)}
375
+ >
376
+ {this.renderPolygon()}
377
+ {this.renderEdges()}
378
+ {this.renderNodes()}
379
+ {this.renderInfSelectionArea()}
380
+ </g>
381
+ );
382
+ } else {
383
+ return <g></g>;
358
384
  }
385
+ }
359
386
  }
360
387
 
361
- export default Polygon;
388
+ export default Polygon;