lost-sia 1.3.0 → 2.0.0-alpha1

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 (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -0
  3. package/package.json +60 -47
  4. package/src/AnnoExampleViewer.jsx +57 -0
  5. package/src/AnnoLabelInput.jsx +99 -0
  6. package/src/AnnoToolBar.jsx +132 -0
  7. package/src/Annotation/AnnoBar.jsx +148 -0
  8. package/src/Annotation/Annotation.jsx +358 -0
  9. package/src/Annotation/Annotation.scss +47 -0
  10. package/src/Annotation/BBox.jsx +291 -0
  11. package/src/Annotation/Edge.jsx +82 -0
  12. package/src/Annotation/InfSelectionArea.jsx +71 -0
  13. package/src/Annotation/Line.jsx +60 -0
  14. package/src/Annotation/Node.jsx +278 -0
  15. package/src/Annotation/Point.jsx +196 -0
  16. package/src/Annotation/Polygon.jsx +361 -0
  17. package/src/Canvas.jsx +1843 -0
  18. package/src/ImgBar.jsx +123 -0
  19. package/src/InfoBoxes/AnnoDetails.jsx +166 -0
  20. package/src/InfoBoxes/AnnoStats.jsx +104 -0
  21. package/src/InfoBoxes/InfoBox.jsx +78 -0
  22. package/src/InfoBoxes/InfoBoxArea.jsx +155 -0
  23. package/src/InfoBoxes/LabelInfo.jsx +95 -0
  24. package/src/LabelInput.jsx +224 -0
  25. package/src/Prompt.jsx +46 -0
  26. package/src/SIA.scss +10 -0
  27. package/src/SIAFilterButton.jsx +178 -0
  28. package/src/SIASettingButton.jsx +122 -0
  29. package/src/Sia.jsx +491 -0
  30. package/src/SiaPopup.jsx +10 -0
  31. package/src/ToolBar.jsx +399 -0
  32. package/src/Toolbar.css +13 -0
  33. package/src/ToolbarItem.jsx +25 -0
  34. package/src/filterTools.js +3 -0
  35. package/src/index.js +16 -0
  36. package/src/siaDummyData.js +265 -0
  37. package/src/style.scss +3 -0
  38. package/src/test.js +7 -0
  39. package/src/types/annoStatus.js +4 -0
  40. package/src/types/canvasActions.js +57 -0
  41. package/src/types/cursorstyles.js +3 -0
  42. package/src/types/modes.js +8 -0
  43. package/src/types/notificationType.js +4 -0
  44. package/src/types/toolbarEvents.js +33 -0
  45. package/src/types/tools.js +11 -0
  46. package/src/utils/annoConversion.js +115 -0
  47. package/src/utils/colorlut.js +67 -0
  48. package/src/utils/constraints.js +75 -0
  49. package/src/utils/hist.js +67 -0
  50. package/src/utils/keyActions.js +107 -0
  51. package/src/utils/mouse.js +14 -0
  52. package/src/utils/siaIcons.jsx +95 -0
  53. package/src/utils/transform.js +318 -0
  54. package/src/utils/uiConfig.js +57 -0
  55. package/src/utils/windowViewport.js +35 -0
  56. package/CHANGELOG.md +0 -169
  57. package/dist/index.css +0 -24823
  58. package/dist/index.es.js +0 -10482
  59. package/dist/index.es.js.map +0 -1
  60. package/dist/index.js +0 -10497
  61. package/dist/index.js.map +0 -1
@@ -0,0 +1,361 @@
1
+ import React, {Component} from 'react'
2
+
3
+ import Edge from './Edge'
4
+ import Node from './Node'
5
+ import InfSelectionArea from './InfSelectionArea'
6
+
7
+ import * as transform from '../utils/transform'
8
+ import * as canvasActions from '../types/canvasActions'
9
+
10
+ import './Annotation.scss'
11
+ import * as modes from '../types/modes'
12
+ import * as mouse from '../utils/mouse'
13
+
14
+
15
+ class Polygon extends Component{
16
+
17
+ /*************
18
+ * LIFECYCLE *
19
+ **************/
20
+ constructor(props){
21
+ super(props)
22
+ this.state = {
23
+ anno: undefined,
24
+ }
25
+ }
26
+
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
+ }
45
+
46
+ componentDidUpdate(prevProps){
47
+ if (prevProps.anno !== this.props.anno){
48
+ this.setState({anno: {...this.props.anno}})
49
+ }
50
+ }
51
+
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
+ }
67
+ }
68
+
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
+ }
80
+ }
81
+
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
+ }
94
+ }
95
+ /**************
96
+ * NODE EVENTS *
97
+ ***************/
98
+
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
+ }
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
141
+ }
142
+ }
143
+
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
+ }
156
+ }
157
+
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
+ }
184
+ }
185
+
186
+ /*************
187
+ * LOGIC *
188
+ *************/
189
+ performedAction(anno, pAction){
190
+ if (this.props.onAction){
191
+ this.props.onAction(anno, pAction)
192
+ }
193
+ }
194
+
195
+ toPolygonStr(data){
196
+ return data.map( (e => {
197
+ return `${e.x},${e.y}`
198
+ })).join(' ')
199
+
200
+ }
201
+
202
+ requestModeChange(anno, mode){
203
+ this.props.onModeChangeRequest(anno, mode)
204
+ }
205
+
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
+ }
213
+
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
+ }
227
+
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
+ }
238
+
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
+ }
251
+
252
+ getResult(){
253
+ return this.state.anno
254
+ }
255
+
256
+ /*************
257
+ * RENDERING *
258
+ **************/
259
+
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
+ }
294
+
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
+ }
320
+ }
321
+
322
+ renderPolygon(){
323
+ return <polygon points={this.toPolygonStr(this.state.anno.data)}
324
+ fill='none' stroke="purple"
325
+ style={this.props.style}
326
+ className={this.props.className}
327
+ />
328
+ }
329
+
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
+ }
339
+ }
340
+
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
+ }
358
+ }
359
+ }
360
+
361
+ export default Polygon;