lost-sia 0.5.2 → 0.9.0
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/CHANGELOG.md +23 -0
- package/dist/index.css +2 -2
- package/dist/index.es.js +241 -67
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +241 -67
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/utils/transform.js","../src/types/modes.js","../src/Annotation/AnnoBar.js","../src/Annotation/InfSelectionArea.js","../node_modules/style-inject/dist/style-inject.es.js","../src/types/cursorstyles.js","../src/Annotation/Node.js","../src/types/canvasActions.js","../src/Annotation/Point.js","../src/utils/mouse.js","../src/Annotation/BBox.js","../src/Annotation/Edge.js","../src/Annotation/Polygon.js","../src/Annotation/Line.js","../src/types/annoStatus.js","../src/utils/colorlut.js","../src/utils/constraints.js","../src/types/notificationType.js","../src/Annotation/Annotation.js","../src/LabelInput.js","../src/AnnoLabelInput.js","../src/ImgBar.js","../src/Prompt.js","../src/AnnoToolBar.js","../src/utils/annoConversion.js","../src/utils/keyActions.js","../src/types/tools.js","../src/utils/hist.js","../src/utils/windowViewport.js","../src/Canvas.js"],"sourcesContent":["export function toSia(data, image, type){\n switch(type) {\n case 'bBox':\n const w = image.width * data.w\n const h = image.height * data.h\n const x0 = image.width * data.x - w/2.0\n const y0 = image.height * data.y - h/2.0\n return [\n {\n x: x0,\n y: y0\n },\n {\n x: x0 + w,\n y: y0\n },\n {\n x: x0 + w,\n y: y0 + h\n },\n {\n x: x0,\n y: y0 + h\n }\n ]\n case 'point':\n return [{\n x: image.width * data.x,\n y: image.height * data.y\n }]\n case 'line':\n case 'polygon':\n return data.map((e) => {\n return {\n x: image.width * e.x,\n y: image.height * e.y\n }\n })\n default:\n \n }\n}\n\n/**\n * Transform a sia annotation to backend format.\n * \n * @param {Array} data Annotation data\n * @param {*} image Image object {width, height}\n * @param {String} type Type of the annotation bBox, point, line, polygon\n * @returns Annotation data in backend style (relative, centered)\n */\nexport function toBackend(data, image, type){\n switch(type) {\n case 'bBox':\n // const w = image.width * data.w\n // const h = image.height * data.h\n // const x0 = image.width * data.x - w/2.0\n // const y0 = image.height * data.y - h/2.0\n\n // console.error('GO On Here! w = max_x - min_x; h = max_y - min_y')\n const xList = data.map(e => {return e.x})\n const yList = data.map(e => {return e.y})\n const minX = Math.min(...xList)\n const maxX = Math.max(...xList)\n const minY = Math.min(...yList)\n const maxY = Math.max(...yList)\n const w = maxX - minX\n const h = maxY - minY\n const x = minX + w/2.0\n const y = minY + h/2.0\n return {\n x:x/image.width,\n y:y/image.height,\n w:w/image.width,\n h:h/image.height}\n case 'point':\n return {\n x: data[0].x/image.width,\n y: data[0].y/image.height\n }\n case 'line':\n case 'polygon':\n return data.map((e) => {\n return {\n x: e.x/ image.width,\n y: e.y/ image.height\n }\n })\n default:\n console.warn(\"Wrong annotation type!\")\n \n }\n}\n\nexport function getMinMaxPoints(data){\n const xList = data.map(e => {return e.x})\n const yList = data.map(e => {return e.y})\n const minPoint = {x:Math.min(...xList), y:Math.min(...yList)}\n const maxPoint = {x:Math.max(...xList), y:Math.max(...yList)}\n return [minPoint, maxPoint]\n}\n\n/**\n * Get area relative to the image \n * \n * @param {Array} data Annotation data\n * @param {*} scaledImg The scaled image object {width, height}\n * @param {String} type Type of the annotation bBox, point, line, polygon\n * @param {object} originalImg The original image\n * @returns Area relative\n */\nexport function getArea(data, scaledImg, type, originalImg){\n const relData = toBackend(data, scaledImg, type)\n switch(type) {\n case 'bBox':\n return Math.abs(relData.w*relData.h)* originalImg.width*originalImg.height\n // return relData.w*relData.h\n case 'line': \n case 'point':\n return undefined\n case 'polygon':\n let area = 0.0; // Accumulates area in the loop\n if (relData.length >2){\n let j = relData.length-1; // The last vertex is the 'previous' one to the first\n \n for (let i=0; i<relData.length; i++)\n { \n area = area + (relData[j].x+relData[i].x) * (relData[j].y-relData[i].y); \n j = i; //j is previous vertex to i\n }\n }\n return Math.abs(area/2) * originalImg.width*originalImg.height\n default:\n console.warn(\"Wrong annotation type!\")\n return undefined\n }\n}\n\nexport function move(data, movementX, movementY){\n return data.map(e => {\n return {\n x: e.x + movementX,\n y: e.y + movementY\n }\n })\n}\n\n\nexport function getBox(data, type){\n \n switch(type) {\n case 'bBox':\n return data\n case 'point':\n case 'line': \n case 'polygon':\n let maxX = 0\n let maxY = 0\n let minX = Infinity\n let minY = Infinity\n data.forEach(el => {\n if (el.x > maxX) maxX = el.x\n if (el.y > maxY) maxY = el.y\n if (el.x < minX) minX = el.x\n if (el.y < minY) minY = el.y\n })\n return [\n {x:minX, y:minY}, {x:maxX, y:minY},\n {x:minX, y:maxY}, {x:maxX, y:maxY}\n ]\n default:\n break\n \n }\n}\n\nexport function getCenter(data, type){\n let box = undefined\n switch(type) {\n case 'point':\n return data[0]\n case 'line':\n case 'polygon':\n case 'bBox':\n box = getBox(data, type)\n const w = box[1].x - box[0].x\n const h = box[3].y - box[0].y\n return {\n x: box[0].x + w/2.0,\n y: box[0].y + h/2.0\n } \n default:\n \n }\n}\n\n/**\n * Get point that is closest to the left browser side.\n * \n * @param {object} data list of points {x,y} \n * @returns {object} A list of point [{x,y}...]. Multiple points are\n * returned when multiple points have the same distance to the left side.\n */\nexport function getMostLeftPoint(data){\n let minX = Infinity\n let minXList = [] \n data.forEach(el => {\n if (el.x < minX){\n minX = el.x\n minXList = []\n minXList.push(el)\n } else if (el.x === minX) {\n minXList.push(el)\n }\n })\n return minXList\n}\n\n/**\n * Get point that is closest to the top of the browser.\n * \n * @param {object} data list of points {x,y} \n * @returns {object} A list of point [{x,y}...]. Multiple points are\n * returned when multiple points have the same distance to the top.\n */\nexport function getTopPoint(data){\n let minY = Infinity\n let minYList = [] \n data.forEach(el => {\n if (el.y < minY){\n minY = el.y\n minYList = []\n minYList.push(el)\n } else if (el.y === minY) {\n minYList.push(el)\n }\n })\n return minYList\n}\n\n/**\n * Check if all nodes of an annotation are within the image. If not,\n * correct the annotation\n * @param {object} data \n * @param {object} image \n */\nexport function correctAnnotation(data, image){\n const corrected = data.map(el => {\n let x = el.x\n let y = el.y\n if (el.x <= 0){\n x = 0\n } else if (el.x > image.width){\n x = image.width\n }\n if (el.y < 0){\n y = 0\n } else if (el.y > image.height){\n y = image.height\n }\n return {x:x,y:y}\n })\n return corrected\n}\n\n/**\n * Rotate annotation around center.\n * @param {*} data list of points {x:int,y:int} \n * @param {*} center Center to rotate point \n * @param {*} angle Rotation angle\n */\nexport function rotateAnnotation(data, center, angle){\n angle = (angle ) * (Math.PI/180); // Convert to radians\n const rotated = data.map(point => {\n return {\n x: Math.round(Math.cos(angle) * (point.x - center.x) - Math.sin(angle) * (point.y-center.y) + center.x),\n y: Math.round(Math.sin(angle) * (point.x - center.x) + Math.cos(angle) * (point.y - center.y) + center.y)\n }\n })\n return rotated;\n}\n\n/**\n * Resize annotation data in canvas format to new image size\n * @param {*} data Annotation data in canvas format [{x:int, y:int},...]\n * @param {*} sizeOld Size of old image {width:int, height:int}\n * @param {*} sizeNew Size of new image {width:int, height:int}\n */\nexport function resizeAnnoData(data, sizeOld, sizeNew){\n const xRatio = sizeNew.width / sizeOld.width\n const yRatio = sizeNew.height / sizeOld.height\n return data.map(e => {\n return {\n x: parseInt(e.x*xRatio),\n y: parseInt(e.y*yRatio)\n }\n })\n}","export const VIEW='view'\nexport const EDIT='edit'\nexport const CREATE='create'\nexport const MOVE='move'\nexport const ADD = 'add'\nexport const CAMERA_MOVE = 'cameraMove'\nexport const EDIT_LABEL = 'editLabel'\nexport const DELETED = 'deleted'","import React, {Component} from 'react'\nimport * as transform from '../utils/transform'\nimport * as modes from '../types/modes'\n\nconst defaultFontSize = 10\nconst defaultRectHeight = 15\n\nclass AnnoBar extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n top: 0,\n left: 0,\n width: 50,\n height: defaultRectHeight,\n fontSize:defaultFontSize,\n }\n this.textRef = React.createRef()\n }\n \n /*************\n * EVENTS *\n **************/\n componentWillMount(){\n if (this.props.mode !== modes.CREATE) this.setPosition()\n }\n\n componentDidUpdate(){\n if (this.props.mode !== modes.CREATE){\n this.setPosition()\n } \n }\n\n handleClick(e: Event){\n e.preventDefault()\n if (this.props.onClick){\n this.props.onClick(e)\n }\n }\n /*************\n * LOGIC *\n *************/\n setPosition(){\n // const center = transform.getCenter(this.props.anno.data, this.props.anno.type)\n // const top = center.y\n // const left = center.x \n // if (this.state.top !== top || this.state.left !== left){ \n // this.setState({\n // top,\n // left\n // })\n // }\n let topPoint = transform.getTopPoint(this.props.anno.data)\n topPoint = transform.getMostLeftPoint(topPoint)[0]\n if (this.textRef.current){\n const text = this.textRef.current.getBoundingClientRect()\n const textPadding = 2\n let rectWidth = (text.width + textPadding)/this.props.svg.scale\n if (rectWidth !== this.state.width){\n this.setState({\n width: rectWidth,\n fontSize: Math.ceil(defaultFontSize/this.props.svg.scale),\n // height: Math.ceil(defaultFontSize/this.props.svg.scale)\n })\n }\n }\n let top = topPoint.y - 10 \n let left = topPoint.x + 7\n if (top < 0) top = topPoint.y + 10\n if (this.state.top !== top || this.state.left !== left){ \n this.setState({\n top,\n left,\n // width: annoBox[1].x - annoBox[0].x\n })\n }\n }\n\n /*************\n * RENDERING *\n **************/\n\n\n render(){\n let label = ''\n if (!this.props.possibleLabels) return null\n let labelObject \n if (this.props.anno.labelIds && this.props.anno.labelIds.length > 0){\n this.props.anno.labelIds.forEach((lbl, idx) => {\n labelObject = this.props.possibleLabels.find(el => {\n return el.id === lbl\n })\n if (idx > 0) label += ', '\n label += labelObject.label\n })\n } else {\n if (this.props.defaultLabel){\n if (Number.isInteger(this.props.defaultLabel)){\n labelObject = this.props.possibleLabels.find(el => {\n return el.id === this.props.defaultLabel\n })\n label = labelObject.label\n } else {\n label = this.props.defaultLabel\n }\n } else {\n label = 'no label'\n }\n }\n switch(this.props.mode){\n case modes.VIEW:\n return (<g>\n <rect x={this.state.left} y={this.state.top - 6} \n width={this.state.width} height={this.state.height} rx=\"5\" \n opacity='0.5'\n style={this.props.style}\n />\n <text x={this.state.left} y={this.state.top} \n fill=\"white\"\n onClick={e => this.handleClick(e)}\n textAnchor=\"start\"\n alignmentBaseline=\"central\"\n ref={this.textRef} \n fontSize={this.state.fontSize+\"pt\"}\n // textLength=\"50\"\n // style={{...this.props.style, strokeWidth:1}}\n > \n {label}\n </text>\n {/* This second rect is to prevent text from getting marked */}\n <rect x={this.state.left} y={this.state.top - 6} \n width={this.state.width} \n height={this.state.height} rx=\"5\" \n opacity='0.01'\n style={this.props.style}\n />\n </g>\n )\n default:\n return null\n }\n \n }\n \n}\n\nexport default AnnoBar","import React, {Component} from 'react'\n\nclass InfSelectionArea extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n selAreaCss: 'sel-area-off',\n } \n }\n\n componentDidMount(){\n if (this.props.enable){\n this.enableSelArea()\n } else {\n this.disableSelArea()\n }\n }\n\n componentDidUpdate(){\n if (this.props.enable){\n this.enableSelArea()\n } else {\n this.disableSelArea()\n }\n }\n\n onMouseMove(e){\n if (this.props.onMouseMove){\n this.props.onMouseMove(e)\n }\n }\n\n onMouseUp(e){\n if (this.props.onMouseUp){\n this.props.onMouseUp(e)\n }\n }\n\n enableSelArea(){\n if (this.state.selAreaCss !== 'sel-area-on'){\n this.setState({selAreaCss: 'sel-area-on'})\n }\n }\n\n disableSelArea(){\n if (this.state.selAreaCss !== 'sel-area-off'){\n this.setState({selAreaCss: 'sel-area-off'})\n }\n }\n\n\n /*************\n * RENDERING *\n **************/\n render(){\n return(\n <circle \n cx={this.props.svg.width/2} \n cy={this.props.svg.height/2} \n r={'100%'}\n className={this.state.selAreaCss}\n onMouseMove={e => {this.onMouseMove(e)}}\n onMouseUp={e => {this.onMouseUp(e)}}\n />\n )\n \n }\n}\n\nexport default InfSelectionArea","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export const CREATE_NODE = \"crosshair\"\nexport const EDIT_NODE = \"crosshair\"\nexport const NORMAL_NODE = \"default\"","import React, {Component} from 'react'\nimport './Annotation.scss'\nimport * as modes from '../types/modes'\nimport * as cursorstyles from '../types/cursorstyles'\n\n\nclass Node extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n haloCss: 'node-halo-off',\n selAreaCss: 'sel-area-off',\n // anno: undefined,\n nodeSelected: false,\n style: {}\n }\n }\n\n componentDidMount(){\n this.setState({\n // anno: this.props.anno,\n style: {\n ...this.props.style,\n cursor: this.getCursorStyle(this.props.mode)\n }\n })\n // switch (this.props.mode){\n // case modes.CREATE:\n // if (this.props.idx !== 0){\n // this.turnSelAreaOn()\n // }\n // default:\n // break\n // }\n }\n\n componentDidUpdate(prevProps){\n switch (this.props.mode){\n case modes.CREATE:\n if (this.props.idx !== 0 || this.props.isPoint){\n this.turnSelAreaOn()\n }\n break\n case modes.EDIT:\n this.turnSelAreaOn()\n break\n default:\n break\n }\n //on mode change\n if (prevProps.mode !== this.props.mode){\n this.setState({\n style: {...this.state.style,\n cursor: this.getCursorStyle(this.props.mode)\n }\n })\n }\n if (prevProps.style !== this.props.style){\n this.setState({style: \n {...this.state.style,\n ...this.props.style,\n cursor: this.getCursorStyle(this.props.mode)}\n })\n }\n }\n\n /*************\n * EVENTS *\n **************/\n\n onClick(e){\n this.turnHaloOn()\n if (this.props.onClick){\n this.props.onClick(e, this.props.idx)\n }\n }\n\n onMouseMove(e){\n if (this.props.onMouseMove){\n this.props.onMouseMove(e, this.props.idx)\n }\n // switch (this.props.mode){\n // case modes.CREATE:\n // let newAnno = [...this.state.anno]\n // const mousePos = mouse.getMousePosition(e, this.props.svg)\n // newAnno[this.props.idx].x = mousePos.x\n // newAnno[this.props.idx].y = mousePos.y\n // this.setState({\n // anno: newAnno\n // })\n // if (this.props.onAnnoUpdate){\n // this.props.onAnnoUpdate(e, this.props.idx, newAnno)\n // }\n // default:\n // break\n // }\n }\n\n onContextMenu(e: Event){\n e.preventDefault()\n }\n\n onMouseUp(e: Event){\n switch (this.props.mode){\n case modes.EDIT:\n switch (e.button){\n case 0:\n this.turnSelAreaOff()\n break\n default:\n break\n }\n break\n default:\n break\n }\n if (this.props.onMouseUp){\n this.props.onMouseUp(e, this.props.idx)\n }\n }\n\n onMouseDown(e: Event){\n e.stopPropagation()\n if (this.props.onMouseDown){\n this.props.onMouseDown(e, this.props.idx)\n }\n switch (this.props.mode){\n case modes.CREATE:\n switch (e.button){\n case 0:\n this.turnSelAreaOff()\n break\n case 2:\n this.turnSelAreaOff()\n break\n default:\n break\n }\n // case modes.EDIT:\n // switch (e.button){\n // case 0:\n // this.turnSelAreaOn()\n // break\n // default:\n // break\n // }\n break\n default:\n break\n }\n }\n \n onMouseOver(e: Event){\n if (this.props.isSelected){\n this.turnHaloOn()\n }\n }\n\n onMouseLeave(e){\n if (this.props.isSelected){\n this.turnHaloOff()\n }\n }\n\n onDoubleClick(e){\n if (this.props.onDoubleClick){\n this.props.onDoubleClick(e, this.props.idx)\n }\n }\n\n handleMouseLeave(e){\n if (this.props.onMouseLeave){\n this.props.onMouseLeave(e, this.props.idx)\n }\n }\n\n\n /*************\n * LOGIC *\n **************/\n getCursorStyle(mode){\n switch(mode){\n case modes.CREATE:\n return cursorstyles.CREATE_NODE\n case modes.EDIT:\n return cursorstyles.EDIT_NODE\n case modes.VIEW:\n return cursorstyles.NORMAL_NODE\n default:\n break\n }\n }\n\n turnSelAreaOn(){\n if (this.state.selAreaCss !== 'sel-area-on'){\n this.setState({\n selAreaCss: 'sel-area-on'\n })\n }\n }\n\n turnSelAreaOff(){\n if (this.state.selAreaCss !== 'sel-area-off'){\n this.setState({\n selAreaCss: 'sel-area-off'\n })\n }\n }\n\n turnHaloOn(){\n this.setState({\n haloCss: 'node-halo-on'\n })\n }\n\n turnHaloOff(){\n this.setState({\n haloCss: 'node-halo-off'\n })\n }\n\n /*************\n * RENDERING *\n **************/\n renderHalo(){\n if (this.state.haloCss === 'node-halo-off') return null\n const data = this.props.anno[this.props.idx]\n\n return <circle cx={data.x} cy={data.y} r={this.props.style.r * 3}\n className={this.state.haloCss}\n onMouseLeave={e => this.onMouseLeave(e)}\n />\n }\n renderNodes(){\n const data = this.props.anno[this.props.idx]\n if (data === undefined) {return}\n return (\n <g\n onClick={(e) => this.onClick(e)}\n onMouseMove={e => this.onMouseMove(e)}\n onContextMenu={e => this.onContextMenu(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n onDoubleClick={e => this.onDoubleClick(e)}\n onMouseLeave={e => this.handleMouseLeave(e)}\n >\n <circle cx={data.x} cy={data.y} r={'100%'}\n className={this.state.selAreaCss}\n />\n {this.renderHalo()}\n <circle cx={data.x} \n cy={data.y} \n r={3} fill=\"red\"\n style={this.state.style}\n className={this.props.className}\n onMouseOver={e => this.onMouseOver(e)}\n />\n </g>\n )\n }\n render(){\n return(\n <g>\n {this.renderNodes()}\n </g>\n )\n }\n}\n\nexport default Node;","//Anno actions\nexport const ANNO_DELETED='annoDeleted'\nexport const ANNO_SELECTED='annoSselected'\nexport const ANNO_CREATED='annoCreated'\nexport const ANNO_MOVED='annoMoved'\nexport const ANNO_ENTER_MOVE_MODE='annoEnterMoveMode'\nexport const ANNO_EDITED='annoEdited'\nexport const ANNO_ENTER_EDIT_MODE='annoEnterEditMode'\nexport const ANNO_ADDED_NODE='annoAddedNode'\nexport const ANNO_REMOVED_NODE='annoRemovedNode'\nexport const ANNO_LABEL_UPDATE='annoLabelUpdate'\nexport const ANNO_CREATED_NODE='annoCreatedNode'\nexport const ANNO_CREATED_FINAL_NODE='annoCreatedFinalNode'\nexport const ANNO_START_CREATING='annoStartCreating'\n\n//Image actions\nexport const IMG_LABEL_UPDATE='imgLabelUpdate'\n","import React, {Component} from 'react'\nimport InfSelectionArea from './InfSelectionArea'\nimport Node from './Node'\nimport * as modes from '../types/modes'\nimport * as transform from '../utils/transform'\nimport * as canvasActions from '../types/canvasActions'\n\nclass Point extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n anno: undefined,\n }\n }\n\n componentDidMount(prevProps){\n if (this.props.anno.mode === modes.CREATE){\n const data = this.props.anno.data[0]\n const newAnno = {\n ...this.props.anno,\n data: [\n {x: data.x, y: data.y}\n ],\n selectedNode: 0\n }\n this.setState({\n anno: newAnno\n })\n } else {\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.anno !== this.props.anno){\n this.setState({anno: {...this.props.anno}})\n }\n }\n \n /**************\n * ANNO EVENTS *\n ***************/\n onMouseMove(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n this.move(\n e.movementX/this.props.svg.scale, \n e.movementY/this.props.svg.scale\n )\n break\n default:\n break\n }\n }\n\n onMouseUp(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)\n }\n break\n case modes.CREATE:\n this.requestModeChange(this.state.anno, modes.VIEW)\n\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED)\n break\n default:\n break\n }\n }\n\n onNodeMouseDown(e, idx){\n switch (this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n if (this.props.isSelected){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n }\n break\n default:\n break\n }\n }\n\n /*************\n * LOGIC *\n **************/\n getResult(){\n return this.state.anno\n }\n \n performedAction(anno, pAction){\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n requestModeChange(anno, mode){\n this.props.onModeChangeRequest(anno, mode)\n }\n\n move(movementX, movementY){\n this.setState({\n anno : {\n ...this.state.anno,\n data: transform.move(this.state.anno.data, movementX, movementY)\n }\n })\n }\n\n renderInfSelectionArea(){\n switch (this.state.anno.mode){\n case modes.MOVE:\n return <InfSelectionArea enable={true} \n svg={this.props.svg}\n />\n default:\n return null\n }\n }\n\n renderNode(){\n if (!this.props.isSelected) return null \n switch(this.state.anno.mode){\n case modes.EDIT_LABEL:\n case modes.MOVE:\n return null\n case modes.EDIT:\n case modes.CREATE:\n return <Node anno={this.state.anno.data}\n key={this.state.selectedNode}\n idx={this.state.anno.selectedNode} \n style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n isPoint={true}\n />\n default:\n return this.state.anno.data.map((e, idx) => {\n return <Node anno={this.state.anno.data} idx={idx} \n key={idx} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n isPoint={true}\n />\n })\n }\n }\n\n renderPoint(){\n return this.state.anno.data.map((e, idx) => {\n return (\n <circle key={idx} \n cx={e.x} \n cy={e.y} \n r={10} fill=\"red\" \n style={this.props.style}\n className={this.props.className}\n />\n )\n })\n \n }\n\n render(){\n if (this.state.anno){\n return(\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n >\n {this.renderPoint()}\n {this.renderNode()}\n {this.renderInfSelectionArea()}\n </g>\n )\n } else {\n return null\n }\n }\n}\n\nexport default Point;","export function getMousePosition(e, svg){\n const absPos = getMousePositionAbs(e, svg)\n return {\n x: (absPos.x )/svg.scale - svg.translateX,\n y: (absPos.y )/svg.scale - svg.translateY\n }\n}\n\nexport function getMousePositionAbs(e, svg){\n return {\n x: (e.pageX - svg.left),\n y: (e.pageY - svg.top)\n }\n}","import React, {Component} from 'react'\nimport './Annotation.scss';\nimport * as modes from '../types/modes'\nimport * as transform from '../utils/transform'\nimport * as canvasActions from '../types/canvasActions'\nimport * as mouse from '../utils/mouse'\nimport InfSelectionArea from './InfSelectionArea'\nimport Node from './Node'\n\nclass BBox extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n anno: undefined,\n }\n }\n\n componentDidMount(prevProps){\n if (this.props.anno.mode === modes.CREATE){\n const data = this.props.anno.data[0]\n const newAnno = {\n ...this.props.anno,\n data: [\n {x: data.x, y: data.y},\n {x: data.x+1, y: data.y},\n {x: data.x+1, y: data.y+1},\n {x: data.x, y: data.y+1}\n ],\n selectedNode: 2\n }\n this.setState({\n anno: newAnno\n })\n // this.performedAction(newAnno, canvasActions.ANNO_START_CREATING)\n \n } else {\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.anno !== this.props.anno){\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n /*************\n * EVENTS *\n **************/\n onNodeMouseMove(e, idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n case modes.EDIT:\n const mousePos = mouse.getMousePosition(e, this.props.svg)\n const idxMinus = idx - 1 < 0 ? 3 : idx -1\n const idxPlus = idx + 1 > 3 ? 0 : idx +1\n let newAnnoData = [...this.state.anno.data]\n if (idx % 2 === 0){\n newAnnoData[idxMinus].x = mousePos.x\n newAnnoData[idx].x = mousePos.x\n newAnnoData[idx].y = mousePos.y\n newAnnoData[idxPlus].y = mousePos.y\n } else {\n newAnnoData[idxMinus].y = mousePos.y\n newAnnoData[idx].x = mousePos.x\n newAnnoData[idx].y = mousePos.y\n newAnnoData[idxPlus].x = mousePos.x\n }\n this.setState({\n anno: {\n ...this.state.anno,\n data: newAnnoData\n }\n })\n break\n default:\n break\n }\n }\n\n onNodeMouseDown(e,idx){\n switch(this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n this.requestModeChange(\n {...this.state.anno, selectedNode:idx}, \n modes.EDIT\n )\n }\n break\n default:\n break\n }\n }\n\n onNodeMouseUp(e, idx){\n switch(this.state.anno.mode){\n case modes.EDIT:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_EDITED)\n }\n break\n case modes.CREATE:\n if (e.button === 2){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED)\n }\n break\n default:\n break\n }\n }\n\n handleNodeMouseLeave(e, idx){\n switch(this.state.anno.mode){\n //if mouse left Canvas in create mode, transit to VIEW mode\n case modes.CREATE:\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED)\n break\n default:\n break\n }\n }\n\n /**************\n * ANNO EVENTS *\n ***************/\n onMouseMove(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n this.move(\n e.movementX/this.props.svg.scale, \n e.movementY/this.props.svg.scale\n )\n break\n default:\n break\n }\n }\n\n onMouseUp(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)\n }\n break\n default:\n break\n }\n }\n\n onMouseDown(e){\n switch (this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n if (this.props.isSelected){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n }\n break\n default:\n break\n }\n }\n /*************\n * LOGIC *\n **************/\n getResult(){\n return this.state.anno\n }\n \n requestModeChange(anno, mode){\n this.props.onModeChangeRequest(anno, mode)\n }\n\n performedAction(anno, pAction){\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n toPolygonStr(data){\n return data.map( (e => {\n return `${e.x},${e.y}`\n })).join(' ')\n \n }\n\n move(movementX, movementY){\n this.setState({\n anno : {\n ...this.state.anno,\n data: transform.move(this.state.anno.data, movementX, movementY)\n }\n })\n }\n\n /*************\n * RENDERING *\n **************/\n\n renderPolygon(){\n switch(this.state.anno.mode){\n default:\n return <polygon \n points={this.toPolygonStr(this.state.anno.data)}\n fill='none' stroke=\"purple\" \n style={this.props.style}\n className={this.props.className}\n onMouseDown={e => this.onMouseDown(e)}\n onMouseUp={e => this.onMouseUp(e)}\n /> \n }\n }\n\n renderNodes(){\n if (!this.props.isSelected) return null \n switch(this.state.anno.mode){\n case modes.MOVE:\n case modes.EDIT_LABEL:\n return null\n case modes.EDIT:\n case modes.CREATE:\n return <Node anno={this.state.anno.data}\n key={this.state.anno.selectedNode}\n idx={this.state.anno.selectedNode} \n style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}\n onMouseLeave={(e, idx) => this.handleNodeMouseLeave(e, idx)}\n />\n default:\n return this.state.anno.data.map((e, idx) => {\n return <Node anno={this.state.anno.data} idx={idx} \n key={idx} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onMouseLeave={(e, idx) => this.handleNodeMouseLeave(e, idx)}\n />\n })\n }\n }\n\n renderInfSelectionArea(){\n switch (this.state.anno.mode){\n case modes.MOVE:\n return <InfSelectionArea enable={true} \n svg={this.props.svg}\n />\n default:\n return null\n }\n }\n\n render(){\n if (this.state.anno){\n return (\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n >\n {this.renderPolygon()}\n {this.renderNodes()}\n {this.renderInfSelectionArea()}\n </g>)\n } else {\n return null\n }\n }\n\n}\n\nexport default BBox;","import React, {Component} from 'react'\nimport './Annotation.scss'\n\n\n\nclass Edge extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n haloCss: 'node-halo-off'\n }\n }\n\n componentDidUpdate(){\n }\n \n onMouseOver(e){\n if (this.props.isSelected){\n this.setState({haloCss: 'node-halo-on'})\n }\n }\n\n onMouseLeave(e){\n if (this.props.isSelected){\n this.setState({haloCss: 'node-halo-off'})\n }\n }\n\n onMouseDown(e){\n if (this.props.onMouseDown){\n this.props.onMouseDown(e, this.props.idx)\n }\n }\n\n onMouseUp(e){\n e.stopPropagation()\n }\n\n render(){\n let p1, p2\n if (!this.props.closingEdge){\n if (this.props.idx - 1 < 0 ){\n return null\n }\n if (this.props.idx > this.props.anno.length - 1){\n return null\n }\n p1 = this.props.anno[this.props.idx - 1 ]\n p2 = this.props.anno[this.props.idx]\n } else {\n if (this.props.idx === 0 && this.props.anno.length === 1) return null\n p1 = this.props.anno[this.props.anno.length-1]\n p2 = this.props.anno[0]\n }\n return(<g\n onMouseOver={(e) => {this.onMouseOver(e)}}\n onMouseLeave={e => {this.onMouseLeave(e)}}\n \n >\n <line x1={p1.x} y1={p1.y} \n x2={p2.x} y2={p2.y} stroke=\"black\"\n // style={this.props.style} \n strokeWidth={this.props.style.strokeWidth*3}\n className={this.state.haloCss}\n onMouseOver={(e) => {this.onMouseOver(e)}}\n onMouseDown={e => this.onMouseDown(e)}\n onMouseUp={e => this.onMouseUp(e)}\n />\n <line x1={p1.x} y1={p1.y} \n x2={p2.x} y2={p2.y} stroke=\"black\"\n style={this.props.style} \n className={this.props.className}\n onMouseDown={e => this.onMouseDown(e)}\n onMouseUp={e => this.onMouseUp(e)}\n />\n </g>\n )\n }\n}\n\nexport default Edge;","import React, {Component} from 'react'\n\nimport Edge from './Edge'\nimport Node from './Node'\nimport InfSelectionArea from './InfSelectionArea'\n\nimport * as transform from '../utils/transform'\nimport * as canvasActions from '../types/canvasActions'\n\nimport './Annotation.scss'\nimport * as modes from '../types/modes'\nimport * as mouse from '../utils/mouse'\n\n\nclass Polygon extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n anno: undefined,\n }\n }\n\n componentDidMount(){\n if (this.props.anno.mode === modes.CREATE){\n const data = this.props.anno.data[0]\n const newAnno = {\n ...this.props.anno,\n data: [\n {x: data.x, y: data.y},\n {x: data.x+1, y: data.y},\n ],\n selectedNode: 1\n }\n this.setState({\n anno: newAnno\n })\n } else {\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.anno !== this.props.anno){\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n\n /**************\n * ANNO EVENTS *\n ***************/\n onMouseMove(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n this.move(\n e.movementX/this.props.svg.scale, \n e.movementY/this.props.svg.scale\n )\n break\n default:\n break\n }\n }\n\n onMouseUp(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n if (e.button === 0){\n this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)\n this.requestModeChange(this.state.anno, modes.VIEW)\n }\n break\n default:\n break\n }\n }\n\n onMouseDown(e){\n switch (this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n if (this.props.isSelected){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n }\n break\n default:\n break\n }\n }\n /**************\n * NODE EVENTS *\n ***************/\n\n onNodeMouseUp(e, idx){\n switch (this.state.anno.mode){\n case modes.EDIT:\n this.performedAction(this.state.anno, canvasActions.ANNO_EDITED)\n this.requestModeChange(this.state.anno, modes.VIEW)\n break\n default:\n break\n }\n }\n\n onNodeMouseDown(e,idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n if (e.button === 2){\n let newAnnoData = [...this.state.anno.data]\n newAnnoData.push({\n x: newAnnoData[idx].x,\n y: newAnnoData[idx].y\n })\n const newAnno = {\n ...this.state.anno,\n data: newAnnoData,\n selectedNode: this.state.anno.selectedNode + 1\n }\n this.setState({\n anno: newAnno\n })\n this.performedAction(newAnno, \n canvasActions.ANNO_CREATED_NODE)\n }\n break\n case modes.VIEW:\n if (e.button === 0){\n this.requestModeChange({\n ...this.state.anno,\n selectedNode: idx\n }, modes.EDIT)\n }\n break\n default:\n break\n }\n }\n\n onNodeMouseMove(e, idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n this.updateAnnoByMousePos(e, idx)\n break\n case modes.EDIT:\n e.stopPropagation()\n this.updateAnnoByMousePos(e, idx)\n break\n default:\n break\n }\n }\n\n onNodeDoubleClick(e, idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED_FINAL_NODE)\n break\n default:\n break\n }\n }\n \n /**************\n * EDGE EVENTS *\n ***************/\n onEdgeMouseDown(e, idx){\n switch (this.state.anno.mode){\n case modes.ADD:\n this.addNode(e, idx)\n break\n case modes.VIEW:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n break\n default:\n break\n }\n }\n\n /*************\n * LOGIC *\n *************/\n performedAction(anno, pAction){\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n toPolygonStr(data){\n return data.map( (e => {\n return `${e.x},${e.y}`\n })).join(' ')\n \n }\n\n requestModeChange(anno, mode){\n this.props.onModeChangeRequest(anno, mode)\n }\n\n move(movementX, movementY){\n this.setState({\n anno : {...this.state.anno,\n data: transform.move(this.state.anno.data, movementX, movementY)\n }\n })\n }\n\n addNode(e, idx){\n const mPos = mouse.getMousePosition(e, this.props.svg)\n let newAnnoData = this.state.anno.data.slice(0,idx)\n newAnnoData.push(mPos)\n const oldRest = this.state.anno.data.slice(idx)\n const newAnno = {\n ...this.state.anno,\n data: newAnnoData.concat(oldRest)\n }\n this.setState({anno: newAnno\n })\n this.performedAction(newAnno, canvasActions.ANNO_ADDED_NODE)\n }\n\n removeLastNode(){\n const newAnno = {\n ...this.state.anno,\n data: [...this.state.anno.data.slice(0, this.state.anno.data.length-1)],\n selectedNode: this.state.anno.selectedNode - 1\n }\n this.setState({anno: newAnno\n })\n this.performedAction(newAnno, canvasActions.ANNO_REMOVED_NODE)\n }\n\n updateAnnoByMousePos(e, idx){\n const mousePos = mouse.getMousePosition(e, this.props.svg)\n let newAnnoData = [...this.state.anno.data]\n newAnnoData[idx].x = mousePos.x\n newAnnoData[idx].y = mousePos.y\n this.setState({\n anno: {\n ...this.state.anno,\n data: newAnnoData\n }\n })\n }\n\n getResult(){\n return this.state.anno\n }\n\n /*************\n * RENDERING *\n **************/\n\n renderNodes(){\n if (!this.props.isSelected) return null\n switch (this.state.anno.mode){\n case modes.MOVE:\n return null\n case modes.EDIT:\n case modes.CREATE:\n return <Node anno={this.state.anno.data} idx={this.state.anno.selectedNode} \n key={this.state.anno.selectedNode} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}\n onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}\n />\n default:\n return this.state.anno.data.map((e, idx) => {\n return <Node anno={this.state.anno.data} idx={idx} \n key={idx} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}\n onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}\n />\n })\n }\n }\n\n renderEdges(){\n if (!this.props.isSelected) return null\n switch (this.state.anno.mode){\n case modes.VIEW:\n case modes.ADD:\n let edges = this.state.anno.data.map((e, idx) => {\n return <Edge anno={this.state.anno.data} \n idx={idx} key={idx} style={this.props.style}\n className={this.props.className}\n isSelected={this.props.isSelected}\n onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}} \n />\n })\n edges.push(<Edge anno={this.state.anno.data} \n closingEdge={true} key={edges.length}\n idx={0}\n style={this.props.style}\n className={this.props.className}\n isSelected={this.props.isSelected}\n onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}} \n />)\n return edges\n default:\n return null\n }\n }\n\n renderPolygon(){\n return <polygon points={this.toPolygonStr(this.state.anno.data)}\n fill='none' stroke=\"purple\" \n style={this.props.style}\n className={this.props.className}\n />\n }\n\n renderInfSelectionArea(){\n switch (this.state.anno.mode){\n case modes.MOVE:\n return <InfSelectionArea enable={true} \n svg={this.props.svg}\n />\n default:\n return null\n }\n }\n\n render(){\n if (this.state.anno){\n return (\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n >\n {this.renderPolygon()}\n {this.renderEdges()}\n {this.renderNodes()}\n {this.renderInfSelectionArea()}\n </g>\n )\n } else {\n return <g></g>\n }\n }\n}\n\nexport default Polygon;","import React from 'react'\nimport Polygon from './Polygon'\nimport Edge from './Edge'\n\nimport * as modes from '../types/modes'\n\n\n\nclass Line extends Polygon{\n\n /*************\n * RENDERING *\n **************/\n\n renderEdges(){\n if (!this.props.isSelected) return null\n switch (this.state.anno.mode){\n case modes.VIEW:\n case modes.ADD:\n return this.state.anno.data.map((e, idx) => {\n return <Edge anno={this.state.anno.data} \n idx={idx} key={idx} style={this.props.style}\n className={this.props.className}\n isSelected={this.props.isSelected}\n onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}} \n />\n })\n default:\n return null\n }\n }\n\n renderPolyline(){\n return <polyline points={this.toPolygonStr(this.state.anno.data)}\n fill='none' stroke=\"purple\" \n style={{...this.props.style, fill:'none'}}\n className={this.props.className}\n />\n }\n render(){\n if (this.state.anno){\n return (\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n >\n {this.renderPolyline()}\n {this.renderEdges()}\n {this.renderNodes()}\n {this.renderInfSelectionArea()}\n </g>\n )\n } else {\n return <g></g>\n }\n }\n}\n\nexport default Line;","export const NEW='new'\nexport const DELETED='deleted'\nexport const DATABASE='database'\nexport const CHANGED='changed'","// const colors30 = [\"#dc9769\",\n// \"#5c69d6\",\n// \"#51a630\",\n// \"#9a59cc\",\n// \"#a1bb37\",\n// \"#c043a6\",\n// \"#5fc666\",\n// \"#de4282\",\n// \"#58c699\",\n// \"#d2404e\",\n// \"#42c0c7\",\n// \"#d95130\",\n// \"#598cdd\",\n// \"#df8830\",\n// \"#50a2d1\",\n// \"#c8a73f\",\n// \"#d87ed5\",\n// \"#3e7f38\",\n// \"#af94d8\",\n// \"#7b8b2d\",\n// \"#635ea2\",\n// \"#a1b56d\",\n// \"#a93e62\",\n// \"#3e8d68\",\n// \"#df82ab\",\n// \"#616c2c\",\n// \"#955282\",\n// \"#91692d\",\n// \"#d47776\",\n// \"#a94e2c\"]\n\nconst colors20 = [\"#46aed7\",\n\"#e28f81\",\n\"#50b897\",\n\"#88712f\",\n\"#9cb067\",\n\"#a4527d\",\n\"#a55046\",\n\"#6e90da\",\n\"#487b3b\",\n\"#6360a7\",\n\"#cd8fd3\",\n\"#d5a442\",\n\"#cf7635\",\n\"#da4971\",\n\"#a4b137\",\n\"#d44da4\",\n\"#aa54be\",\n\"#5ab74d\",\n\"#7166d9\",\n\"#d14734\"]\n\nconst colors = colors20\nconst nColors = 20\n\nexport function getColor(n){\n if (n){\n return colors[n%nColors]\n }\n else{\n return getDefaultColor() \n }\n}\n\nexport function getDefaultColor(){\n return colors[0]\n}","import * as annoStatus from '../types/annoStatus'\n\n /**\n * Check if labels can be changed for a specific annotation\n * \n * @param allowedActions Actions that are allowed, read from config\n * @param anno Annotation that should be checked\n * @returns {Boolean}\n */\n export function allowedToLabel(allowedActions, anno){\n if (allowedActions.label){\n return true\n // const status = anno.status\n // if (!status) return true\n // if (status !== annoStatus.NEW){\n // if (allowedActions.edit.label){\n // return true\n // } else {\n // console.warn('You may not edit the label of this annotation as defined by config!', anno)\n // return false\n // }\n // } else {\n // // Return always true if labeling is allowed in general\n // // and annotation was not edited (it was NEW)\n // return true\n // }\n } else {\n console.warn('You may not edit the label of this annotation as defined by config!', anno)\n return false\n }\n }\n\n // /**\n // * Check if config allows to delete a specific annotation.\n // * \n // * @param allowedActions Actions that are allowed, read from config\n // * @param anno Annotation that should be checked\n // * @returns {Boolean}\n // */\n // export function allowedToDelete(allowedActions, anno){\n // const status = anno.status\n // if (!status) return true\n // if (status !== annoStatus.NEW){\n // if(allowedActions.edit.delete){\n // return true\n // } else {\n // console.warn('You may not delete this annotation as defined by config!', anno)\n // return false\n // }\n // } else {\n // return true\n // }\n // }\n\n /**\n * Check if config allows to edit a specific annotation.\n * \n * @param allowedActions Actions that are allowed, read from config\n * @param anno Annotation that should be checked\n * @returns {Boolean}\n */\n export function allowedToEdit(allowedActions, anno){\n const status = anno.status\n if (!status) return true\n if (status !== annoStatus.NEW){\n if(allowedActions.edit){\n return true\n } else {\n console.warn('You may not edit bounds of this annotation as defined by config!', anno)\n return false\n }\n } else {\n return true\n }\n }","export const INFO='info'\nexport const SUCCESS='success'\nexport const WARNING='warning'\nexport const ERROR='error'","import React, {Component} from 'react'\n\nimport AnnoBar from './AnnoBar'\nimport Point from './Point'\nimport BBox from './BBox'\nimport Line from './Line'\nimport Polygon from './Polygon'\nimport * as modes from '../types/modes'\nimport * as canvasActions from '../types/canvasActions'\nimport * as annoStatus from '../types/annoStatus'\nimport * as colorlut from '../utils/colorlut'\nimport * as constraints from '../utils/constraints'\nimport * as transform from '../utils/transform'\nimport * as notificationType from '../types/notificationType'\n\nclass Annotation extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n // mode: modes.VIEW,\n selAreaCss: 'sel-area-off',\n visibility: 'visible',\n anno: undefined\n }\n this.myAnno = React.createRef()\n \n }\n\n componentWillMount(){\n this.setState({anno: {...this.props.data}})\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.data !== this.props.data){\n this.setState({anno: {...this.props.data}})\n }\n if (prevProps.showSingleAnno !== this.props.showSingleAnno){\n if (this.props.showSingleAnno === undefined){\n this.setVisible(true)\n } else {\n if (this.props.showSingleAnno !== this.props.data.id){\n this.setVisible(false)\n } else {\n this.setVisible(true)\n }\n }\n }\n }\n \n /*************\n * EVENTS *\n **************/\n onClick(e: Event){\n e.stopPropagation()\n this.performedAction(this.state.anno, canvasActions.ANNO_SELECTED)\n }\n\n onMouseDown(e: Event){\n e.preventDefault()\n if (this.props.onMouseDown){\n this.props.onMouseDown(e)\n }\n }\n\n onContextMenu(e: Event){\n e.preventDefault()\n }\n\n handleModeChangeRequest(anno, mode){\n this.setMode(anno, mode)\n }\n\n /*************\n * LOGIC *\n *************/\n \n /**\n * Trigger callback when this annotation performed an action\n * \n * @param {String} pAction \n */\n performedAction(anno, pAction){\n\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n\n notify(messageObj){\n if (this.props.onNotification){\n this.props.onNotification(messageObj)\n }\n }\n\n /**\n * Handle a performed action from a specific annotation\n * \n * @param {list} annoData - Annotation data that define a box, line, \n * polygon, point\n * @param {string} pAction - The performed action\n * @param {int} selectedNode - The node of the annotation that \n * was selected\n */\n performedAnnoAction(anno, pAction){\n\n switch(pAction){\n case canvasActions.ANNO_CREATED_FINAL_NODE:\n case canvasActions.ANNO_EDITED:\n case canvasActions.ANNO_MOVED:\n case canvasActions.ANNO_CREATED:\n // Check if annoation is within image bounds\n const corrected = transform.correctAnnotation(anno.data, this.props.svg)\n let newAnno = {...anno, data: corrected}\n const area = transform.getArea(corrected, this.props.svg, anno.type, this.props.image)\n if (area!==undefined){\n if(area < this.props.canvasConfig.annos.minArea){\n this.notify({\n title: \"Annotation to small\",\n message: 'Annotation area was '+Math.round(area)+'px but needs to be bigger than '+ this.props.canvasConfig.annos.minArea+' px',\n type: notificationType.WARNING\n })\n // newAnno = {...newAnno, mode: modes.DELETED}\n this.setMode(newAnno, modes.DELETED)\n } else {\n this.performedAction(newAnno, pAction)\n }\n } else {\n this.performedAction(newAnno, pAction)\n }\n break\n default:\n this.performedAction(anno, pAction)\n break\n }\n }\n\n setAnnoMode(anno, mode){\n this.setState({\n anno: {\n ...anno,\n mode: mode\n }\n })\n }\n\n setMode(anno, mode){\n if (anno.mode !== mode){\n switch (mode){\n case modes.EDIT_LABEL:\n if (constraints.allowedToLabel(\n this.props.allowedActions,\n anno\n )){\n this.setAnnoMode(anno, mode)\n }\n break\n case modes.DELETED:\n // if(constraints.allowedToDelete(\n // this.props.allowedActions,\n // anno\n // )){\n this.setAnnoMode(anno, mode)\n const newAnno = {\n ...anno, \n // status: annoStatus.DELETED\n mode: mode.DELETED\n }\n // this.setState({\n // anno: newAnno\n // })\n this.performedAction(newAnno, canvasActions.ANNO_DELETED)\n // }\n break\n case modes.MOVE:\n this.setAnnoMode(anno, mode)\n this.performedAction(anno, canvasActions.ANNO_ENTER_MOVE_MODE)\n break\n case modes.EDIT:\n this.setAnnoMode(anno, mode)\n this.performedAction(anno, canvasActions.ANNO_ENTER_EDIT_MODE)\n break\n default:\n this.setAnnoMode(anno, mode)\n break\n }\n }\n }\n\n setVisible(visible){\n if (visible){\n if (this.state.visibility !== 'visible'){\n this.setState({visibility: 'visible'})\n }\n } else {\n if (this.state.visibility !== 'hidden'){\n this.setState({visibility: 'hidden'})\n }\n }\n }\n\n isSelected(){\n if (constraints.allowedToEdit(this.props.allowedActions, this.state.anno)){\n return this.props.selectedAnno === this.props.data.id\n } else {\n return false\n }\n }\n\n getResult(){\n return {\n ...this.state.anno,\n data: this.myAnno.current.state.anno,\n createMode: this.myAnno.current.state.mode === modes.CREATE\n }\n }\n\n getLabel(lblId){\n return this.props.possibleLabels.find( e => {\n return e.id === lblId\n })\n }\n \n getColor(){\n if (this.state.anno.labelIds.length > 0){\n return this.getLabel(this.state.anno.labelIds[0]).color\n }\n else {\n return colorlut.getDefaultColor()\n }\n }\n\n getStyle(){\n const color = this.getColor()\n if (this.isSelected()){\n return {\n stroke: color,\n fill: color,\n strokeWidth: this.props.uiConfig.strokeWidth/this.props.svg.scale,\n r:this.props.uiConfig.nodeRadius/this.props.svg.scale\n\n }\n } else {\n return {\n stroke: color,\n fill: color,\n strokeWidth: this.props.uiConfig.strokeWidth/this.props.svg.scale,\n r:this.props.uiConfig.nodeRadius/this.props.svg.scale\n }\n }\n }\n\n getCssClass(){\n if (this.isSelected()){\n return 'selected'\n } else {\n return 'not-selected'\n }\n }\n\n /*************\n * RENDERING *\n **************/\n renderAnno(){\n const type = this.props.type\n // const allowedToEdit = constraints.allowedToEditBounds(\n // this.props.allowedActions,\n // this.state.anno\n // )\n switch(type) {\n case 'point':\n return <Point ref={this.myAnno} anno={this.state.anno} \n style={this.getStyle()}\n className={this.getCssClass()}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n />\n case 'bBox':\n return <BBox ref={this.myAnno} anno={this.state.anno} \n style={this.getStyle()}\n className={this.getCssClass()}\n onNodeClick={(e, idx) => this.onNodeClick(e, idx)}\n onNodeMouseDown={(e, idx) => this.onNodeMouseDown(e, idx)}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n />\n case 'polygon':\n return <Polygon ref={this.myAnno} anno={this.state.anno} \n style={this.getStyle()}\n className={this.getCssClass()}\n onNodeClick={(e, idx) => this.onNodeClick(e, idx)}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n />\n case 'line':\n return <Line ref={this.myAnno} anno={this.state.anno}\n style={this.getStyle()}\n className={this.getCssClass()}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n />\n default:\n console.error(\"Wrong annoType for annotations: \",\n this.props.annoType)\n } \n }\n \n renderAnnoBar(){\n return <AnnoBar \n anno={this.state.anno} \n mode={this.state.anno.mode}\n possibleLabels={this.props.possibleLabels}\n onClick={e => this.onClick(e)}\n style={this.getStyle()}\n svg={this.props.svg}\n defaultLabel={this.props.defaultLabel}\n />\n }\n render(){\n if(!this.state.anno.data) return null\n if(!this.props.possibleLabels) return null\n if(this.state.anno.status === annoStatus.DELETED) return null\n return (\n <g>\n <g visibility={this.state.visibility}\n onClick={e => this.onClick(e)}\n onMouseDown={e => this.onMouseDown(e)}\n onContextMenu={e => this.onContextMenu(e)}\n >\n {this.renderAnnoBar()}\n {this.renderAnno()}\n\n </g>\n </g>\n )\n }\n}\n\nexport default Annotation","import React, {Component} from 'react'\nimport { Dropdown, Ref, Popup, Header} from 'semantic-ui-react'\n\nclass LabelInput extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n label: [],\n possibleLabels: [],\n performInit: true,\n enterHits: 0,\n confirmLabel: 0\n }\n this.inputRef = React.createRef()\n }\n\n componentWillMount(){\n this.updatePossibleLabels()\n }\n\n componentDidMount(){\n if(this.props.initLabelIds){\n this.setState({performInit:true})\n }\n }\n\n componentDidUpdate(prevProps, prevState){\n if (this.props.visible){\n if (this.props.focusOnRender){\n if (this.inputRef.current){\n this.inputRef.current.click()\n }\n }\n\n }\n if (prevState.confirmLabel !== this.state.confirmLabel){\n this.annoLabelUpdate(this.state.label)\n this.closeLabelInput()\n }\n if (prevProps.possibleLabels !== this.props.possibleLabels){\n this.updatePossibleLabels()\n }\n if (this.props.initLabelIds){\n if (this.state.performInit){\n this.setState({performInit: false})\n if(this.props.initLabelIds.length > 0){\n this.setState({label: this.props.initLabelIds})\n // const lbl = this.state.possibleLabels.find(e => {\n // return e.value === this.props.initLabelIds[0]\n // })\n // if (lbl){\n // this.setState({label:lbl.value})\n // }\n } else {\n this.setState({label:[]})\n }\n }\n if (prevProps.initLabelIds !== this.props.initLabelIds){\n this.setState({performInit:true})\n }\n }\n if(prevProps.relatedId !== this.props.relatedId){\n this.setState({performInit:true})\n }\n }\n /*************\n * EVENTS *\n **************/\n onKeyDown(e: Event){\n e.stopPropagation()\n this.performKeyAction(e.key)\n\n }\n\n onChange(e, item ){\n let lbl \n if (this.props.multilabels){\n lbl = item.value !== -1 ? item.value : []\n } else {\n lbl = item.value !== -1 ? [item.value] : []\n }\n this.setState({ label: lbl})\n this.annoLabelUpdate(lbl)\n // this.inputRef.current.click()\n }\n\n onItemClick(e, item){\n this.confirmLabel()\n }\n\n\n /*************\n * LOGIC *\n *************/\n updatePossibleLabels(){\n let possibleLabels = []\n let defaultLabel\n if (this.props.defaultLabel){\n if (Number.isInteger(this.props.defaultLabel)){\n defaultLabel = undefined\n } else {\n defaultLabel = this.props.defaultLabel\n }\n } else {\n defaultLabel = 'no label'\n }\n \n if (this.props.possibleLabels.length > 0){\n possibleLabels = this.props.possibleLabels.map(e => {\n return {\n key: e.id, value: e.id, text: e.label,\n content: (<div onClick={(event) => this.onItemClick(event, e.id)}>\n {e.label}</div>)\n }\n })\n }\n if (defaultLabel){\n possibleLabels.unshift({\n key: -1, value: -1, text: defaultLabel,\n content: (<div onClick={(event) => this.onItemClick(event, -1)}>\n {defaultLabel}</div>)\n })\n }\n this.setState({possibleLabels})\n\n }\n\n performKeyAction(key){\n switch(key){\n case 'Enter':\n if (!this.props.multilabels){\n if (this.props.visible) this.confirmLabel()\n }\n break\n case 'Escape':\n this.closeLabelInput()\n break\n default:\n break\n }\n }\n\n annoLabelUpdate(label){\n if (this.props.onLabelUpdate){\n this.props.onLabelUpdate(label.filter(val=>{\n return val !== -1\n }))\n }\n }\n\n\n confirmLabel(){\n //If not allowed to label -> return\n this.setState({confirmLabel: this.state.confirmLabel+1})\n }\n\n closeLabelInput(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n\n // triggerPopup(visible=true){\n // this.setState({\n // popupOpen: visible\n // })\n // }\n\n /*************\n * RENDERING *\n **************/\n renderLabelInput(){\n let lbl\n if (this.props.multilabels){\n lbl = this.state.label\n } else {\n if (this.state.label.length > 0){\n lbl = this.state.label[0]\n } else {\n lbl = -1\n }\n }\n\n return (\n <Ref innerRef={this.inputRef}>\n <Dropdown\n multiple={this.props.multilabels}\n search\n selection\n closeOnChange\n icon=\"search\"\n options={this.state.possibleLabels}\n placeholder='Enter label'\n tabIndex={0}\n onKeyDown= {e => this.onKeyDown(e)}\n value={lbl}\n onChange={(e, item) => this.onChange(e, item)}\n style={{opacity:0.8}}\n disabled={this.props.disabled}\n open={this.props.open}\n />\n </Ref>\n )\n }\n renderLabelInfo(){\n if (!this.state.label) return null\n let lbl = undefined\n if (this.state.label.length > 0){\n lbl = this.props.possibleLabels.find(e => {\n return this.state.label[this.state.label.length-1] === e.id\n })\n }\n if (!lbl) return \"No label\"\n return <div>\n <Header>{\n lbl.label\n }</Header>\n <div dangerouslySetInnerHTML={{__html: lbl.description}} />\n </div>\n }\n\n renderPopupContent(){\n return <div>\n {this.renderLabelInfo()}\n {/* {this.renderAnnoDetails()} */}\n </div>\n }\n\n\n render(){\n if (!this.props.visible) return null\n if (this.props.renderPopup){\n return (\n <Popup trigger={this.renderLabelInput()}\n content={this.renderPopupContent()}\n open\n position=\"right center\"\n style={{opacity:0.9}}\n />\n )\n } else {\n return this.renderLabelInput()\n }\n\n }\n\n}\n\nexport default LabelInput\n","import React, {Component} from 'react'\nimport LabelInput from './LabelInput'\nimport * as constraints from './utils/constraints'\nimport * as annoStatus from './types/annoStatus'\n\nclass AnnoLabelInput extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n top: 400,\n left: 100,\n label: undefined,\n visibility: 'hidden',\n possibleLabels: []\n }\n this.inputGroupRef = React.createRef()\n }\n\n componentWillMount(){\n this.setPosition()\n }\n \n componentDidUpdate(prevProps){\n if (this.props.visible){\n this.setPosition()\n } \n\n \n }\n\n /*************\n * LOGIC *\n *************/\n setPosition(){\n\n if (this.props.mousePos){\n const top = this.props.mousePos.y + this.props.svg.top - 10\n const left = this.props.mousePos.x + this.props.svg.left - 10\n if (this.state.top !== top|| this.state.left !== left){ \n this.setState({\n top: top,\n left: left,\n })\n }\n }\n }\n\n onClose(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n \n annoLabelUpdate(anno){\n if (this.props.onLabelUpdate){\n this.props.onLabelUpdate(anno)\n }\n }\n\n updateAnnoLabel(label){\n if (!constraints.allowedToLabel(\n this.props.allowedActions, this.props.selectedAnno)) return\n this.annoLabelUpdate({\n ...this.props.selectedAnno,\n labelIds: label,\n status: this.props.selectedAnno.status !== annoStatus.NEW ? annoStatus.CHANGED : annoStatus.NEW\n })\n }\n\n\n /*************\n * RENDERING *\n **************/\n render(){\n if (!this.props.visible) return null\n return (\n <div ref={this.inputGroupRef} style={{position:'fixed', top:this.state.top, left:this.state.left}}>\n <LabelInput svg={this.props.svg}\n onClose={() => this.onClose()}\n initLabelIds={this.props.selectedAnno.labelIds}\n relatedId={this.props.selectedAnno.id}\n visible={this.props.visible}\n onLabelUpdate={label => this.updateAnnoLabel(label)}\n possibleLabels={this.props.possibleLabels}\n multilabels={this.props.multilabels}\n disabled={!this.props.allowedActions.label}\n renderPopup\n focusOnRender\n open={true}\n defaultLabel={this.props.defaultLabel}\n />\n </div>\n )\n }\n \n}\n\nexport default AnnoLabelInput","import React, {Component} from 'react'\nimport { Menu } from 'semantic-ui-react'\n\nclass ImgBar extends Component{\n\n constructor(props) {\n super(props)\n this.state = {\n position: {\n top: 0,\n left: 0,\n },\n }\n }\n\n componentDidMount(){\n \n }\n componentDidUpdate(prevProps){\n\n if (this.props.svg !== prevProps.svg){\n this.setState({\n position: {...this.state.position,\n left: this.props.svg.left,\n top: this.props.svg.top,\n }\n })\n }\n }\n\n /*********\n * Events\n *********/\n handleLabelUpdate(label){\n if (this.props.onLabelUpdate){\n this.props.onLabelUpdate(label)\n }\n }\n \n handleClose(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n\n handleMouseEnter(e){\n if (this.props.onMouseEnter){\n this.props.onMouseEnter(e)\n }\n }\n\n // renderImgLabelInput(){\n // if (this.props.allowedActions.label){\n // return <Menu.Item style={{padding: \"5px\"}}>\n // <LabelInput\n // // multilabels={true}\n // multilabels={this.props.multilabels}\n // relatedId={this.props.annos.image.id}\n // visible={this.props.visible}\n // onLabelUpdate={label => this.handleLabelUpdate(label)}\n // possibleLabels={this.props.possibleLabels}\n // initLabelIds={this.props.imgLabelIds}\n // relatedId={this.props.annos.image.id}\n // disabled={!this.props.allowedActions.label}\n // />\n // </Menu.Item>\n // } else {\n // return null\n // }\n // }\n\n renderImgLabels(){\n let label = ''\n if (this.props.imgLabelIds && this.props.imgLabelIds.length > 0){\n let labelObject \n this.props.imgLabelIds.forEach((lbl, idx) => {\n labelObject = this.props.possibleLabels.find(el => {\n return el.id === lbl\n })\n if (idx > 0) label += ', '\n label += labelObject.label\n })\n return <Menu.Item >\n {label}\n </Menu.Item>\n } else {\n return null\n }\n }\n render(){\n if (!this.props.visible) return null\n if (!this.props.annos.image) return null\n if (!this.props.annos.image.url) return null\n return(\n <div style={{\n position:'fixed', \n top: this.state.position.top, \n left:this.state.position.left,\n width: this.props.svg.width,\n minWidth: '300px'\n }}\n onMouseEnter={e => {this.handleMouseEnter(e)}} \n >\n <Menu inverted style={{opacity:0.9, justifyContent:'center', alignItems:'center'}}>\n {/* {this.renderImgLabelInput()} */}\n <Menu.Item\n >\n {this.props.annos.image.url.split('/').pop() +\" (ID: \"+this.props.annos.image.id+\")\"}\n </Menu.Item>\n <Menu.Item \n >\n {this.props.annos.image.number +\" / \"+ this.props.annos.image.amount}\n </Menu.Item>\n {this.renderImgLabels()}\n </Menu>\n </div>\n )\n }\n}\n\nexport default ImgBar","import React, {Component} from 'react'\nimport { Dimmer, Header } from 'semantic-ui-react'\n\nclass Prompt extends Component{\n\n constructor(props) {\n super(props)\n this.state = {\n active: false\n }\n }\n\n handleClick(e){\n if (this.props.onClick){\n this.props.onClick(e)\n }\n }\n \n componentDidMount(){\n this.setState({active: this.props.active})\n }\n\n componentDidUpdate(prevProps){\n if (this.props.active !== prevProps.active){\n this.setState({active: this.props.active})\n }\n }\n\n \n render(){\n return (\n <Dimmer page \n active={this.state.active} \n style={{zIndex:2000}}\n onClick={e => this.handleClick(e)}\n >\n <Header as=\"h3\" inverted>\n {this.props.header}\n </Header>\n {this.props.content}\n </Dimmer>\n )\n }\n}\n\nexport default Prompt","import React, {Component} from 'react'\n\nimport * as transform from './utils/transform'\n\nclass AnnoToolBar extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n top: 400,\n left: 100,\n width: 50,\n label: undefined,\n visibility: 'hidden',\n possibleLabels: []\n }\n this.inputGroupRef = React.createRef()\n }\n\n componentWillMount(){\n this.setPosition()\n }\n \n componentDidUpdate(prevProps){\n if (this.props.visible){\n this.setPosition()\n } \n\n \n }\n\n /*************\n * LOGIC *\n *************/\n setPosition(){\n if (this.props.selectedAnno){\n // const center = transform.getCenter(this.props.selectedAnno.data, this.props.selectedAnno.type)\n // const annoBox = transform.getBox(this.props.selectedAnno.data, this.props.selectedAnno.type)\n let topPoint = transform.getTopPoint(this.props.selectedAnno.data)\n topPoint = transform.getMostLeftPoint(topPoint)[0]\n const inputRect = this.inputGroupRef.current.getBoundingClientRect()\n let top = this.props.svg.top + (topPoint.y + this.props.svg.translateY) *this.props.svg.scale - 44\n let left = this.props.svg.left + (topPoint.x + this.props.svg.translateX) *this.props.svg.scale - inputRect.width /2.0 - 1\n // if (left < this.props.svg.left) left = this.props.svg.left\n // if (left+inputRect.width > this.props.svg.left+this.props.svg.width){\n // left = this.props.svg.left+this.props.svg.width - inputRect.width\n // }\n if (top < 0) top = this.props.svg.top + (topPoint.y + this.props.svg.translateY + 10) *this.props.svg.scale \n if (this.state.top !== top || this.state.left !== left){ \n this.setState({\n top,\n left,\n // width: annoBox[1].x - annoBox[0].x\n })\n }\n }\n }\n\n onClose(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n\n handleClick(e){\n if (this.props.onClick){\n this.props.onClick(e)\n }\n }\n \n renderDaviIcon(){\n return <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n // x=\"0px\" y=\"0px\"\n // width=\"1190.549px\" height=\"841.891px\" \n viewBox=\"0 0 1190.549 841.891\" \n width=\"60px\"\n onClick={e => this.handleClick(e)}\n >\n <g id=\"Info\">\n <path id=\"Maps\" fill={this.props.color} d=\"M620.561,817.217c-1.568-3.62-3.771-7.101-4.611-10.885\n c-24.452-109.811-74.341-207.569-139.215-298.675c-27.507-38.628-55.814-77.404-77.438-119.371\n C324.363,242.85,402.696,58.71,574.209,26.508c145.509-27.32,282.953,75.871,296.543,222.773\n c4.659,50.356-7.471,97.96-32.152,141.022c-27.812,48.526-58.75,95.364-90.073,141.758\n c-50.917,75.411-91.062,155.558-113.421,244.091c-2.438,9.652-3.936,19.543-6.271,29.227c-0.992,4.104-3.023,7.961-4.584,11.93\n C623.021,817.277,621.789,817.247,620.561,817.217z\"/>\n <path id=\"Text\" fillRule=\"evenodd\" clipRule=\"evenodd\" fill=\"#FFFFFF\" d=\"M724.709,250.898\n c-0.055-3.974,0.047-7.949,0.033-11.923c-0.007-1.228-1.54-2.767-2.76-2.777c-2.428-0.021-4.862-0.015-7.29-0.015\n c-22.466,0.001-44.934,0.005-67.404,0.009c-2.475,0.001-3.658,1.154-3.658,3.588c-0.001,47.365-0.001,94.73-0.001,142.096\n c0,13.526,0,27.05,0.001,40.577c0,2.305,1.274,3.584,3.562,3.59c6.623,0.004,9.256-0.07,19.873,0.004\n c10.618,0.072,14.146,8.543,14.146,14.189c-0.002,5.645-4.233,13.055-14.299,13.367c-13.135,0.061-26.277-0.02-39.414-0.014\n c-14.575,0.004-29.146,0.004-43.722,0.02c-4.191-0.084-13.717-2.789-13.717-13.492s6.233-13.643,13.132-14.117\n c4.979,0.037,13.802,0.057,20.701,0.049c1.695,0,3.11-1.537,3.11-3.361c0.003-13.912-0.004-27.823-0.004-41.736\n c0-30.252,0-60.503,0.002-90.754c0.002-17.03,0.005-33.649,0.002-50.678c0-1.991-1.38-3.336-3.396-3.336\n c-24.79,0-49.577,0-74.362,0c-2.133,0-3.38,1.22-3.383,3.308c-0.006,3.754-0.011,7.509,0.005,11.262\n c-0.023,6.339-3.067,13.143-12.456,13.143c-9.389,0-14.337-4.647-14.915-13.23c-0.128-4.305,0.004-8.612,0.004-12.918\n c0-8.392,0-16.781,0-25.173c0-0.321,0.228-5.156,4.091-9.277c3.864-4.122,8.014-3.822,8.445-3.822\n c25.835,0.003,51.672,0.002,77.507,0.002c46.813,0.001,140.443,0.001,140.443,0.001s6.153-0.088,10.926-0.052\n c0.3-0.008,5.713,0.363,9.178,3.994c3.46,3.631,3.046,8.407,3.046,8.635c-0.007,12.862,0.079,25.725-0.003,38.587\n c-0.074,8.051-6.938,12.819-13.703,12.847C731.482,263.519,724.956,259.059,724.709,250.898z\"/>\n </g>\n </svg>\n }\n\n /*************\n * RENDERING *\n **************/\n render(){\n if (!this.props.visible) return null\n return (\n <div ref={this.inputGroupRef} \n style={{\n position:'fixed', \n top:this.state.top, \n left:this.state.left,\n cursor: 'pointer',\n }}\n >\n {/* <Button icon circular basic\n onClick={e => this.handleClick(e)}\n > */}\n {/* <Icon name=\"pencil\"\n onClick={e => this.handleClick(e)}\n /> */}\n {/* </Button> */}\n {this.renderDaviIcon()}\n </div>\n )\n }\n \n}\n\nexport default AnnoToolBar","import * as transform from './transform'\nimport * as annoStatus from '../types/annoStatus'\nimport * as modes from '../types/modes'\n\nexport function backendAnnosToCanvas(backendAnnos, imgSize){\n let annos = [\n ...backendAnnos.bBoxes.map((element) => {\n return {...element, type:'bBox', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE}\n }),\n ...backendAnnos.lines.map((element) => {\n return {...element, type:'line', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE}\n }),\n ...backendAnnos.polygons.map((element) => {\n return {...element, type:'polygon', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE}\n }),\n ...backendAnnos.points.map((element) => {\n return {...element, type:'point', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE\n }\n })\n ]\n annos = annos.map((el) => {\n return {...el, \n data: transform.toSia(el.data, imgSize, el.type)}\n })\n // this.setState({annos: [...annos]})\n return annos\n}\n\nexport function canvasToBackendAnnos(annos, imgSize, forBackendPost=false){\n let myAnnos = annos\n const bAnnos = myAnnos.map( el => {\n var annoId \n if (forBackendPost){\n // If an annotation will be send to backend,\n // ids of new created annoations need to be set to \n // undefined.\n annoId = (typeof el.id) === \"string\" ? undefined : el.id\n } else {\n annoId = el.id\n }\n return {\n ...el,\n id: annoId,\n mode: modes.VIEW,\n data: transform.toBackend(el.data, imgSize, el.type)\n }\n })\n\n const backendFormat = {\n bBoxes: bAnnos.filter((el) => {return el.type === 'bBox'}),\n lines: bAnnos.filter((el) => {return el.type === 'line'}),\n points: bAnnos.filter((el) => {return el.type === 'point'}),\n polygons: bAnnos.filter((el) => {return el.type === 'polygon'}),\n }\n return backendFormat\n}","export const EDIT_LABEL='editLabel'\nexport const DELETE_ANNO='deleteAnno'\nexport const ENTER_ANNO_ADD_MODE='enterAnnoAddMode'\nexport const LEAVE_ANNO_ADD_MODE='leaveAnnoAddMode'\nexport const UNDO='undo'\nexport const REDO='redo'\nexport const TRAVERSE_ANNOS='traverseAnnos'\nexport const CAM_MOVE_UP='camMoveUp'\nexport const CAM_MOVE_DOWN='camMoveDown'\nexport const CAM_MOVE_LEFT='camMoveLeft'\nexport const CAM_MOVE_RIGHT='camMoveRight'\nexport const CAM_MOVE_STOP='camMoveStop'\nexport const COPY_ANNOTATION='copyAnnotation'\nexport const PASTE_ANNOTATION='pasteAnnotation'\n\n\nclass KeyMapper{\n constructor(keyActionHandler=undefined){\n this.controlDown = false\n this.keyActionHandler = keyActionHandler\n }\n\n keyDown(key){\n switch (key){\n case 'Enter':\n this.triggerKeyAction(EDIT_LABEL)\n break\n case 'Delete':\n this.triggerKeyAction(DELETE_ANNO)\n break\n case 'Backspace':\n this.triggerKeyAction(DELETE_ANNO)\n break\n case 'Control':\n this.controlDown = true\n this.triggerKeyAction(ENTER_ANNO_ADD_MODE)\n break\n case 'z':\n if (this.controlDown){\n this.triggerKeyAction(UNDO)\n }\n break\n case 'r':\n if (this.controlDown){\n this.triggerKeyAction(REDO)\n }\n break\n case 'Tab':\n this.triggerKeyAction(TRAVERSE_ANNOS)\n break\n case 'w':\n this.triggerKeyAction(CAM_MOVE_UP)\n break\n case 's':\n this.triggerKeyAction(CAM_MOVE_DOWN)\n break\n case 'a':\n this.triggerKeyAction(CAM_MOVE_LEFT)\n break\n case 'd':\n this.triggerKeyAction(CAM_MOVE_RIGHT)\n break\n case 'c':\n if (this.controlDown){\n this.triggerKeyAction(COPY_ANNOTATION)\n }\n break\n case 'v':\n if (this.controlDown){\n this.triggerKeyAction(PASTE_ANNOTATION)\n }\n break\n default:\n break\n }\n }\n\n keyUp(key){\n switch (key){\n case 'Control':\n this.controlDown = false\n this.triggerKeyAction(LEAVE_ANNO_ADD_MODE)\n break\n default:\n break\n }\n }\n\n triggerKeyAction(keyAction){\n if (this.keyActionHandler){\n this.keyActionHandler(keyAction)\n }\n }\n\n}\n\nexport default KeyMapper","export const POINT = 'point'\nexport const BBOX = 'bBox'\nexport const LINE = 'line'\nexport const POLYGON = 'polygon'","class UndoRedo{\n constructor(maxElements=100){\n this.hist = []\n this.pointer = 0\n this.maxElements = maxElements\n }\n\n push(entry, description='No description'){\n const histEl = {\n entry,\n description\n }\n if (this.pointer !== 0){\n while (this.pointer !== 0){\n this.pointer--\n this.hist.shift()\n }\n }\n this.hist.unshift(histEl)\n if (this.hist.length > this.maxElements){\n this.hist.pop()\n }\n }\n\n undo(){\n if (this.pointer+1 < this.hist.length){\n // const element = \n this.pointer++\n return this.hist[this.pointer]\n } else {\n return this.hist[this.hist.length-1]\n }\n }\n\n undoMia(){\n if (this.pointer+1 < this.hist.length){\n this.pointer++\n return this.hist[this.pointer-1] \n } else {\n return this.hist[this.hist.length-1]\n }\n }\n\n redo(){\n if (this.pointer-1 >= 0){\n this.pointer--\n return this.hist[this.pointer]\n } else {\n return this.hist[0]\n }\n }\n\n getHist(){\n return this.hist\n }\n\n clearHist(){\n this.hist = []\n }\n\n isEmpty(){\n return this.hist.length === 0\n }\n\n}\n\nexport default UndoRedo","export function getViewportCoordinates(w, svg){\n const window = {\n xMin:-1*svg.translateX,\n xMax: -1*svg.translateX + (svg.width)/svg.scale,\n yMin: -1*svg.translateY,\n yMax: -1*svg.translateY + (svg.height)/svg.scale\n\n }\n const viewport = {\n xMin: 0,\n xMax: svg.width,\n yMin: 0,\n yMax: svg.height\n }\n const scaleX = (viewport.xMax - viewport.xMin)/ (window.xMax - window.xMin)\n const scaleY = (viewport.yMax - viewport.yMin)/ (window.yMax - window.yMin)\n\n const vX = viewport.xMin + (w.x - window.xMin) * scaleX\n const vY = viewport.yMin + (w.y - window.yMin) * scaleY\n return {window, viewport, vX, vY, scaleX, scaleY}\n}\n\n/**\n * \n * @param {*} w0 Point in image coordinate system\n * @param {*} svg Svg with old translation values and old scales\n * @param {*} s1 New scale/zoom\n */\nexport function getZoomTranslation(w0, svg, s1){\n const s0 = svg.scale\n let translation = {x:0,y:0}\n translation.x = (s0/s1) * (w0.x + svg.translateX) - w0.x \n translation.y = (s0/s1) * (w0.y + svg.translateY) - w0.y \n return translation\n}","import React, {Component} from 'react'\nimport _ from 'lodash'\nimport Annotation from './Annotation/Annotation'\nimport AnnoLabelInput from './AnnoLabelInput'\nimport ImgBar from './ImgBar'\nimport Prompt from './Prompt'\nimport LabelInput from './LabelInput'\nimport AnnoToolBar from './AnnoToolBar'\n\n\nimport * as annoConversion from './utils/annoConversion'\nimport * as keyActions from './utils/keyActions'\nimport KeyMapper from './utils/keyActions'\nimport * as TOOLS from './types/tools'\nimport * as modes from './types/modes'\nimport UndoRedo from './utils/hist'\nimport * as annoStatus from './types/annoStatus'\nimport * as canvasActions from './types/canvasActions'\nimport { Loader, Dimmer, Icon, Header, Button } from 'semantic-ui-react';\nimport * as mouse from './utils/mouse';\nimport * as colorlut from './utils/colorlut'\nimport * as notificationType from './types/notificationType'\nimport * as wv from './utils/windowViewport'\n\nimport './SIA.scss'\n\n\n/**\n * SIA Canvas element that handles annotations within an image\n * \n * @param {React.Ref} container - A react ref to a div that defines the\n * space where this Canvas lives in.\n * @param {object} annos - A json object containing all annotation \n * information for an image\n * {\n * image : {\n * id: int, \n * url: string, \n * number: int, \n * amount: int, \n * isFirst: bool, \n * isLast: bool\n * },\n * annotations: {\n * bBoxes: [{\n * id: int,\n * labelIds: list of int,\n * data: {}\n * },...],\n * points: []\n * lines: []\n * polygons: []\n * }\n * }\n * @param {object} possibleLabels - Possible labels that can be assigned to \n * an annotation.\n * { \n * id: int, \n * description: str, \n * label: str, (name of the label) \n * color: str (color is optional)\n * }\n * @param {object} image - The actual image blob that will be displayed\n * {id: int, data: blob}\n * @param {object} uiConfig - User interface configs \n * {nodesRadius: int, strokeWidth: int}\n * @param {int} layoutUpdate - A counter that triggers a layout update\n * everytime it is incremented.\n * @param {string} selectedTool - The tool that is selected to draw an \n * annotation. Possible choices are: 'bBox', 'point', 'line', 'polygon'\n * @param {object} canvasConfig - Configuration for this canvas\n * {\n * annos:{\n * tools: {\n * point: bool,\n * line: bool,\n * polygon: bool,\n * bbox: bool\n * },\n * multilabels: bool,\n * actions: {\n * draw: bool,\n * label: bool,\n * edit: bool,\n * },\n * maxAnnos: null or int,\n * minArea: int\n * },\n * img: {\n * multilabels: bool,\n * actions: {\n * label: bool,\n * }\n * }\n * }\n * @param {bool} imgBarVisible - Controls visibility of the ImgBar\n * @param {bool} imgLabelInputVisible - Controls visibility of the ImgLabelInputPrompt\n * @param {object} layoutOffset - Offset of the canvas inside the container:\n * {left:int, top:int, right:int, bottom:int} values in pixels.\n * @param {bool} centerCanvasInContainer - Center the canvas in the \n * middle of the container.\n * @param {str or int} defaultLabel (optional) - Name or ID of the default label that is used\n * when no label was selected by the annotator. If not set \"no label\" will be used.\n * If ID is used, it needs to be one of the possible label ids.\n * @param {bool} blocked Block canvas view with loading dimmer.\n * @event onSVGUpdate - Fires when the svg in canvas changed.\n * args: {width: int, height: int, scale: float, translateX: float,\n * translateY:float}\n * @event onImageLoaded - Fires when an image was loaded into the canvas\n * @event onAnnoSelect - Fires when an annotation was selected or if the\n * selected annotation was updated.\n * @event onImgBarClose - Fires when close button on ImgBar was hit.\n * @event onImgLabelInputClose - ImgLabelInput requests to be closed.\n * @event onNotification - Callback for Notification messages\n * args: {title: str, message: str, type: str}\n * @event onKeyDown - Fires for keyDown on canvas \n * @event onKeyUp - Fires for keyUp on canvas \n * @event onAnnoPerformedAction - Fires when an anno performed an action\n * args: {annoId: int, newAnnos: list of annoObjects, pAction: str}\n */\nclass Canvas extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n \n svg: {\n width: '100%',\n height: '100%',\n scale:1.0,\n translateX:0,\n translateY:0\n },\n image: {\n width: undefined,\n height: undefined\n },\n annos: [],\n mode: modes.VIEW,\n // selectedAnnoId: {id:undefined},\n selectedAnnoId: undefined,\n showSingleAnno: undefined,\n showLabelInput: false,\n imageLoaded: false,\n imgLoadCount: 0,\n imgLabelIds: [],\n imgLabelChanged: false,\n imgAnnoTime: 0,\n imgLoadTimestamp: 0,\n performedImageInit: false,\n prevLabel: [],\n imageData: undefined,\n isJunk: false,\n imgBarVisible:false,\n annoToolBarVisible: false,\n possibleLabels: undefined\n }\n this.img = React.createRef()\n this.svg = React.createRef()\n this.container = React.createRef()\n this.hist = new UndoRedo()\n this.keyMapper = new KeyMapper((keyAction) => this.handleKeyAction(keyAction))\n this.mousePosAbs = undefined\n this.clipboard = undefined\n }\n\n componentDidMount(){\n this.updatePossibleLabels()\n if (Number.isInteger(this.props.defaultLabel)){\n\n this.setState({prevLabel:[this.props.defaultLabel]})\n }\n }\n\n componentDidUpdate(prevProps, prevState){\n // if (this.props.image.id !== prevProps.image.id){\n \n // }\n if (prevProps.annos !== this.props.annos){\n this.setState({\n imgLabelIds: this.props.annos.image.labelIds,\n imgAnnoTime: this.props.annos.image.annoTime,\n imgLoadTimestamp: performance.now()\n // isJunk: this.props.annos.image.isJunk\n })\n // this.setState({\n // imageLoaded: false,\n // // imageData: undefined\n // })\n }\n if (prevProps.isJunk !== this.props.isJunk){\n if (this.state.isJunk !== this.props.isJunk){\n this.setState({\n isJunk: this.props.isJunk\n })\n }\n }\n if (this.state.imageData !== this.props.image.data){\n this.setState({imageData: this.props.image.data})\n }\n // if (!this.state.imageLoaded){\n // if(this.props.annos.image.id === this.props.image.id){\n // this.setState({\n // imageLoaded: true\n // })\n // if (this.props.onImageLoaded){\n // this.props.onImageLoaded()\n // }\n // }\n // }\n if (this.props.possibleLabels !== prevProps.possibleLabels){\n this.updatePossibleLabels()\n }\n if (this.state.performedImageInit){\n // Initialize canvas history\n this.setState({\n performedImageInit:false,\n annoToolBarVisible:false\n })\n if (this.props.imgBarVisible){\n this.setState({imgBarVisible:true})\n }\n this.hist.clearHist()\n this.hist.push({\n ...this.getAnnos(),\n selectedAnnoId: undefined\n }, 'init')\n }\n if (this.state.imageLoaded){\n // Selected annotation should be on top\n this.putSelectedOnTop(prevState)\n if (prevState.imgLoadCount !== this.state.imgLoadCount){\n this.updateCanvasView(this.props.annos.annotations)\n this.setImageLabels(this.props.annos.image.labelIds)\n this.setState({\n performedImageInit:true\n })\n } \n if(prevProps.layoutUpdate !== this.props.layoutUpdate){\n this.selectAnnotation(undefined)\n // this.updateCanvasView(this.getAnnoBackendFormat())\n this.updateCanvasView(annoConversion.canvasToBackendAnnos(\n this.state.annos, this.state.svg\n ))\n }\n \n }\n }\n\n onImageLoad(){\n this.setState({\n imageLoaded: true,\n imgLoadCount: this.state.imgLoadCount + 1,\n showLabelInput: false,\n showSingleAnno: undefined,\n selectedAnnoId: undefined\n })\n if (this.props.onImageLoaded){\n this.props.onImageLoaded()\n }\n }\n\n onMouseOver(){\n //Prevent scrolling on svg\n this.svg.current.focus()\n }\n\n onWheel(e){\n // Zoom implementation. Note that svg is first scaled and \n // second translated!\n const up = e.deltaY < 0\n const mousePos = this.getMousePosition(e)\n const zoomFactor=1.25\n let nextScale\n if (up) {\n nextScale = this.state.svg.scale * zoomFactor\n \n } else {\n nextScale = this.state.svg.scale / zoomFactor\n }\n let newTranslation\n //Constrain zoom\n if (nextScale < 1.0){\n nextScale = 1.0\n newTranslation = {x:0, y:0}\n } else if (nextScale > 200.0){\n nextScale = 200.0\n newTranslation = wv.getZoomTranslation(mousePos, this.state.svg, nextScale)\n } else {\n newTranslation = wv.getZoomTranslation(mousePos, this.state.svg, nextScale)\n }\n this.setState({svg: {\n ...this.state.svg,\n scale: nextScale,\n // translateX: -1*(mousePos.x * nextScale - mousePos.x)/nextScale,\n // translateY: -1*(mousePos.y * nextScale - mousePos.y)/nextScale\n translateX: newTranslation.x,\n translateY: newTranslation.y\n }})\n return false\n }\n\n onRightClick(e){\n e.preventDefault()\n }\n\n onMouseDown(e){\n if (e.button === 0){\n this.selectAnnotation(undefined)\n }\n else if (e.button === 1){\n this.setMode(modes.CAMERA_MOVE)\n }\n else if (e.button === 2){\n //Create annotation on right click\n this.createNewAnnotation(e)\n }\n }\n\n onAnnoMouseDown(e){\n if (e.button === 1){\n // this.collectAnnos()\n this.setMode(modes.CAMERA_MOVE)\n }\n else if (e.button === 2){\n //Create annotation on right click\n this.createNewAnnotation(e)\n }\n else if (e.button === 0){\n if (this.state.showLabelInput){\n const anno = this.findAnno(this.state.selectedAnnoId)\n this.updateSelectedAnno(anno, modes.VIEW)\n this.showSingleAnno(undefined)\n this.showLabelInput(false)\n }\n }\n }\n\n onMouseUp(e){\n switch (e.button){\n case 1:\n this.setMode(modes.VIEW)\n break\n default:\n break\n }\n }\n\n handleKeyAction(action){\n const anno = this.findAnno(this.state.selectedAnnoId)\n const camKeyStepSize = 20 * this.state.svg.scale\n\n switch(action){\n case keyActions.EDIT_LABEL:\n // Need to get the newest version of annotation data directly \n // from annotation object, when editing label/ hitting enter\n // in create mode, since annotation data in canvas are not updated\n // to this point in time. \n const ar = this.findAnnoRef(this.state.selectedAnnoId)\n let myAnno = undefined\n if (ar !== undefined){\n myAnno = ar.current.myAnno.current.getResult()\n }\n this.editAnnoLabel(myAnno)\n break\n case keyActions.DELETE_ANNO:\n if (anno){\n if (anno.mode === modes.CREATE){\n const ar = this.findAnnoRef(this.state.selectedAnnoId)\n if (ar !== undefined) ar.current.myAnno.current.removeLastNode()\n\n } else {\n this.onAnnoPerformedAction(anno, canvasActions.ANNO_DELETED)\n }\n }\n break\n case keyActions.ENTER_ANNO_ADD_MODE:\n if (anno){\n this.updateSelectedAnno(\n anno, modes.ADD\n )\n // this.showSingleAnno(anno.id)\n }\n break\n case keyActions.LEAVE_ANNO_ADD_MODE:\n if (anno){\n this.updateSelectedAnno(\n anno, modes.VIEW\n )\n // this.showSingleAnno(undefined)\n }\n break\n case keyActions.UNDO:\n this.undo()\n break\n case keyActions.REDO:\n this.redo()\n break\n case keyActions.TRAVERSE_ANNOS:\n this.traverseAnnos()\n break\n case keyActions.CAM_MOVE_LEFT:\n // this.setMode(modes.CAMERA_MOVE)\n this.moveCamera(camKeyStepSize, 0)\n break\n case keyActions.CAM_MOVE_RIGHT:\n this.moveCamera(-camKeyStepSize, 0)\n break\n case keyActions.CAM_MOVE_UP:\n this.moveCamera(0, camKeyStepSize)\n break\n case keyActions.CAM_MOVE_DOWN:\n this.moveCamera(0, -camKeyStepSize)\n break\n case keyActions.CAM_MOVE_STOP:\n // this.setMode(modes.VIEW)\n break\n case keyActions.COPY_ANNOTATION:\n this.copyAnnotation()\n break\n case keyActions.PASTE_ANNOTATION:\n this.pasteAnnotation(0)\n break\n default:\n console.warn('Unknown key action', action)\n }\n\n }\n\n onKeyDown(e){\n e.preventDefault()\n this.keyMapper.keyDown(e.key)\n // this.findAnno(this.state.selectedAnnoId)\n if (this.props.onKeyDown){\n this.props.onKeyDown(e)\n }\n }\n\n onKeyUp(e){\n e.preventDefault()\n this.keyMapper.keyUp(e.key)\n if (this.props.onKeyUp){\n this.props.onKeyUp(e)\n }\n }\n\n onMouseMove(e){\n if (this.state.mode === modes.CAMERA_MOVE){\n this.moveCamera(e.movementX, e.movementY)\n }\n }\n\n onLabelInputDeleteClick(annoId){\n this.removeSelectedAnno()\n }\n \n \n\n /**\n * Handle actions that have been performed by an annotation \n * @param {Number} anno Id of the annotation\n * @param {String} pAction Action that was performed\n */\n onAnnoPerformedAction(anno, pAction){\n let newAnnos = undefined\n switch(pAction){\n case canvasActions.ANNO_SELECTED:\n this.selectAnnotation(anno.id)\n break\n case canvasActions.ANNO_START_CREATING:\n newAnnos = this.updateSelectedAnno(anno)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_CREATED:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.showSingleAnno(undefined)\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_MOVED:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.showSingleAnno(undefined)\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_ENTER_MOVE_MODE:\n anno = this.startAnnotimeMeasure(anno)\n this.updateSelectedAnno(anno, modes.MOVE)\n this.showSingleAnno(anno.id)\n this.setState({annoToolBarVisible:false})\n break\n case canvasActions.ANNO_ENTER_EDIT_MODE:\n anno = this.startAnnotimeMeasure(anno)\n this.updateSelectedAnno(anno, modes.EDIT)\n // this.showSingleAnno(anno.id)\n this.setState({annoToolBarVisible:false})\n break\n case canvasActions.ANNO_ADDED_NODE:\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_REMOVED_NODE:\n if (!this.checkAnnoLength(anno)){\n newAnnos = this.updateSelectedAnno(anno, modes.DELETED)\n this.showSingleAnno(undefined)\n } else {\n newAnnos = this.updateSelectedAnno(anno, modes.CREATE)\n }\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_EDITED:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_DELETED:\n newAnnos = this.updateSelectedAnno(anno, modes.DELETED)\n this.selectAnnotation(undefined)\n this.showSingleAnno(undefined)\n this.pushHist(\n newAnnos, undefined,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_LABEL_UPDATE:\n anno = this.stopAnnotimeMeasure(anno)\n if (!this.checkAnnoLength(anno)){\n newAnnos = this.updateSelectedAnno(anno, modes.DELETED)\n } else {\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n }\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_CREATED_NODE:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.CREATE)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_CREATED_FINAL_NODE:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.showSingleAnno(undefined)\n this.setState({annoToolBarVisible:true})\n break\n default:\n console.warn('Action not handeled', pAction)\n break\n }\n if (this.props.onAnnoPerformedAction){\n this.props.onAnnoPerformedAction(anno.id, newAnnos, pAction)\n }\n }\n\n onAnnoLabelInputUpdate(anno){\n this.updateSelectedAnno(anno)\n }\n\n onAnnoLabelInputClose(){\n this.svg.current.focus()\n this.showLabelInput(false)\n this.showSingleAnno(undefined)\n const anno = this.findAnno(this.state.selectedAnnoId)\n this.onAnnoPerformedAction(anno, canvasActions.ANNO_LABEL_UPDATE)\n }\n\n handleImgBarClose(){\n if (this.props.onImgBarClose){\n this.props.onImgBarClose()\n }\n }\n\n handleImgLabelUpdate(label){\n this.setState({\n imgLabelIds: label,\n imgLabelChanged: true,\n })\n this.pushHist(this.state.annos,\n this.state.selectedAnnoId,\n canvasActions.IMG_LABEL_UPDATE,\n this.state.showSingleAnno,\n label\n )\n }\n\n handleCanvasClick(e){\n if (this.props.imgBarVisible){\n this.setState({imgBarVisible:true})\n }\n }\n\n handleImgBarMouseEnter(e){\n this.setState({imgBarVisible:false})\n }\n\n handleImgLabelInputClose(){\n if (this.props.onImgLabelInputClose){\n this.props.onImgLabelInputClose()\n }\n }\n\n handleSvgMouseMove(e){\n this.mousePosAbs = mouse.getMousePositionAbs(e, this.state.svg)\n }\n\n handleNotification(messageObj){\n if (this.props.onNotification){\n this.props.onNotification(messageObj)\n }\n }\n\n /*************\n * LOGIC *\n **************/\n copyAnnotation(){\n this.clipboard = this.findAnno(this.state.selectedAnnoId)\n this.handleNotification({\n title: \"Copyed annotation to clipboard\",\n message: 'Copyed '+this.clipboard.type,\n type: notificationType.SUCCESS\n })\n }\n\n pasteAnnotation(offset=0){\n if (this.clipboard){\n let annos = [...this.state.annos]\n const uid = _.uniqueId('new')\n annos.push({\n ...this.clipboard,\n id: uid,\n annoTime: 0,\n status: annoStatus.NEW,\n data: this.clipboard.data.map(e => {\n return {x: e.x+offset, y: e.y+offset}\n })\n })\n this.setState({annos: annos, selectedAnnoId: uid})\n this.handleNotification({\n title: \"Pasted annotation to canvas\",\n message: 'Pasted and selected '+this.clipboard.type,\n type: notificationType.SUCCESS\n })\n }\n }\n\n\n checkAnnoLength(anno){\n if (anno.type === 'polygon' && anno.data.length < 3){\n this.handleNotification({\n title: \"Invalid polygon!\",\n message: 'A vaild polygon needs at least 3 points!',\n type: notificationType.WARNING\n })\n return false\n } \n // if (anno.type === 'line' && anno.data.length < 2){\n // this.handleNotification({\n // title: \"Invalid line!\",\n // message: 'A vaild line needs at least 2 points!',\n // type: notificationType.WARNING\n // })\n // return false\n // } \n return true\n }\n\n startAnnotimeMeasure(anno){\n anno.timestamp = performance.now()\n return anno\n }\n \n stopAnnotimeMeasure(anno){\n if (anno.timestamp === undefined){\n console.error('No timestamp for annotime measurement. Check if you started measurement', anno)\n return undefined\n } else {\n let now = performance.now()\n anno.annoTime += (now - anno.timestamp) / 1000\n anno.timestamp = now\n return anno\n }\n }\n\n updatePossibleLabels(){\n if (!this.props.possibleLabels) return\n if (this.props.possibleLabels.length <= 0) return\n let lbls = this.props.possibleLabels\n if (!('color' in lbls[0])){\n lbls = lbls.map(e => {\n return {\n ...e, color: colorlut.getColor(e.id)}\n })\n }\n this.setState({\n possibleLabels: [...lbls]\n })\n }\n\n editAnnoLabel(anno){\n if (this.state.selectedAnnoId){\n let myAnno\n if (anno === undefined){\n myAnno = this.findAnno(this.state.selectedAnnoId)\n } else {\n myAnno = {...anno}\n }\n myAnno = this.startAnnotimeMeasure(myAnno)\n this.showLabelInput()\n this.updateSelectedAnno(myAnno, modes.EDIT_LABEL)\n }\n }\n unloadImage(){\n if(this.state.imageLoaded){\n this.setState({imageLoaded:false})\n }\n }\n /**\n * Find a annotation by id in current state\n * \n * @param {int} annoId - Id of the annotation to find\n */\n findAnno(annoId){\n return this.state.annos.find(e => {\n return e.id === annoId\n })\n }\n\n findAnnoRef(annoId){\n if (this.state.selectedAnnoId === undefined) return undefined\n return this.annoRefs.find(e => {\n if (e.current){\n return e.current.isSelected()\n } else {\n return false\n }\n })\n }\n\n pushHist(annos, selectedAnnoId, pAction, showSingleAnno, imgLabelIds=this.state.imgLabelIds){\n this.hist.push({\n ...this.getAnnos(annos, false),\n selectedAnnoId: selectedAnnoId,\n showSingleAnno: showSingleAnno,\n imgLabelIds: imgLabelIds\n }, pAction)\n }\n\n undo(){\n if (!this.hist.isEmpty()){\n const cState = this.hist.undo()\n this.setCanvasState(\n cState.entry.annotations,\n cState.entry.imgLabelIds, \n cState.entry.selectedAnnoId,\n cState.entry.showSingleAnno)\n }\n }\n\n redo(){\n if (!this.hist.isEmpty()){\n const cState = this.hist.redo()\n this.setCanvasState(\n cState.entry.annotations,\n cState.entry.imgLabelIds, \n cState.entry.selectedAnnoId,\n cState.entry.showSingleAnno)\n }\n }\n\n deleteAllAnnos(){\n let newAnnos = []\n this.state.annos.forEach( e => {\n if ((typeof e.id) !== \"string\"){\n newAnnos.push(\n {...e, status: annoStatus.DELETED}\n )\n }\n })\n this.pushHist(newAnnos, undefined, 'deletedAllAnnos', this.state.showSingleAnno, this.state.imgLabelIds)\n this.setState({annos: newAnnos})\n this.selectAnnotation(undefined)\n this.showSingleAnno(undefined)\n }\n\n /**\n * Set state of Canvas annotations and imageLabels.\n * \n * @param {list} annotations - Annotations in backend format\n * @param {list} imgLabelIds - IDs of the image labels\n * @param {object} selectedAnno - The selected annotation\n * @param {int} showSingleAnno - The id of the single annotation\n * that should be visible\n */\n setCanvasState(annotations, imgLabelIds, selectedAnnoId, showSingleAnno){\n this.updateCanvasView({...annotations})\n this.setImageLabels([...imgLabelIds])\n this.selectAnnotation(selectedAnnoId)\n this.setState({showSingleAnno: showSingleAnno})\n }\n\n selectAnnotation(annoId){\n if (annoId){\n const anno = this.findAnno(annoId)\n this.setState({\n selectedAnnoId: annoId\n })\n if (anno){\n if (anno.mode !== modes.CREATE){\n this.setState({\n annoToolBarVisible: true\n })\n }\n }\n } else {\n this.setState({\n selectedAnnoId: undefined,\n annoToolBarVisible: false\n })\n if (this.state.showLabelInput){\n this.onAnnoLabelInputClose()\n }\n }\n if(this.props.onAnnoSelect){\n const anno = this.findAnno(annoId)\n this.props.onAnnoSelect(anno)\n }\n }\n\n /**\n * Traverse annotations by key hit\n */\n traverseAnnos(){\n if (this.state.annos.length > 0){\n const myAnnos = this.state.annos.filter(e => {\n return e.status !== annoStatus.DELETED\n })\n if (myAnnos.length > 0){\n if (!this.state.selectedAnnoId){\n this.selectAnnotation(myAnnos[0].id)\n } else {\n let currentIdx = myAnnos.findIndex( e => {\n return e.id === this.state.selectedAnnoId\n })\n if (currentIdx+1 < myAnnos.length){\n this.selectAnnotation(myAnnos[currentIdx+1].id)\n } else {\n this.selectAnnotation(myAnnos[0].id)\n }\n }\n }\n }\n } \n\n getAnnos(annos=undefined, removeFrontedIds=true){\n const myAnnos = annos ? annos : this.state.annos\n // const backendFormat = this.getAnnoBackendFormat(removeFrontedIds, myAnnos)\n const backendFormat = annoConversion.canvasToBackendAnnos(myAnnos, this.state.svg, removeFrontedIds)\n const finalData = {\n imgId: this.props.annos.image.id,\n imgLabelIds: this.state.imgLabelIds,\n imgLabelChanged: this.state.imgLabelChanged,\n annotations: backendFormat,\n isJunk: this.state.isJunk,\n annoTime: this.props.annos.image.annoTime + (performance.now() - this.state.imgLoadTimestamp)/1000\n }\n return finalData\n }\n\n /**\n * Reset zoom level on Canvas\n */\n resetZoom(){\n this.setState({svg: {\n ...this.state.svg,\n translateX: 0,\n translateY: 0,\n scale: 1.0\n }})\n }\n\n moveCamera(movementX, movementY){\n let trans_x = this.state.svg.translateX + movementX / this.state.svg.scale\n let trans_y = this.state.svg.translateY + movementY / this.state.svg.scale\n const vXMin = this.state.svg.width * 0.25\n const vXMax = this.state.svg.width * 0.75\n const yXMin = this.state.svg.height * 0.25\n const yXMax = this.state.svg.height * 0.75\n const vLeft = wv.getViewportCoordinates({x:0, y:0}, this.state.svg)\n const vRight = wv.getViewportCoordinates({x:this.state.svg.width, y:this.state.svg.height}, this.state.svg)\n if (vLeft.vX >= vXMin){\n trans_x = this.state.svg.translateX - 5\n } else if (vRight.vX <= vXMax){\n trans_x = this.state.svg.translateX +5\n } \n if (vLeft.vY >= yXMin){\n trans_y = this.state.svg.translateY - 5\n } else if (vRight.vY <= yXMax){\n trans_y= this.state.svg.translateY +5\n } \n this.setState({svg: {\n ...this.state.svg,\n translateX: trans_x,\n translateY: trans_y\n }})\n }\n\n setMode(mode){\n if (this.state.mode !== mode){\n this.setState({mode: mode})\n }\n }\n \n getMousePosition(e){\n const absPos = this.getMousePositionAbs(e)\n return {\n x: (absPos.x )/this.state.svg.scale - this.state.svg.translateX,\n y: (absPos.y )/this.state.svg.scale - this.state.svg.translateY\n }\n }\n\n getMousePositionAbs(e){\n return {\n x: (e.pageX - this.svg.current.getBoundingClientRect().left),\n y: (e.pageY - this.svg.current.getBoundingClientRect().top)\n }\n }\n\n showLabelInput(visible=true){\n this.setState({\n showLabelInput: visible\n })\n if (visible){\n this.showSingleAnno(this.state.selectedAnnoId)\n }\n }\n\n createNewAnnotation(e){\n //Do not create new Annotation if controlKey was pressed!\n let allowed = false\n if (this.keyMapper.controlDown) return\n if (this.props.selectedTool){\n const maxAnnos = this.props.canvasConfig.annos.maxAnnos\n if (maxAnnos){\n if (this.state.annos.length < maxAnnos){\n allowed = true\n } else {\n console.warn('Maximum number of annotations reached! MaxAnnos:', maxAnnos)\n this.handleNotification({\n title: 'Maximum number of annotations reached!',\n message: `Only ${maxAnnos} annotations per image are allowed by config` ,\n type: notificationType.WARNING\n })\n }\n } else {\n allowed = true\n }\n } else {\n console.warn('No annotation tool selected!')\n this.handleNotification({\n title: 'No tool selected!',\n message: 'Please select an annotation tool in the toolbar.',\n type: notificationType.INFO\n })\n }\n if (allowed){\n const mousePos = this.getMousePosition(e)\n // const selAnno = this.findAnno(this.state.selectedAnnoId)\n let newAnno = {\n id: _.uniqueId('new'),\n type: this.props.selectedTool,\n data: [{\n x: mousePos.x, \n y: mousePos.y\n },{\n x: mousePos.x,\n y: mousePos.y\n }],\n mode: modes.CREATE,\n status: annoStatus.NEW,\n labelIds: this.state.prevLabel,\n selectedNode: 1,\n annoTime: 0.0\n }\n newAnno = this.startAnnotimeMeasure(newAnno)\n this.setState({\n annos: [...this.state.annos, newAnno],\n selectedAnnoId: newAnno.id,\n showSingleAnno: newAnno.id,\n annoToolBarVisible: false\n })\n if (this.props.selectedTool !== TOOLS.BBOX && \n this.props.selectedTool !== TOOLS.POINT){ \n const merged = this.mergeSelectedAnno(newAnno)\n this.pushHist(\n merged.newAnnos,\n newAnno.id, \n canvasActions.ANNO_CREATED_NODE,\n newAnno.id\n )\n }\n } \n }\n\n putSelectedOnTop(prevState){\n // The selected annotation need to be rendered as last one in \n // oder to be above all other annotations.\n if (this.state.selectedAnnoId){\n if (prevState.selectedAnnoId !== this.state.selectedAnnoId){\n const annos = this.state.annos.filter( (el) => {\n return el.id !== this.state.selectedAnnoId\n })\n const lastAnno = this.state.annos.find( el => {\n return el.id === this.state.selectedAnnoId\n })\n annos.push(lastAnno)\n this.setState({annos: [\n ...annos\n ]})\n }\n }\n }\n\n getLabel(lblId){\n return this.state.possibleLabels.find( e => {\n return e.id === lblId\n })\n }\n\n getAnnoColor(){\n if (this.state.selectedAnnoId){\n const anno = this.findAnno(this.state.selectedAnnoId)\n if (anno){\n if (anno.labelIds.length > 0){\n return this.getLabel(anno.labelIds[0]).color\n }\n } \n }\n return colorlut.getDefaultColor()\n }\n\n /**\n * Update selected anno and override mode if desired\n * \n * @param {object} anno - The new annotation the becomes the selected anno\n * @param {string} mode - The new mode for the selected anno\n * @returns The new anno that was set as selectedAnno in state and \n * the new annos list that was set in state\n */\n updateSelectedAnno(anno, mode=undefined){\n if (!anno) return\n const {newAnnos, newAnno} = this.mergeSelectedAnno(anno, mode)\n this.setState({\n annos: newAnnos,\n selectedAnnoId: anno.id,\n prevLabel: anno.labelIds, \n })\n if(this.props.onAnnoSelect){\n if (newAnno !== null){\n this.props.onAnnoSelect(newAnno)\n }\n }\n return newAnnos\n }\n\n mergeSelectedAnno(anno, mode=undefined){\n const filtered = this.state.annos.filter( (el) => {\n return el.id !== anno.id\n }) \n let newAnno\n if (mode){\n newAnno = {...anno, mode:mode}\n if (mode === modes.DELETED){\n if (anno.status !== annoStatus.NEW){\n newAnno = {\n ...newAnno,\n status: annoStatus.DELETED\n }\n } else {\n newAnno = null\n }\n } else {\n newAnno = {\n ...newAnno,\n status: anno.status !== annoStatus.NEW ? annoStatus.CHANGED : annoStatus.NEW\n }\n }\n } else {\n newAnno = {...anno}\n }\n if (newAnno !== null){\n filtered.push(newAnno)\n }\n const newAnnos = [...filtered]\n return {newAnnos, newAnno}\n }\n\n showSingleAnno(annoId){\n if (this.state.showSingleAnno !== annoId){\n this.setState({showSingleAnno: annoId})\n } \n }\n\n updateImageSize(){\n \n var container = this.props.container.current.getBoundingClientRect()\n \n // if (container.left < this.props.uiConfig.toolBarWidth){\n // canvasLeft = this.props.uiConfig.toolBarWidth + 10\n // } else {\n // canvasLeft = container.left\n // }\n // var clientWidth = document.documentElement.clientWidth\n var clientHeight = document.documentElement.clientHeight\n var canvasTop\n var canvasLeft\n var maxImgHeight\n var maxImgWidth \n if(this.props.layoutOffset){\n canvasTop = container.top + this.props.layoutOffset.top\n canvasLeft = container.left + this.props.layoutOffset.left\n maxImgHeight = clientHeight - container.top - this.props.layoutOffset.bottom - this.props.layoutOffset.top\n maxImgWidth = container.right -canvasLeft - this.props.layoutOffset.right\n } else {\n canvasTop = container.top\n canvasLeft = container.left\n maxImgHeight = clientHeight - container.top\n maxImgWidth = container.right -canvasLeft\n }\n // if (this.props.appliedFullscreen) maxImgHeight = maxImgHeight + 10 \n var ratio = this.img.current.naturalWidth / this.img.current.naturalHeight\n var imgWidth = \"100%\"\n var imgHeight = \"100%\"\n if (maxImgHeight * ratio > maxImgWidth){\n imgWidth = maxImgWidth\n imgHeight = maxImgWidth / ratio\n } else {\n imgWidth = maxImgHeight * ratio\n imgHeight = maxImgHeight\n }\n if (this.props.centerCanvasInContainer){\n const resSpaceX = maxImgWidth - imgWidth\n if (resSpaceX > 2){\n canvasLeft = canvasLeft + resSpaceX / 2\n }\n const resSpaceY = maxImgHeight - imgHeight\n if (resSpaceY > 2){\n canvasTop = canvasTop + resSpaceY / 2\n }\n }\n const svg = {\n ...this.state.svg, width : imgWidth, height: imgHeight,\n left: canvasLeft, top: canvasTop\n }\n this.setState({\n svg,\n image:{\n width: this.img.current.naturalWidth,\n height: this.img.current.naturalHeight,\n }\n })\n this.svgUpdate(svg)\n return {imgWidth, imgHeight}\n }\n\n svgUpdate(svg){\n if(this.props.onSVGUpdate){\n this.props.onSVGUpdate(svg)\n }\n }\n\n setImageLabels(labelIds){\n if (labelIds !== this.state.imgLabelIds){\n this.setState({\n imgLabelIds: labelIds\n })\n }\n }\n\n updateCanvasView(annotations){\n \n\n var annos = []\n //Annotation data should be present and a pixel accurate value \n //for svg should be calculated\n if(annotations){\n const imgSize = this.updateImageSize()\n this.setState({annos: [...annoConversion.backendAnnosToCanvas(annotations, {width: imgSize.imgWidth, height:imgSize.imgHeight})]})\n }\n }\n\n renderAnnotations(){\n // Do not render annotations while moving the camera!\n if (this.state.mode !== modes.CAMERA_MOVE){\n this.annoRefs = []\n const annos = this.state.annos.map((el) => {\n this.annoRefs.push(React.createRef())\n return <Annotation type={el.type} \n data={el} key={el.id} svg={{...this.state.svg}}\n ref={this.annoRefs[this.annoRefs.length - 1]}\n onMouseDown={e => this.onAnnoMouseDown(e)}\n onAction={(anno, pAction) => this.onAnnoPerformedAction(anno, pAction)}\n selectedAnno={this.state.selectedAnnoId}\n // onModeChange={(anno) => this.onAnnoModeChange(anno)}\n showSingleAnno={this.state.showSingleAnno}\n uiConfig={this.props.uiConfig}\n allowedActions={this.props.canvasConfig.annos.actions}\n possibleLabels={this.state.possibleLabels}\n image={this.state.image}\n canvasConfig={this.props.canvasConfig}\n onNotification={(messageObj) => this.handleNotification(messageObj) }\n defaultLabel={this.props.defaultLabel}\n />\n })\n return <g>{annos}</g>\n } else {\n return null\n }\n \n }\n\n renderImgLabelInput(){\n if (!this.props.annos.image) return null\n return <Prompt \n onClick={() => this.handleImgLabelInputClose()}\n active={this.props.imgLabelInputVisible}\n header={<div>\n Add label for the whole image\n </div>}\n content={<div>\n <LabelInput\n // multilabels={true}\n multilabels={this.props.canvasConfig.img.multilabels}\n // relatedId={this.props.annos.image.id}\n visible={true}\n onLabelUpdate={label => this.handleImgLabelUpdate(label)}\n possibleLabels={this.state.possibleLabels}\n initLabelIds={this.state.imgLabelIds}\n relatedId={this.props.annos.image.id}\n defaultLabel={this.props.defaultLabel}\n // disabled={!this.props.allowedActions.label}\n // renderPopup\n />\n <Button basic color=\"green\" inverted\n onClick={() => this.handleImgLabelInputClose()}\n >\n <Icon name='check'></Icon>\n OK\n </Button>\n </div>}\n />\n }\n\n renderAnnoToolBar(selectedAnno){\n let visible = this.state.annoToolBarVisible\n if (this.state.mode === modes.CAMERA_MOVE) visible = false\n return <AnnoToolBar visible={visible} \n selectedAnno={selectedAnno}\n svg={this.state.svg}\n onClick={() => this.editAnnoLabel()}\n color={this.getAnnoColor()}\n />\n }\n\n renderAnnoLabelInpput(selectedAnno){\n let visible = this.state.showLabelInput\n if (this.state.mode === modes.CAMERA_MOVE) visible = false\n return <AnnoLabelInput svg={this.state.svg} \n // svgRef={this.svg}\n onClose={() => this.onAnnoLabelInputClose()}\n onDeleteClick={annoId => this.onLabelInputDeleteClick(annoId)}\n selectedAnno={selectedAnno}\n visible={visible}\n onLabelUpdate={anno => this.onAnnoLabelInputUpdate(anno)}\n possibleLabels={this.state.possibleLabels}\n allowedActions={this.props.canvasConfig.annos.actions}\n multilabels={this.props.canvasConfig.annos.multilabels}\n mousePos={this.mousePosAbs}\n defaultLabel={this.props.defaultLabel}\n // multilabels={true}\n />\n }\n render(){\n const selectedAnno = this.findAnno(this.state.selectedAnnoId)\n return(\n <div ref={this.container} >\n <div height={this.state.svg.height} \n style={{position: 'fixed', top: this.state.svg.top, left: this.state.svg.left}}\n >\n {this.renderImgLabelInput()}\n <ImgBar container={this.container} \n visible={this.state.imgBarVisible}\n possibleLabels={this.state.possibleLabels}\n annos={this.props.annos}\n svg={this.state.svg}\n onClose={() => this.handleImgBarClose()}\n imgLabelIds={this.state.imgLabelIds}\n // onLabelUpdate={label => this.handleImgLabelUpdate(label)}\n // imgLabelIds={this.state.imgLabelIds}\n // multilabels={this.props.canvasConfig.img.multilabels}\n // allowedActions={this.props.canvasConfig.img.actions}\n onMouseEnter={e => this.handleImgBarMouseEnter(e)}\n />\n <Dimmer active={!this.state.imageLoaded||this.props.blocked}><Loader>Loading</Loader></Dimmer>\n <Dimmer active={this.state.isJunk}>\n <Header as='h2' icon inverted>\n <Icon name='ban' />\n Marked as Junk\n </Header>\n </Dimmer>\n {this.renderAnnoToolBar(selectedAnno)}\n {/* <div style={{position: 'fixed', top: this.props.container.top, left: this.props.container.left}}> */}\n {this.renderAnnoLabelInpput(selectedAnno)}\n <svg ref={this.svg} width={this.state.svg.width} \n height={this.state.svg.height}\n onKeyDown={e => this.onKeyDown(e)}\n onKeyUp={e => this.onKeyUp(e)}\n onClick={e => this.handleCanvasClick(e)}\n onMouseMove={e => this.handleSvgMouseMove(e)}\n tabIndex=\"0\"\n >\n <g \n transform={`scale(${this.state.svg.scale}) translate(${this.state.svg.translateX}, ${this.state.svg.translateY})`}\n onMouseOver={() => {this.onMouseOver()}}\n onMouseUp={(e) => {this.onMouseUp(e)}}\n onWheel={(e) => this.onWheel(e)}\n onMouseMove={(e) => {this.onMouseMove(e)}}\n >\n <image\n onContextMenu={(e) => this.onRightClick(e)}\n onMouseDown={(e) => this.onMouseDown(e)}\n href={this.props.image.data} \n width={this.state.svg.width} \n height={this.state.svg.height}\n />\n {this.renderAnnotations()}\n </g>\n </svg>\n <img \n alt='sia' style={{display:'none'}} ref={this.img} \n onLoad={() => {this.onImageLoad()}} src={this.state.imageData}\n width=\"100%\" height=\"100%\"\n />\n {/* </div> */}\n </div>\n {/* Placeholder for Layout*/}\n <div style={{minHeight: this.state.svg.height}}></div> \n </div>)\n }\n}\n\nexport default Canvas"],"names":["toSia","data","image","type","w","width","h","height","x0","x","y0","y","map","e","toBackend","xList","yList","minX","Math","min","maxX","max","minY","maxY","warn","getArea","scaledImg","originalImg","relData","abs","undefined","area","length","j","i","move","movementX","movementY","getMostLeftPoint","Infinity","minXList","forEach","el","push","getTopPoint","minYList","correctAnnotation","corrected","VIEW","EDIT","CREATE","MOVE","ADD","CAMERA_MOVE","EDIT_LABEL","DELETED","defaultFontSize","defaultRectHeight","AnnoBar","props","state","textRef","React","createRef","mode","modes","setPosition","preventDefault","onClick","topPoint","transform","anno","current","text","getBoundingClientRect","textPadding","rectWidth","svg","scale","setState","ceil","top","left","label","possibleLabels","labelObject","labelIds","lbl","idx","find","id","defaultLabel","Number","isInteger","style","handleClick","fontSize","Component","InfSelectionArea","enable","enableSelArea","disableSelArea","onMouseMove","onMouseUp","selAreaCss","CREATE_NODE","EDIT_NODE","NORMAL_NODE","Node","getCursorStyle","prevProps","isPoint","turnSelAreaOn","turnHaloOn","button","turnSelAreaOff","stopPropagation","onMouseDown","isSelected","turnHaloOff","onDoubleClick","onMouseLeave","cursorstyles","haloCss","r","onContextMenu","handleMouseLeave","renderHalo","className","onMouseOver","renderNodes","ANNO_DELETED","ANNO_SELECTED","ANNO_CREATED","ANNO_MOVED","ANNO_ENTER_MOVE_MODE","ANNO_EDITED","ANNO_ENTER_EDIT_MODE","ANNO_ADDED_NODE","ANNO_REMOVED_NODE","ANNO_LABEL_UPDATE","ANNO_CREATED_NODE","ANNO_CREATED_FINAL_NODE","ANNO_START_CREATING","IMG_LABEL_UPDATE","Point","newAnno","requestModeChange","performedAction","canvasActions","pAction","onAction","onModeChangeRequest","selectedNode","onNodeMouseDown","renderPoint","renderNode","renderInfSelectionArea","getMousePosition","absPos","getMousePositionAbs","translateX","translateY","pageX","pageY","BBox","mousePos","mouse","idxMinus","idxPlus","newAnnoData","join","toPolygonStr","onNodeMouseUp","onNodeMouseMove","handleNodeMouseLeave","renderPolygon","Edge","p1","p2","closingEdge","strokeWidth","Polygon","updateAnnoByMousePos","addNode","mPos","slice","oldRest","concat","onNodeDoubleClick","edges","onEdgeMouseDown","renderEdges","Line","fill","renderPolyline","NEW","DATABASE","CHANGED","colors20","colors","nColors","getColor","n","getDefaultColor","allowedToLabel","allowedActions","allowedToEdit","status","annoStatus","edit","INFO","SUCCESS","WARNING","Annotation","myAnno","showSingleAnno","setVisible","setMode","messageObj","onNotification","canvasConfig","annos","minArea","notify","round","notificationType","constraints","setAnnoMode","visible","visibility","selectedAnno","lblId","getLabel","color","colorlut","uiConfig","nodeRadius","getStyle","getCssClass","handleModeChangeRequest","performedAnnoAction","onNodeClick","error","annoType","renderAnnoBar","renderAnno","LabelInput","inputRef","updatePossibleLabels","initLabelIds","performInit","prevState","focusOnRender","click","confirmLabel","annoLabelUpdate","closeLabelInput","relatedId","performKeyAction","key","item","multilabels","value","event","onItemClick","unshift","onLabelUpdate","filter","val","onClose","onKeyDown","onChange","opacity","disabled","open","__html","description","renderLabelInfo","renderPopup","renderLabelInput","renderPopupContent","AnnoLabelInput","inputGroupRef","position","updateAnnoLabel","ImgBar","onMouseEnter","imgLabelIds","url","handleMouseEnter","justifyContent","alignItems","split","pop","number","amount","renderImgLabels","Prompt","active","zIndex","header","content","AnnoToolBar","inputRect","renderDaviIcon","backendAnnosToCanvas","backendAnnos","imgSize","bBoxes","element","lines","polygons","points","canvasToBackendAnnos","forBackendPost","myAnnos","bAnnos","annoId","backendFormat","DELETE_ANNO","ENTER_ANNO_ADD_MODE","LEAVE_ANNO_ADD_MODE","UNDO","REDO","TRAVERSE_ANNOS","CAM_MOVE_UP","CAM_MOVE_DOWN","CAM_MOVE_LEFT","CAM_MOVE_RIGHT","CAM_MOVE_STOP","COPY_ANNOTATION","PASTE_ANNOTATION","KeyMapper","keyActionHandler","controlDown","triggerKeyAction","keyAction","POINT","BBOX","UndoRedo","maxElements","hist","pointer","entry","histEl","shift","getViewportCoordinates","window","viewport","scaleX","xMax","xMin","scaleY","yMax","yMin","vX","vY","getZoomTranslation","w0","s1","s0","translation","Canvas","img","container","keyMapper","handleKeyAction","mousePosAbs","clipboard","prevLabel","annoTime","performance","now","isJunk","imageData","performedImageInit","imgBarVisible","clearHist","getAnnos","imageLoaded","putSelectedOnTop","imgLoadCount","updateCanvasView","annotations","setImageLabels","layoutUpdate","selectAnnotation","annoConversion","onImageLoaded","focus","up","deltaY","zoomFactor","nextScale","newTranslation","wv","createNewAnnotation","showLabelInput","findAnno","selectedAnnoId","updateSelectedAnno","action","camKeyStepSize","keyActions","ar","findAnnoRef","getResult","editAnnoLabel","removeLastNode","onAnnoPerformedAction","undo","redo","traverseAnnos","moveCamera","copyAnnotation","pasteAnnotation","keyDown","keyUp","onKeyUp","removeSelectedAnno","newAnnos","pushHist","stopAnnotimeMeasure","annoToolBarVisible","startAnnotimeMeasure","checkAnnoLength","onImgBarClose","onImgLabelInputClose","handleNotification","offset","uid","_","uniqueId","timestamp","lbls","annoRefs","isEmpty","cState","setCanvasState","onAnnoLabelInputClose","onAnnoSelect","currentIdx","findIndex","removeFrontedIds","finalData","imgLabelChanged","imgLoadTimestamp","trans_x","trans_y","vXMin","vXMax","yXMin","yXMax","vLeft","vRight","allowed","selectedTool","maxAnnos","TOOLS","merged","mergeSelectedAnno","lastAnno","filtered","clientHeight","document","documentElement","canvasTop","canvasLeft","maxImgHeight","maxImgWidth","layoutOffset","bottom","right","ratio","naturalWidth","naturalHeight","imgWidth","imgHeight","centerCanvasInContainer","resSpaceX","resSpaceY","svgUpdate","onSVGUpdate","updateImageSize","onAnnoMouseDown","actions","handleImgLabelInputClose","imgLabelInputVisible","handleImgLabelUpdate","getAnnoColor","onLabelInputDeleteClick","onAnnoLabelInputUpdate","renderImgLabelInput","handleImgBarClose","handleImgBarMouseEnter","blocked","renderAnnoToolBar","renderAnnoLabelInpput","handleCanvasClick","handleSvgMouseMove","onWheel","onRightClick","renderAnnotations","display","onImageLoad","minHeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/utils/transform.js","../src/types/modes.js","../src/Annotation/AnnoBar.js","../src/Annotation/InfSelectionArea.js","../node_modules/style-inject/dist/style-inject.es.js","../src/types/cursorstyles.js","../src/Annotation/Node.js","../src/types/canvasActions.js","../src/Annotation/Point.js","../src/utils/mouse.js","../src/Annotation/BBox.js","../src/Annotation/Edge.js","../src/Annotation/Polygon.js","../src/Annotation/Line.js","../src/types/annoStatus.js","../src/utils/colorlut.js","../src/utils/constraints.js","../src/types/notificationType.js","../src/Annotation/Annotation.js","../src/LabelInput.js","../src/AnnoLabelInput.js","../src/ImgBar.js","../src/Prompt.js","../src/AnnoToolBar.js","../src/utils/annoConversion.js","../src/utils/keyActions.js","../src/types/tools.js","../src/utils/hist.js","../src/utils/windowViewport.js","../src/Canvas.js"],"sourcesContent":["export function toSia(data, image, type, imgOffset){\n switch(type) {\n case 'bBox':\n const w = image.width * data.w\n const h = image.height * data.h\n const x0 = imgOffset.x + image.width * data.x - w/2.0\n const y0 = imgOffset.y + image.height * data.y - h/2.0\n return [\n {\n x: x0,\n y: y0\n },\n {\n x: x0 + w,\n y: y0\n },\n {\n x: x0 + w,\n y: y0 + h\n },\n {\n x: x0,\n y: y0 + h\n }\n ]\n case 'point':\n return [{\n x: imgOffset.x + image.width * data.x,\n y: imgOffset.y + image.height * data.y\n }]\n case 'line':\n case 'polygon':\n return data.map((e) => {\n return {\n x: imgOffset.x + image.width * e.x,\n y: imgOffset.y + image.height * e.y\n }\n })\n default:\n \n }\n}\n\n/**\n * Transform a sia annotation to backend format.\n * \n * @param {Array} data Annotation data\n * @param {*} svg Image object {width, height}\n * @param {String} type Type of the annotation bBox, point, line, polygon\n * @returns Annotation data in backend style (relative, centered)\n */\nexport function toBackend(data, svg, type, imgOffset={x:0,y:0}){\n const imgWidth = svg.width - 2*imgOffset.x\n const imgHeight = svg.height - 2*imgOffset.y\n switch(type) {\n case 'bBox':\n // const w = svg.width * data.w\n // const h = svg.height * data.h\n // const x0 = svg.width * data.x - w/2.0\n // const y0 = svg.height * data.y - h/2.0\n\n // console.error('GO On Here! w = max_x - min_x; h = max_y - min_y')\n const xList = data.map(e => {return e.x})\n const yList = data.map(e => {return e.y})\n const minX = Math.min(...xList) - imgOffset.x\n const maxX = Math.max(...xList) - imgOffset.x\n const minY = Math.min(...yList) - imgOffset.y\n const maxY = Math.max(...yList) - imgOffset.y\n const w = maxX - minX\n const h = maxY - minY\n const x = minX + w/2.0\n const y = minY + h/2.0\n return {\n x:x/imgWidth,\n y:y/imgHeight,\n w:w/imgWidth,\n h:h/imgHeight}\n case 'point':\n return {\n x: (data[0].x - imgOffset.x)/imgWidth,\n y: (data[0].y - imgOffset.y)/imgHeight\n }\n case 'line':\n case 'polygon':\n return data.map((e) => {\n return {\n x: (e.x - imgOffset.x)/ imgWidth,\n y: (e.y - imgOffset.y)/ imgHeight\n }\n })\n default:\n console.warn(\"Wrong annotation type!\")\n \n }\n}\n\nexport function getMinMaxPoints(data){\n const xList = data.map(e => {return e.x})\n const yList = data.map(e => {return e.y})\n const minPoint = {x:Math.min(...xList), y:Math.min(...yList)}\n const maxPoint = {x:Math.max(...xList), y:Math.max(...yList)}\n return [minPoint, maxPoint]\n}\n\n/**\n * Get area relative to the image \n * \n * @param {Array} data Annotation data\n * @param {*} scaledImg The scaled image object {width, height}\n * @param {String} type Type of the annotation bBox, point, line, polygon\n * @param {object} originalImg The original image\n * @returns Area relative\n */\nexport function getArea(data, scaledImg, type, originalImg){\n const relData = toBackend(data, scaledImg, type)\n switch(type) {\n case 'bBox':\n return Math.abs(relData.w*relData.h)* originalImg.width*originalImg.height\n // return relData.w*relData.h\n case 'line': \n case 'point':\n return undefined\n case 'polygon':\n let area = 0.0; // Accumulates area in the loop\n if (relData.length >2){\n let j = relData.length-1; // The last vertex is the 'previous' one to the first\n \n for (let i=0; i<relData.length; i++)\n { \n area = area + (relData[j].x+relData[i].x) * (relData[j].y-relData[i].y); \n j = i; //j is previous vertex to i\n }\n }\n return Math.abs(area/2) * originalImg.width*originalImg.height\n default:\n console.warn(\"Wrong annotation type!\")\n return undefined\n }\n}\n\nexport function move(data, movementX, movementY){\n return data.map(e => {\n return {\n x: e.x + movementX,\n y: e.y + movementY\n }\n })\n}\n\n\nexport function getBox(data, type){\n \n switch(type) {\n case 'bBox':\n return data\n case 'point':\n case 'line': \n case 'polygon':\n let maxX = 0\n let maxY = 0\n let minX = Infinity\n let minY = Infinity\n data.forEach(el => {\n if (el.x > maxX) maxX = el.x\n if (el.y > maxY) maxY = el.y\n if (el.x < minX) minX = el.x\n if (el.y < minY) minY = el.y\n })\n return [\n {x:minX, y:minY}, {x:maxX, y:minY},\n {x:minX, y:maxY}, {x:maxX, y:maxY}\n ]\n default:\n break\n \n }\n}\n\nexport function getCenter(data, type){\n let box = undefined\n switch(type) {\n case 'point':\n return data[0]\n case 'line':\n case 'polygon':\n case 'bBox':\n box = getBox(data, type)\n const w = box[1].x - box[0].x\n const h = box[3].y - box[0].y\n return {\n x: box[0].x + w/2.0,\n y: box[0].y + h/2.0\n } \n default:\n \n }\n}\n\n/**\n * Get point that is closest to the left browser side.\n * \n * @param {object} data list of points {x,y} \n * @returns {object} A list of point [{x,y}...]. Multiple points are\n * returned when multiple points have the same distance to the left side.\n */\nexport function getMostLeftPoint(data){\n let minX = Infinity\n let minXList = [] \n data.forEach(el => {\n if (el.x < minX){\n minX = el.x\n minXList = []\n minXList.push(el)\n } else if (el.x === minX) {\n minXList.push(el)\n }\n })\n return minXList\n}\n\n/**\n * Get point that is closest to the top of the browser.\n * \n * @param {object} data list of points {x,y} \n * @returns {object} A list of point [{x,y}...]. Multiple points are\n * returned when multiple points have the same distance to the top.\n */\nexport function getTopPoint(data){\n let minY = Infinity\n let minYList = [] \n data.forEach(el => {\n if (el.y < minY){\n minY = el.y\n minYList = []\n minYList.push(el)\n } else if (el.y === minY) {\n minYList.push(el)\n }\n })\n return minYList\n}\n\n/**\n * Check if all nodes of an annotation are within the image. If not,\n * correct the annotation\n * @param {object} data \n * @param {object} image \n */\nexport function correctAnnotation(data, image){\n const corrected = data.map(el => {\n let x = el.x\n let y = el.y\n if (el.x <= 0){\n x = 0\n } else if (el.x > image.width){\n x = image.width\n }\n if (el.y < 0){\n y = 0\n } else if (el.y > image.height){\n y = image.height\n }\n return {x:x,y:y}\n })\n return corrected\n}\n\n/**\n * Rotate annotation around center.\n * @param {*} data list of points {x:int,y:int} \n * @param {*} center Center to rotate point \n * @param {*} angle Rotation angle\n */\nexport function rotateAnnotation(data, center, angle){\n angle = (angle ) * (Math.PI/180); // Convert to radians\n const rotated = data.map(point => {\n return {\n x: Math.round(Math.cos(angle) * (point.x - center.x) - Math.sin(angle) * (point.y-center.y) + center.x),\n y: Math.round(Math.sin(angle) * (point.x - center.x) + Math.cos(angle) * (point.y - center.y) + center.y)\n }\n })\n return rotated;\n}\n\n/**\n * Resize annotation data in canvas format to new image size\n * @param {*} data Annotation data in canvas format [{x:int, y:int},...]\n * @param {*} sizeOld Size of old image {width:int, height:int}\n * @param {*} sizeNew Size of new image {width:int, height:int}\n */\nexport function resizeAnnoData(data, sizeOld, sizeNew){\n const xRatio = sizeNew.width / sizeOld.width\n const yRatio = sizeNew.height / sizeOld.height\n return data.map(e => {\n return {\n x: parseInt(e.x*xRatio),\n y: parseInt(e.y*yRatio)\n }\n })\n}","export const VIEW='view'\nexport const EDIT='edit'\nexport const CREATE='create'\nexport const MOVE='move'\nexport const ADD = 'add'\nexport const CAMERA_MOVE = 'cameraMove'\nexport const EDIT_LABEL = 'editLabel'\nexport const DELETED = 'deleted'","import React, {Component} from 'react'\nimport * as transform from '../utils/transform'\nimport * as modes from '../types/modes'\n\nconst defaultFontSize = 10\nconst defaultRectHeight = 15\n\nclass AnnoBar extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n top: 0,\n left: 0,\n width: 50,\n height: defaultRectHeight,\n fontSize:defaultFontSize,\n }\n this.textRef = React.createRef()\n }\n \n /*************\n * EVENTS *\n **************/\n componentWillMount(){\n if (this.props.mode !== modes.CREATE) this.setPosition()\n }\n\n componentDidUpdate(){\n if (this.props.mode !== modes.CREATE){\n this.setPosition()\n } \n }\n\n handleClick(e: Event){\n e.preventDefault()\n if (this.props.onClick){\n this.props.onClick(e)\n }\n }\n /*************\n * LOGIC *\n *************/\n setPosition(){\n // const center = transform.getCenter(this.props.anno.data, this.props.anno.type)\n // const top = center.y\n // const left = center.x \n // if (this.state.top !== top || this.state.left !== left){ \n // this.setState({\n // top,\n // left\n // })\n // }\n let topPoint = transform.getTopPoint(this.props.anno.data)\n topPoint = transform.getMostLeftPoint(topPoint)[0]\n if (this.textRef.current){\n const text = this.textRef.current.getBoundingClientRect()\n const textPadding = 2\n let rectWidth = (text.width + textPadding)/this.props.svg.scale\n if (rectWidth !== this.state.width){\n this.setState({\n width: rectWidth,\n fontSize: Math.ceil(defaultFontSize/this.props.svg.scale),\n // height: Math.ceil(defaultFontSize/this.props.svg.scale)\n })\n }\n }\n let top = topPoint.y - 10 \n let left = topPoint.x + 7\n if (top < 0) top = topPoint.y + 10\n if (this.state.top !== top || this.state.left !== left){ \n this.setState({\n top,\n left,\n // width: annoBox[1].x - annoBox[0].x\n })\n }\n }\n\n /*************\n * RENDERING *\n **************/\n\n\n render(){\n let label = ''\n if (!this.props.possibleLabels) return null\n let labelObject \n if (this.props.anno.labelIds && this.props.anno.labelIds.length > 0){\n this.props.anno.labelIds.forEach((lbl, idx) => {\n labelObject = this.props.possibleLabels.find(el => {\n return el.id === lbl\n })\n if (idx > 0) label += ', '\n label += labelObject.label\n })\n } else {\n if (this.props.defaultLabel){\n if (Number.isInteger(this.props.defaultLabel)){\n labelObject = this.props.possibleLabels.find(el => {\n return el.id === this.props.defaultLabel\n })\n label = labelObject.label\n } else {\n label = this.props.defaultLabel\n }\n } else {\n label = 'no label'\n }\n }\n switch(this.props.mode){\n case modes.VIEW:\n return (<g>\n <rect x={this.state.left} y={this.state.top - 6} \n width={this.state.width} height={this.state.height} rx=\"5\" \n opacity='0.5'\n style={this.props.style}\n />\n <text x={this.state.left} y={this.state.top} \n fill=\"white\"\n onClick={e => this.handleClick(e)}\n textAnchor=\"start\"\n alignmentBaseline=\"central\"\n ref={this.textRef} \n fontSize={this.state.fontSize+\"pt\"}\n // textLength=\"50\"\n // style={{...this.props.style, strokeWidth:1}}\n > \n {label}\n </text>\n {/* This second rect is to prevent text from getting marked */}\n <rect x={this.state.left} y={this.state.top - 6} \n width={this.state.width} \n height={this.state.height} rx=\"5\" \n opacity='0.01'\n style={this.props.style}\n />\n </g>\n )\n default:\n return null\n }\n \n }\n \n}\n\nexport default AnnoBar","import React, {Component} from 'react'\n\nclass InfSelectionArea extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n selAreaCss: 'sel-area-off',\n } \n }\n\n componentDidMount(){\n if (this.props.enable){\n this.enableSelArea()\n } else {\n this.disableSelArea()\n }\n }\n\n componentDidUpdate(){\n if (this.props.enable){\n this.enableSelArea()\n } else {\n this.disableSelArea()\n }\n }\n\n onMouseMove(e){\n if (this.props.onMouseMove){\n this.props.onMouseMove(e)\n }\n }\n\n onMouseUp(e){\n if (this.props.onMouseUp){\n this.props.onMouseUp(e)\n }\n }\n\n enableSelArea(){\n if (this.state.selAreaCss !== 'sel-area-on'){\n this.setState({selAreaCss: 'sel-area-on'})\n }\n }\n\n disableSelArea(){\n if (this.state.selAreaCss !== 'sel-area-off'){\n this.setState({selAreaCss: 'sel-area-off'})\n }\n }\n\n\n /*************\n * RENDERING *\n **************/\n render(){\n return(\n <circle \n cx={this.props.svg.width/2} \n cy={this.props.svg.height/2} \n r={'100%'}\n className={this.state.selAreaCss}\n onMouseMove={e => {this.onMouseMove(e)}}\n onMouseUp={e => {this.onMouseUp(e)}}\n />\n )\n \n }\n}\n\nexport default InfSelectionArea","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export const CREATE_NODE = \"crosshair\"\nexport const EDIT_NODE = \"crosshair\"\nexport const NORMAL_NODE = \"default\"","import React, {Component} from 'react'\nimport './Annotation.scss'\nimport * as modes from '../types/modes'\nimport * as cursorstyles from '../types/cursorstyles'\n\n\nclass Node extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n haloCss: 'node-halo-off',\n selAreaCss: 'sel-area-off',\n // anno: undefined,\n nodeSelected: false,\n style: {}\n }\n }\n\n componentDidMount(){\n this.setState({\n // anno: this.props.anno,\n style: {\n ...this.props.style,\n cursor: this.getCursorStyle(this.props.mode)\n }\n })\n // switch (this.props.mode){\n // case modes.CREATE:\n // if (this.props.idx !== 0){\n // this.turnSelAreaOn()\n // }\n // default:\n // break\n // }\n }\n\n componentDidUpdate(prevProps){\n switch (this.props.mode){\n case modes.CREATE:\n if (this.props.idx !== 0 || this.props.isPoint){\n this.turnSelAreaOn()\n }\n break\n case modes.EDIT:\n this.turnSelAreaOn()\n break\n default:\n break\n }\n //on mode change\n if (prevProps.mode !== this.props.mode){\n this.setState({\n style: {...this.state.style,\n cursor: this.getCursorStyle(this.props.mode)\n }\n })\n }\n if (prevProps.style !== this.props.style){\n this.setState({style: \n {...this.state.style,\n ...this.props.style,\n cursor: this.getCursorStyle(this.props.mode)}\n })\n }\n }\n\n /*************\n * EVENTS *\n **************/\n\n onClick(e){\n this.turnHaloOn()\n if (this.props.onClick){\n this.props.onClick(e, this.props.idx)\n }\n }\n\n onMouseMove(e){\n if (this.props.onMouseMove){\n this.props.onMouseMove(e, this.props.idx)\n }\n // switch (this.props.mode){\n // case modes.CREATE:\n // let newAnno = [...this.state.anno]\n // const mousePos = mouse.getMousePosition(e, this.props.svg)\n // newAnno[this.props.idx].x = mousePos.x\n // newAnno[this.props.idx].y = mousePos.y\n // this.setState({\n // anno: newAnno\n // })\n // if (this.props.onAnnoUpdate){\n // this.props.onAnnoUpdate(e, this.props.idx, newAnno)\n // }\n // default:\n // break\n // }\n }\n\n onContextMenu(e: Event){\n e.preventDefault()\n }\n\n onMouseUp(e: Event){\n switch (this.props.mode){\n case modes.EDIT:\n switch (e.button){\n case 0:\n this.turnSelAreaOff()\n break\n default:\n break\n }\n break\n default:\n break\n }\n if (this.props.onMouseUp){\n this.props.onMouseUp(e, this.props.idx)\n }\n }\n\n onMouseDown(e: Event){\n e.stopPropagation()\n if (this.props.onMouseDown){\n this.props.onMouseDown(e, this.props.idx)\n }\n switch (this.props.mode){\n case modes.CREATE:\n switch (e.button){\n case 0:\n this.turnSelAreaOff()\n break\n case 2:\n this.turnSelAreaOff()\n break\n default:\n break\n }\n // case modes.EDIT:\n // switch (e.button){\n // case 0:\n // this.turnSelAreaOn()\n // break\n // default:\n // break\n // }\n break\n default:\n break\n }\n }\n \n onMouseOver(e: Event){\n if (this.props.isSelected){\n this.turnHaloOn()\n }\n }\n\n onMouseLeave(e){\n if (this.props.isSelected){\n this.turnHaloOff()\n }\n }\n\n onDoubleClick(e){\n if (this.props.onDoubleClick){\n this.props.onDoubleClick(e, this.props.idx)\n }\n }\n\n handleMouseLeave(e){\n if (this.props.onMouseLeave){\n this.props.onMouseLeave(e, this.props.idx)\n }\n }\n\n\n /*************\n * LOGIC *\n **************/\n getCursorStyle(mode){\n switch(mode){\n case modes.CREATE:\n return cursorstyles.CREATE_NODE\n case modes.EDIT:\n return cursorstyles.EDIT_NODE\n case modes.VIEW:\n return cursorstyles.NORMAL_NODE\n default:\n break\n }\n }\n\n turnSelAreaOn(){\n if (this.state.selAreaCss !== 'sel-area-on'){\n this.setState({\n selAreaCss: 'sel-area-on'\n })\n }\n }\n\n turnSelAreaOff(){\n if (this.state.selAreaCss !== 'sel-area-off'){\n this.setState({\n selAreaCss: 'sel-area-off'\n })\n }\n }\n\n turnHaloOn(){\n this.setState({\n haloCss: 'node-halo-on'\n })\n }\n\n turnHaloOff(){\n this.setState({\n haloCss: 'node-halo-off'\n })\n }\n\n /*************\n * RENDERING *\n **************/\n renderHalo(){\n if (this.state.haloCss === 'node-halo-off') return null\n const data = this.props.anno[this.props.idx]\n\n return <circle cx={data.x} cy={data.y} r={this.props.style.r * 3}\n className={this.state.haloCss}\n onMouseLeave={e => this.onMouseLeave(e)}\n />\n }\n renderNodes(){\n const data = this.props.anno[this.props.idx]\n if (data === undefined) {return}\n return (\n <g\n onClick={(e) => this.onClick(e)}\n onMouseMove={e => this.onMouseMove(e)}\n onContextMenu={e => this.onContextMenu(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n onDoubleClick={e => this.onDoubleClick(e)}\n onMouseLeave={e => this.handleMouseLeave(e)}\n >\n <circle cx={data.x} cy={data.y} r={'100%'}\n className={this.state.selAreaCss}\n />\n {this.renderHalo()}\n <circle cx={data.x} \n cy={data.y} \n r={3} fill=\"red\"\n style={this.state.style}\n className={this.props.className}\n onMouseOver={e => this.onMouseOver(e)}\n />\n </g>\n )\n }\n render(){\n return(\n <g>\n {this.renderNodes()}\n </g>\n )\n }\n}\n\nexport default Node;","//Anno actions\nexport const ANNO_DELETED='annoDeleted'\nexport const ANNO_SELECTED='annoSselected'\nexport const ANNO_CREATED='annoCreated'\nexport const ANNO_MOVED='annoMoved'\nexport const ANNO_ENTER_MOVE_MODE='annoEnterMoveMode'\nexport const ANNO_EDITED='annoEdited'\nexport const ANNO_ENTER_EDIT_MODE='annoEnterEditMode'\nexport const ANNO_ADDED_NODE='annoAddedNode'\nexport const ANNO_REMOVED_NODE='annoRemovedNode'\nexport const ANNO_LABEL_UPDATE='annoLabelUpdate'\nexport const ANNO_CREATED_NODE='annoCreatedNode'\nexport const ANNO_CREATED_FINAL_NODE='annoCreatedFinalNode'\nexport const ANNO_START_CREATING='annoStartCreating'\n\n//Image actions\nexport const IMG_LABEL_UPDATE='imgLabelUpdate'\n","import React, {Component} from 'react'\nimport InfSelectionArea from './InfSelectionArea'\nimport Node from './Node'\nimport * as modes from '../types/modes'\nimport * as transform from '../utils/transform'\nimport * as canvasActions from '../types/canvasActions'\n\nclass Point extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n anno: undefined,\n }\n }\n\n componentDidMount(prevProps){\n if (this.props.anno.mode === modes.CREATE){\n const data = this.props.anno.data[0]\n const newAnno = {\n ...this.props.anno,\n data: [\n {x: data.x, y: data.y}\n ],\n selectedNode: 0\n }\n this.setState({\n anno: newAnno\n })\n } else {\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.anno !== this.props.anno){\n this.setState({anno: {...this.props.anno}})\n }\n }\n \n /**************\n * ANNO EVENTS *\n ***************/\n onMouseMove(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n this.move(\n e.movementX/this.props.svg.scale, \n e.movementY/this.props.svg.scale\n )\n break\n default:\n break\n }\n }\n\n onMouseUp(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)\n }\n break\n case modes.CREATE:\n this.requestModeChange(this.state.anno, modes.VIEW)\n\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED)\n break\n default:\n break\n }\n }\n\n onNodeMouseDown(e, idx){\n switch (this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n if (this.props.isSelected){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n }\n break\n default:\n break\n }\n }\n\n /*************\n * LOGIC *\n **************/\n getResult(){\n return this.state.anno\n }\n \n performedAction(anno, pAction){\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n requestModeChange(anno, mode){\n this.props.onModeChangeRequest(anno, mode)\n }\n\n move(movementX, movementY){\n this.setState({\n anno : {\n ...this.state.anno,\n data: transform.move(this.state.anno.data, movementX, movementY)\n }\n })\n }\n\n renderInfSelectionArea(){\n switch (this.state.anno.mode){\n case modes.MOVE:\n return <InfSelectionArea enable={true} \n svg={this.props.svg}\n />\n default:\n return null\n }\n }\n\n renderNode(){\n if (!this.props.isSelected) return null \n switch(this.state.anno.mode){\n case modes.EDIT_LABEL:\n case modes.MOVE:\n return null\n case modes.EDIT:\n case modes.CREATE:\n return <Node anno={this.state.anno.data}\n key={this.state.selectedNode}\n idx={this.state.anno.selectedNode} \n style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n isPoint={true}\n />\n default:\n return this.state.anno.data.map((e, idx) => {\n return <Node anno={this.state.anno.data} idx={idx} \n key={idx} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n isPoint={true}\n />\n })\n }\n }\n\n renderPoint(){\n return this.state.anno.data.map((e, idx) => {\n return (\n <circle key={idx} \n cx={e.x} \n cy={e.y} \n r={10} fill=\"red\" \n style={this.props.style}\n className={this.props.className}\n />\n )\n })\n \n }\n\n render(){\n if (this.state.anno){\n return(\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n >\n {this.renderPoint()}\n {this.renderNode()}\n {this.renderInfSelectionArea()}\n </g>\n )\n } else {\n return null\n }\n }\n}\n\nexport default Point;","export function getMousePosition(e, svg){\n const absPos = getMousePositionAbs(e, svg)\n return {\n x: (absPos.x )/svg.scale - svg.translateX,\n y: (absPos.y )/svg.scale - svg.translateY\n }\n}\n\nexport function getMousePositionAbs(e, svg){\n return {\n x: (e.pageX - svg.left),\n y: (e.pageY - svg.top)\n }\n}","import React, {Component} from 'react'\nimport './Annotation.scss';\nimport * as modes from '../types/modes'\nimport * as transform from '../utils/transform'\nimport * as canvasActions from '../types/canvasActions'\nimport * as mouse from '../utils/mouse'\nimport InfSelectionArea from './InfSelectionArea'\nimport Node from './Node'\n\nclass BBox extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n anno: undefined,\n }\n }\n\n componentDidMount(prevProps){\n if (this.props.anno.mode === modes.CREATE){\n const data = this.props.anno.data[0]\n const newAnno = {\n ...this.props.anno,\n data: [\n {x: data.x, y: data.y},\n {x: data.x+1, y: data.y},\n {x: data.x+1, y: data.y+1},\n {x: data.x, y: data.y+1}\n ],\n selectedNode: 2\n }\n this.setState({\n anno: newAnno\n })\n // this.performedAction(newAnno, canvasActions.ANNO_START_CREATING)\n \n } else {\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.anno !== this.props.anno){\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n /*************\n * EVENTS *\n **************/\n onNodeMouseMove(e, idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n case modes.EDIT:\n const mousePos = mouse.getMousePosition(e, this.props.svg)\n const idxMinus = idx - 1 < 0 ? 3 : idx -1\n const idxPlus = idx + 1 > 3 ? 0 : idx +1\n let newAnnoData = [...this.state.anno.data]\n if (idx % 2 === 0){\n newAnnoData[idxMinus].x = mousePos.x\n newAnnoData[idx].x = mousePos.x\n newAnnoData[idx].y = mousePos.y\n newAnnoData[idxPlus].y = mousePos.y\n } else {\n newAnnoData[idxMinus].y = mousePos.y\n newAnnoData[idx].x = mousePos.x\n newAnnoData[idx].y = mousePos.y\n newAnnoData[idxPlus].x = mousePos.x\n }\n this.setState({\n anno: {\n ...this.state.anno,\n data: newAnnoData\n }\n })\n break\n default:\n break\n }\n }\n\n onNodeMouseDown(e,idx){\n switch(this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n this.requestModeChange(\n {...this.state.anno, selectedNode:idx}, \n modes.EDIT\n )\n }\n break\n default:\n break\n }\n }\n\n onNodeMouseUp(e, idx){\n switch(this.state.anno.mode){\n case modes.EDIT:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_EDITED)\n }\n break\n case modes.CREATE:\n if (e.button === 2){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED)\n }\n break\n default:\n break\n }\n }\n\n handleNodeMouseLeave(e, idx){\n switch(this.state.anno.mode){\n //if mouse left Canvas in create mode, transit to VIEW mode\n case modes.CREATE:\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED)\n break\n default:\n break\n }\n }\n\n /**************\n * ANNO EVENTS *\n ***************/\n onMouseMove(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n this.move(\n e.movementX/this.props.svg.scale, \n e.movementY/this.props.svg.scale\n )\n break\n default:\n break\n }\n }\n\n onMouseUp(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.VIEW)\n this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)\n }\n break\n default:\n break\n }\n }\n\n onMouseDown(e){\n switch (this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n if (this.props.isSelected){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n }\n break\n default:\n break\n }\n }\n /*************\n * LOGIC *\n **************/\n getResult(){\n return this.state.anno\n }\n \n requestModeChange(anno, mode){\n this.props.onModeChangeRequest(anno, mode)\n }\n\n performedAction(anno, pAction){\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n toPolygonStr(data){\n return data.map( (e => {\n return `${e.x},${e.y}`\n })).join(' ')\n \n }\n\n move(movementX, movementY){\n this.setState({\n anno : {\n ...this.state.anno,\n data: transform.move(this.state.anno.data, movementX, movementY)\n }\n })\n }\n\n /*************\n * RENDERING *\n **************/\n\n renderPolygon(){\n switch(this.state.anno.mode){\n default:\n return <polygon \n points={this.toPolygonStr(this.state.anno.data)}\n fill='none' stroke=\"purple\" \n style={this.props.style}\n className={this.props.className}\n onMouseDown={e => this.onMouseDown(e)}\n onMouseUp={e => this.onMouseUp(e)}\n /> \n }\n }\n\n renderNodes(){\n if (!this.props.isSelected) return null \n switch(this.state.anno.mode){\n case modes.MOVE:\n case modes.EDIT_LABEL:\n return null\n case modes.EDIT:\n case modes.CREATE:\n return <Node anno={this.state.anno.data}\n key={this.state.anno.selectedNode}\n idx={this.state.anno.selectedNode} \n style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}\n onMouseLeave={(e, idx) => this.handleNodeMouseLeave(e, idx)}\n />\n default:\n return this.state.anno.data.map((e, idx) => {\n return <Node anno={this.state.anno.data} idx={idx} \n key={idx} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onMouseLeave={(e, idx) => this.handleNodeMouseLeave(e, idx)}\n />\n })\n }\n }\n\n renderInfSelectionArea(){\n switch (this.state.anno.mode){\n case modes.MOVE:\n return <InfSelectionArea enable={true} \n svg={this.props.svg}\n />\n default:\n return null\n }\n }\n\n render(){\n if (this.state.anno){\n return (\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n >\n {this.renderPolygon()}\n {this.renderNodes()}\n {this.renderInfSelectionArea()}\n </g>)\n } else {\n return null\n }\n }\n\n}\n\nexport default BBox;","import React, {Component} from 'react'\nimport './Annotation.scss'\n\n\n\nclass Edge extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n haloCss: 'node-halo-off'\n }\n }\n\n componentDidUpdate(){\n }\n \n onMouseOver(e){\n if (this.props.isSelected){\n this.setState({haloCss: 'node-halo-on'})\n }\n }\n\n onMouseLeave(e){\n if (this.props.isSelected){\n this.setState({haloCss: 'node-halo-off'})\n }\n }\n\n onMouseDown(e){\n if (this.props.onMouseDown){\n this.props.onMouseDown(e, this.props.idx)\n }\n }\n\n onMouseUp(e){\n e.stopPropagation()\n }\n\n render(){\n let p1, p2\n if (!this.props.closingEdge){\n if (this.props.idx - 1 < 0 ){\n return null\n }\n if (this.props.idx > this.props.anno.length - 1){\n return null\n }\n p1 = this.props.anno[this.props.idx - 1 ]\n p2 = this.props.anno[this.props.idx]\n } else {\n if (this.props.idx === 0 && this.props.anno.length === 1) return null\n p1 = this.props.anno[this.props.anno.length-1]\n p2 = this.props.anno[0]\n }\n return(<g\n onMouseOver={(e) => {this.onMouseOver(e)}}\n onMouseLeave={e => {this.onMouseLeave(e)}}\n \n >\n <line x1={p1.x} y1={p1.y} \n x2={p2.x} y2={p2.y} stroke=\"black\"\n // style={this.props.style} \n strokeWidth={this.props.style.strokeWidth*3}\n className={this.state.haloCss}\n onMouseOver={(e) => {this.onMouseOver(e)}}\n onMouseDown={e => this.onMouseDown(e)}\n onMouseUp={e => this.onMouseUp(e)}\n />\n <line x1={p1.x} y1={p1.y} \n x2={p2.x} y2={p2.y} stroke=\"black\"\n style={this.props.style} \n className={this.props.className}\n onMouseDown={e => this.onMouseDown(e)}\n onMouseUp={e => this.onMouseUp(e)}\n />\n </g>\n )\n }\n}\n\nexport default Edge;","import React, {Component} from 'react'\n\nimport Edge from './Edge'\nimport Node from './Node'\nimport InfSelectionArea from './InfSelectionArea'\n\nimport * as transform from '../utils/transform'\nimport * as canvasActions from '../types/canvasActions'\n\nimport './Annotation.scss'\nimport * as modes from '../types/modes'\nimport * as mouse from '../utils/mouse'\n\n\nclass Polygon extends Component{\n\n /*************\n * LIFECYCLE *\n **************/\n constructor(props){\n super(props)\n this.state = {\n anno: undefined,\n }\n }\n\n componentDidMount(){\n if (this.props.anno.mode === modes.CREATE){\n const data = this.props.anno.data[0]\n const newAnno = {\n ...this.props.anno,\n data: [\n {x: data.x, y: data.y},\n {x: data.x+1, y: data.y},\n ],\n selectedNode: 1\n }\n this.setState({\n anno: newAnno\n })\n } else {\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.anno !== this.props.anno){\n this.setState({anno: {...this.props.anno}})\n }\n }\n\n\n /**************\n * ANNO EVENTS *\n ***************/\n onMouseMove(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n this.move(\n e.movementX/this.props.svg.scale, \n e.movementY/this.props.svg.scale\n )\n break\n default:\n break\n }\n }\n\n onMouseUp(e){\n switch (this.state.anno.mode){\n case modes.MOVE:\n if (e.button === 0){\n this.performedAction(this.state.anno, canvasActions.ANNO_MOVED)\n this.requestModeChange(this.state.anno, modes.VIEW)\n }\n break\n default:\n break\n }\n }\n\n onMouseDown(e){\n switch (this.state.anno.mode){\n case modes.VIEW:\n if (e.button === 0){\n if (this.props.isSelected){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n }\n break\n default:\n break\n }\n }\n /**************\n * NODE EVENTS *\n ***************/\n\n onNodeMouseUp(e, idx){\n switch (this.state.anno.mode){\n case modes.EDIT:\n this.performedAction(this.state.anno, canvasActions.ANNO_EDITED)\n this.requestModeChange(this.state.anno, modes.VIEW)\n break\n default:\n break\n }\n }\n\n onNodeMouseDown(e,idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n if (e.button === 2){\n let newAnnoData = [...this.state.anno.data]\n newAnnoData.push({\n x: newAnnoData[idx].x,\n y: newAnnoData[idx].y\n })\n const newAnno = {\n ...this.state.anno,\n data: newAnnoData,\n selectedNode: this.state.anno.selectedNode + 1\n }\n this.setState({\n anno: newAnno\n })\n this.performedAction(newAnno, \n canvasActions.ANNO_CREATED_NODE)\n }\n break\n case modes.VIEW:\n if (e.button === 0){\n this.requestModeChange({\n ...this.state.anno,\n selectedNode: idx\n }, modes.EDIT)\n }\n break\n default:\n break\n }\n }\n\n onNodeMouseMove(e, idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n this.updateAnnoByMousePos(e, idx)\n break\n case modes.EDIT:\n e.stopPropagation()\n this.updateAnnoByMousePos(e, idx)\n break\n default:\n break\n }\n }\n\n onNodeDoubleClick(e, idx){\n switch (this.state.anno.mode){\n case modes.CREATE:\n this.performedAction(this.state.anno, canvasActions.ANNO_CREATED_FINAL_NODE)\n break\n default:\n break\n }\n }\n \n /**************\n * EDGE EVENTS *\n ***************/\n onEdgeMouseDown(e, idx){\n switch (this.state.anno.mode){\n case modes.ADD:\n this.addNode(e, idx)\n break\n case modes.VIEW:\n if (e.button === 0){\n this.requestModeChange(this.state.anno, modes.MOVE)\n }\n break\n default:\n break\n }\n }\n\n /*************\n * LOGIC *\n *************/\n performedAction(anno, pAction){\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n toPolygonStr(data){\n return data.map( (e => {\n return `${e.x},${e.y}`\n })).join(' ')\n \n }\n\n requestModeChange(anno, mode){\n this.props.onModeChangeRequest(anno, mode)\n }\n\n move(movementX, movementY){\n this.setState({\n anno : {...this.state.anno,\n data: transform.move(this.state.anno.data, movementX, movementY)\n }\n })\n }\n\n addNode(e, idx){\n const mPos = mouse.getMousePosition(e, this.props.svg)\n let newAnnoData = this.state.anno.data.slice(0,idx)\n newAnnoData.push(mPos)\n const oldRest = this.state.anno.data.slice(idx)\n const newAnno = {\n ...this.state.anno,\n data: newAnnoData.concat(oldRest)\n }\n this.setState({anno: newAnno\n })\n this.performedAction(newAnno, canvasActions.ANNO_ADDED_NODE)\n }\n\n removeLastNode(){\n const newAnno = {\n ...this.state.anno,\n data: [...this.state.anno.data.slice(0, this.state.anno.data.length-1)],\n selectedNode: this.state.anno.selectedNode - 1\n }\n this.setState({anno: newAnno\n })\n this.performedAction(newAnno, canvasActions.ANNO_REMOVED_NODE)\n }\n\n updateAnnoByMousePos(e, idx){\n const mousePos = mouse.getMousePosition(e, this.props.svg)\n let newAnnoData = [...this.state.anno.data]\n newAnnoData[idx].x = mousePos.x\n newAnnoData[idx].y = mousePos.y\n this.setState({\n anno: {\n ...this.state.anno,\n data: newAnnoData\n }\n })\n }\n\n getResult(){\n return this.state.anno\n }\n\n /*************\n * RENDERING *\n **************/\n\n renderNodes(){\n if (!this.props.isSelected) return null\n switch (this.state.anno.mode){\n case modes.MOVE:\n return null\n case modes.EDIT:\n case modes.CREATE:\n return <Node anno={this.state.anno.data} idx={this.state.anno.selectedNode} \n key={this.state.anno.selectedNode} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}\n onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}\n />\n default:\n return this.state.anno.data.map((e, idx) => {\n return <Node anno={this.state.anno.data} idx={idx} \n key={idx} style={this.props.style}\n className={this.props.className} \n isSelected={this.props.isSelected}\n mode={this.state.anno.mode}\n svg={this.props.svg}\n onMouseDown={(e, idx) => this.onNodeMouseDown(e,idx)}\n onMouseUp={(e, idx) => this.onNodeMouseUp(e, idx)}\n onDoubleClick={(e, idx) => this.onNodeDoubleClick(e, idx)}\n onMouseMove={(e, idx) => this.onNodeMouseMove(e, idx)}\n />\n })\n }\n }\n\n renderEdges(){\n if (!this.props.isSelected) return null\n switch (this.state.anno.mode){\n case modes.VIEW:\n case modes.ADD:\n let edges = this.state.anno.data.map((e, idx) => {\n return <Edge anno={this.state.anno.data} \n idx={idx} key={idx} style={this.props.style}\n className={this.props.className}\n isSelected={this.props.isSelected}\n onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}} \n />\n })\n edges.push(<Edge anno={this.state.anno.data} \n closingEdge={true} key={edges.length}\n idx={0}\n style={this.props.style}\n className={this.props.className}\n isSelected={this.props.isSelected}\n onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}} \n />)\n return edges\n default:\n return null\n }\n }\n\n renderPolygon(){\n return <polygon points={this.toPolygonStr(this.state.anno.data)}\n fill='none' stroke=\"purple\" \n style={this.props.style}\n className={this.props.className}\n />\n }\n\n renderInfSelectionArea(){\n switch (this.state.anno.mode){\n case modes.MOVE:\n return <InfSelectionArea enable={true} \n svg={this.props.svg}\n />\n default:\n return null\n }\n }\n\n render(){\n if (this.state.anno){\n return (\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n >\n {this.renderPolygon()}\n {this.renderEdges()}\n {this.renderNodes()}\n {this.renderInfSelectionArea()}\n </g>\n )\n } else {\n return <g></g>\n }\n }\n}\n\nexport default Polygon;","import React from 'react'\nimport Polygon from './Polygon'\nimport Edge from './Edge'\n\nimport * as modes from '../types/modes'\n\n\n\nclass Line extends Polygon{\n\n /*************\n * RENDERING *\n **************/\n\n renderEdges(){\n if (!this.props.isSelected) return null\n switch (this.state.anno.mode){\n case modes.VIEW:\n case modes.ADD:\n return this.state.anno.data.map((e, idx) => {\n return <Edge anno={this.state.anno.data} \n idx={idx} key={idx} style={this.props.style}\n className={this.props.className}\n isSelected={this.props.isSelected}\n onMouseDown={(e, idx) => {this.onEdgeMouseDown(e, idx)}} \n />\n })\n default:\n return null\n }\n }\n\n renderPolyline(){\n return <polyline points={this.toPolygonStr(this.state.anno.data)}\n fill='none' stroke=\"purple\" \n style={{...this.props.style, fill:'none'}}\n className={this.props.className}\n />\n }\n render(){\n if (this.state.anno){\n return (\n <g\n onMouseMove={e => this.onMouseMove(e)}\n onMouseUp={e => this.onMouseUp(e)}\n onMouseDown={e => this.onMouseDown(e)}\n >\n {this.renderPolyline()}\n {this.renderEdges()}\n {this.renderNodes()}\n {this.renderInfSelectionArea()}\n </g>\n )\n } else {\n return <g></g>\n }\n }\n}\n\nexport default Line;","export const NEW='new'\nexport const DELETED='deleted'\nexport const DATABASE='database'\nexport const CHANGED='changed'","// const colors30 = [\"#dc9769\",\n// \"#5c69d6\",\n// \"#51a630\",\n// \"#9a59cc\",\n// \"#a1bb37\",\n// \"#c043a6\",\n// \"#5fc666\",\n// \"#de4282\",\n// \"#58c699\",\n// \"#d2404e\",\n// \"#42c0c7\",\n// \"#d95130\",\n// \"#598cdd\",\n// \"#df8830\",\n// \"#50a2d1\",\n// \"#c8a73f\",\n// \"#d87ed5\",\n// \"#3e7f38\",\n// \"#af94d8\",\n// \"#7b8b2d\",\n// \"#635ea2\",\n// \"#a1b56d\",\n// \"#a93e62\",\n// \"#3e8d68\",\n// \"#df82ab\",\n// \"#616c2c\",\n// \"#955282\",\n// \"#91692d\",\n// \"#d47776\",\n// \"#a94e2c\"]\n\nconst colors20 = [\"#46aed7\",\n\"#e28f81\",\n\"#50b897\",\n\"#88712f\",\n\"#9cb067\",\n\"#a4527d\",\n\"#a55046\",\n\"#6e90da\",\n\"#487b3b\",\n\"#6360a7\",\n\"#cd8fd3\",\n\"#d5a442\",\n\"#cf7635\",\n\"#da4971\",\n\"#a4b137\",\n\"#d44da4\",\n\"#aa54be\",\n\"#5ab74d\",\n\"#7166d9\",\n\"#d14734\"]\n\nconst colors = colors20\nconst nColors = 20\n\nexport function getColor(n){\n if (n){\n return colors[n%nColors]\n }\n else{\n return getDefaultColor() \n }\n}\n\nexport function getDefaultColor(){\n return colors[0]\n}","import * as annoStatus from '../types/annoStatus'\n\n /**\n * Check if labels can be changed for a specific annotation\n * \n * @param allowedActions Actions that are allowed, read from config\n * @param anno Annotation that should be checked\n * @returns {Boolean}\n */\n export function allowedToLabel(allowedActions, anno){\n if (allowedActions.label){\n return true\n // const status = anno.status\n // if (!status) return true\n // if (status !== annoStatus.NEW){\n // if (allowedActions.edit.label){\n // return true\n // } else {\n // console.warn('You may not edit the label of this annotation as defined by config!', anno)\n // return false\n // }\n // } else {\n // // Return always true if labeling is allowed in general\n // // and annotation was not edited (it was NEW)\n // return true\n // }\n } else {\n console.warn('You may not edit the label of this annotation as defined by config!', anno)\n return false\n }\n }\n\n // /**\n // * Check if config allows to delete a specific annotation.\n // * \n // * @param allowedActions Actions that are allowed, read from config\n // * @param anno Annotation that should be checked\n // * @returns {Boolean}\n // */\n // export function allowedToDelete(allowedActions, anno){\n // const status = anno.status\n // if (!status) return true\n // if (status !== annoStatus.NEW){\n // if(allowedActions.edit.delete){\n // return true\n // } else {\n // console.warn('You may not delete this annotation as defined by config!', anno)\n // return false\n // }\n // } else {\n // return true\n // }\n // }\n\n /**\n * Check if config allows to edit a specific annotation.\n * \n * @param allowedActions Actions that are allowed, read from config\n * @param anno Annotation that should be checked\n * @returns {Boolean}\n */\n export function allowedToEdit(allowedActions, anno){\n const status = anno.status\n if (!status) return true\n if (status !== annoStatus.NEW){\n if(allowedActions.edit){\n return true\n } else {\n console.warn('You may not edit bounds of this annotation as defined by config!', anno)\n return false\n }\n } else {\n return true\n }\n }","export const INFO='info'\nexport const SUCCESS='success'\nexport const WARNING='warning'\nexport const ERROR='error'","import React, {Component} from 'react'\n\nimport AnnoBar from './AnnoBar'\nimport Point from './Point'\nimport BBox from './BBox'\nimport Line from './Line'\nimport Polygon from './Polygon'\nimport * as modes from '../types/modes'\nimport * as canvasActions from '../types/canvasActions'\nimport * as annoStatus from '../types/annoStatus'\nimport * as colorlut from '../utils/colorlut'\nimport * as constraints from '../utils/constraints'\nimport * as transform from '../utils/transform'\nimport * as notificationType from '../types/notificationType'\n\nclass Annotation extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n // mode: modes.VIEW,\n selAreaCss: 'sel-area-off',\n visibility: 'visible',\n anno: undefined\n }\n this.myAnno = React.createRef()\n \n }\n\n componentWillMount(){\n this.setState({anno: {...this.props.data}})\n }\n\n componentDidUpdate(prevProps){\n if (prevProps.data !== this.props.data){\n this.setState({anno: {...this.props.data}})\n }\n if (prevProps.showSingleAnno !== this.props.showSingleAnno){\n if (this.props.showSingleAnno === undefined){\n this.setVisible(true)\n } else {\n if (this.props.showSingleAnno !== this.props.data.id){\n this.setVisible(false)\n } else {\n this.setVisible(true)\n }\n }\n }\n }\n \n /*************\n * EVENTS *\n **************/\n onClick(e: Event){\n e.stopPropagation()\n this.performedAction(this.state.anno, canvasActions.ANNO_SELECTED)\n }\n\n onMouseDown(e: Event){\n e.preventDefault()\n if (this.props.onMouseDown){\n this.props.onMouseDown(e)\n }\n }\n\n onContextMenu(e: Event){\n e.preventDefault()\n }\n\n handleModeChangeRequest(anno, mode){\n this.setMode(anno, mode)\n }\n\n /*************\n * LOGIC *\n *************/\n \n /**\n * Trigger callback when this annotation performed an action\n * \n * @param {String} pAction \n */\n performedAction(anno, pAction){\n\n if (this.props.onAction){\n this.props.onAction(anno, pAction)\n }\n }\n\n\n notify(messageObj){\n if (this.props.onNotification){\n this.props.onNotification(messageObj)\n }\n }\n\n /**\n * Handle a performed action from a specific annotation\n * \n * @param {list} annoData - Annotation data that define a box, line, \n * polygon, point\n * @param {string} pAction - The performed action\n * @param {int} selectedNode - The node of the annotation that \n * was selected\n */\n performedAnnoAction(anno, pAction){\n\n switch(pAction){\n case canvasActions.ANNO_CREATED_FINAL_NODE:\n case canvasActions.ANNO_EDITED:\n case canvasActions.ANNO_MOVED:\n case canvasActions.ANNO_CREATED:\n // Check if annoation is within image bounds\n const corrected = transform.correctAnnotation(anno.data, this.props.svg)\n let newAnno = {...anno, data: corrected}\n const area = transform.getArea(corrected, this.props.svg, anno.type, this.props.image)\n if (area!==undefined){\n if(area < this.props.canvasConfig.annos.minArea){\n this.notify({\n title: \"Annotation to small\",\n message: 'Annotation area was '+Math.round(area)+'px but needs to be bigger than '+ this.props.canvasConfig.annos.minArea+' px',\n type: notificationType.WARNING\n })\n // newAnno = {...newAnno, mode: modes.DELETED}\n this.setMode(newAnno, modes.DELETED)\n } else {\n this.performedAction(newAnno, pAction)\n }\n } else {\n this.performedAction(newAnno, pAction)\n }\n break\n default:\n this.performedAction(anno, pAction)\n break\n }\n }\n\n setAnnoMode(anno, mode){\n this.setState({\n anno: {\n ...anno,\n mode: mode\n }\n })\n }\n\n setMode(anno, mode){\n if (anno.mode !== mode){\n switch (mode){\n case modes.EDIT_LABEL:\n if (constraints.allowedToLabel(\n this.props.allowedActions,\n anno\n )){\n this.setAnnoMode(anno, mode)\n }\n break\n case modes.DELETED:\n // if(constraints.allowedToDelete(\n // this.props.allowedActions,\n // anno\n // )){\n this.setAnnoMode(anno, mode)\n const newAnno = {\n ...anno, \n // status: annoStatus.DELETED\n mode: mode.DELETED\n }\n // this.setState({\n // anno: newAnno\n // })\n this.performedAction(newAnno, canvasActions.ANNO_DELETED)\n // }\n break\n case modes.MOVE:\n this.setAnnoMode(anno, mode)\n this.performedAction(anno, canvasActions.ANNO_ENTER_MOVE_MODE)\n break\n case modes.EDIT:\n this.setAnnoMode(anno, mode)\n this.performedAction(anno, canvasActions.ANNO_ENTER_EDIT_MODE)\n break\n default:\n this.setAnnoMode(anno, mode)\n break\n }\n }\n }\n\n setVisible(visible){\n if (visible){\n if (this.state.visibility !== 'visible'){\n this.setState({visibility: 'visible'})\n }\n } else {\n if (this.state.visibility !== 'hidden'){\n this.setState({visibility: 'hidden'})\n }\n }\n }\n\n isSelected(){\n if (constraints.allowedToEdit(this.props.allowedActions, this.state.anno)){\n return this.props.selectedAnno === this.props.data.id\n } else {\n return false\n }\n }\n\n getResult(){\n return {\n ...this.state.anno,\n data: this.myAnno.current.state.anno,\n createMode: this.myAnno.current.state.mode === modes.CREATE\n }\n }\n\n getLabel(lblId){\n return this.props.possibleLabels.find( e => {\n return e.id === lblId\n })\n }\n \n getColor(){\n if (this.state.anno.labelIds && this.state.anno.labelIds.length > 0){\n return this.getLabel(this.state.anno.labelIds[0]).color\n }\n else {\n return colorlut.getDefaultColor()\n }\n }\n\n getStyle(){\n const color = this.getColor()\n if (this.isSelected()){\n return {\n stroke: color,\n fill: color,\n strokeWidth: this.props.uiConfig.strokeWidth/this.props.svg.scale,\n r:this.props.uiConfig.nodeRadius/this.props.svg.scale\n\n }\n } else {\n return {\n stroke: color,\n fill: color,\n strokeWidth: this.props.uiConfig.strokeWidth/this.props.svg.scale,\n r:this.props.uiConfig.nodeRadius/this.props.svg.scale\n }\n }\n }\n\n getCssClass(){\n if (this.isSelected()){\n return 'selected'\n } else {\n return 'not-selected'\n }\n }\n\n /*************\n * RENDERING *\n **************/\n renderAnno(){\n const type = this.props.type\n // const allowedToEdit = constraints.allowedToEditBounds(\n // this.props.allowedActions,\n // this.state.anno\n // )\n switch(type) {\n case 'point':\n return <Point ref={this.myAnno} anno={this.state.anno} \n style={this.getStyle()}\n className={this.getCssClass()}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n />\n case 'bBox':\n return <BBox ref={this.myAnno} anno={this.state.anno} \n style={this.getStyle()}\n className={this.getCssClass()}\n onNodeClick={(e, idx) => this.onNodeClick(e, idx)}\n onNodeMouseDown={(e, idx) => this.onNodeMouseDown(e, idx)}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n />\n case 'polygon':\n return <Polygon ref={this.myAnno} anno={this.state.anno} \n style={this.getStyle()}\n className={this.getCssClass()}\n onNodeClick={(e, idx) => this.onNodeClick(e, idx)}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n />\n case 'line':\n return <Line ref={this.myAnno} anno={this.state.anno}\n style={this.getStyle()}\n className={this.getCssClass()}\n isSelected={this.isSelected()}\n svg={this.props.svg}\n onAction={(anno, pAction) => this.performedAnnoAction(anno, pAction)}\n onModeChangeRequest={(anno, mode) => this.handleModeChangeRequest(anno, mode)}\n />\n default:\n console.error(\"Wrong annoType for annotations: \",\n this.props.annoType)\n } \n }\n \n renderAnnoBar(){\n return <AnnoBar \n anno={this.state.anno} \n mode={this.state.anno.mode}\n possibleLabels={this.props.possibleLabels}\n onClick={e => this.onClick(e)}\n style={this.getStyle()}\n svg={this.props.svg}\n defaultLabel={this.props.defaultLabel}\n />\n }\n render(){\n if(!this.state.anno.data) return null\n if(!this.props.possibleLabels) return null\n if(this.state.anno.status === annoStatus.DELETED) return null\n return (\n <g>\n <g visibility={this.state.visibility}\n onClick={e => this.onClick(e)}\n onMouseDown={e => this.onMouseDown(e)}\n onContextMenu={e => this.onContextMenu(e)}\n >\n {this.renderAnnoBar()}\n {this.renderAnno()}\n\n </g>\n </g>\n )\n }\n}\n\nexport default Annotation","import React, {Component} from 'react'\nimport { Dropdown, Ref, Popup, Header} from 'semantic-ui-react'\n\nclass LabelInput extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n label: [],\n possibleLabels: [],\n performInit: true,\n enterHits: 0,\n confirmLabel: 0\n }\n this.inputRef = React.createRef()\n }\n\n componentWillMount(){\n this.updatePossibleLabels()\n }\n\n componentDidMount(){\n if(this.props.initLabelIds){\n this.setState({performInit:true})\n }\n }\n\n componentDidUpdate(prevProps, prevState){\n if (this.props.visible){\n if (this.props.focusOnRender){\n if (this.inputRef.current){\n this.inputRef.current.click()\n }\n }\n\n }\n if (prevState.confirmLabel !== this.state.confirmLabel){\n this.annoLabelUpdate(this.state.label)\n this.closeLabelInput()\n }\n if (prevProps.possibleLabels !== this.props.possibleLabels){\n this.updatePossibleLabels()\n }\n if (this.props.initLabelIds){\n if (this.state.performInit){\n this.setState({performInit: false})\n if(this.props.initLabelIds.length > 0){\n this.setState({label: this.props.initLabelIds})\n // const lbl = this.state.possibleLabels.find(e => {\n // return e.value === this.props.initLabelIds[0]\n // })\n // if (lbl){\n // this.setState({label:lbl.value})\n // }\n } else {\n this.setState({label:[]})\n }\n }\n if (prevProps.initLabelIds !== this.props.initLabelIds){\n this.setState({performInit:true})\n }\n }\n if(prevProps.relatedId !== this.props.relatedId){\n this.setState({performInit:true})\n }\n }\n /*************\n * EVENTS *\n **************/\n onKeyDown(e: Event){\n e.stopPropagation()\n this.performKeyAction(e.key)\n\n }\n\n onChange(e, item ){\n let lbl \n if (this.props.multilabels){\n lbl = item.value !== -1 ? item.value : []\n } else {\n lbl = item.value !== -1 ? [item.value] : []\n }\n this.setState({ label: lbl})\n this.annoLabelUpdate(lbl)\n // this.inputRef.current.click()\n }\n\n onItemClick(e, item){\n this.confirmLabel()\n }\n\n\n /*************\n * LOGIC *\n *************/\n updatePossibleLabels(){\n let possibleLabels = []\n let defaultLabel\n if (this.props.defaultLabel){\n if (Number.isInteger(this.props.defaultLabel)){\n defaultLabel = undefined\n } else {\n defaultLabel = this.props.defaultLabel\n }\n } else {\n defaultLabel = 'no label'\n }\n \n if (this.props.possibleLabels.length > 0){\n possibleLabels = this.props.possibleLabels.map(e => {\n return {\n key: e.id, value: e.id, text: e.label,\n content: (<div onClick={(event) => this.onItemClick(event, e.id)}>\n {e.label}</div>)\n }\n })\n }\n if (defaultLabel){\n possibleLabels.unshift({\n key: -1, value: -1, text: defaultLabel,\n content: (<div onClick={(event) => this.onItemClick(event, -1)}>\n {defaultLabel}</div>)\n })\n }\n this.setState({possibleLabels})\n\n }\n\n performKeyAction(key){\n switch(key){\n case 'Enter':\n if (!this.props.multilabels){\n if (this.props.visible) this.confirmLabel()\n }\n break\n case 'Escape':\n this.closeLabelInput()\n break\n default:\n break\n }\n }\n\n annoLabelUpdate(label){\n if (this.props.onLabelUpdate){\n this.props.onLabelUpdate(label.filter(val=>{\n return val !== -1\n }))\n }\n }\n\n\n confirmLabel(){\n //If not allowed to label -> return\n this.setState({confirmLabel: this.state.confirmLabel+1})\n }\n\n closeLabelInput(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n\n // triggerPopup(visible=true){\n // this.setState({\n // popupOpen: visible\n // })\n // }\n\n /*************\n * RENDERING *\n **************/\n renderLabelInput(){\n let lbl\n if (this.props.multilabels){\n lbl = this.state.label\n } else {\n if (this.state.label.length > 0){\n lbl = this.state.label[0]\n } else {\n lbl = -1\n }\n }\n\n return (\n <Ref innerRef={this.inputRef}>\n <Dropdown\n multiple={this.props.multilabels}\n search\n selection\n closeOnChange\n icon=\"search\"\n options={this.state.possibleLabels}\n placeholder='Enter label'\n tabIndex={0}\n onKeyDown= {e => this.onKeyDown(e)}\n value={lbl}\n onChange={(e, item) => this.onChange(e, item)}\n style={{opacity:0.8}}\n disabled={this.props.disabled}\n open={this.props.open}\n />\n </Ref>\n )\n }\n renderLabelInfo(){\n if (!this.state.label) return null\n let lbl = undefined\n if (this.state.label.length > 0){\n lbl = this.props.possibleLabels.find(e => {\n return this.state.label[this.state.label.length-1] === e.id\n })\n }\n if (!lbl) return \"No label\"\n return <div>\n <Header>{\n lbl.label\n }</Header>\n <div dangerouslySetInnerHTML={{__html: lbl.description}} />\n </div>\n }\n\n renderPopupContent(){\n return <div>\n {this.renderLabelInfo()}\n {/* {this.renderAnnoDetails()} */}\n </div>\n }\n\n\n render(){\n if (!this.props.visible) return null\n if (this.props.renderPopup){\n return (\n <Popup trigger={this.renderLabelInput()}\n content={this.renderPopupContent()}\n open\n position=\"right center\"\n style={{opacity:0.9}}\n />\n )\n } else {\n return this.renderLabelInput()\n }\n\n }\n\n}\n\nexport default LabelInput\n","import React, {Component} from 'react'\nimport LabelInput from './LabelInput'\nimport * as constraints from './utils/constraints'\nimport * as annoStatus from './types/annoStatus'\n\nclass AnnoLabelInput extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n top: 400,\n left: 100,\n label: undefined,\n visibility: 'hidden',\n possibleLabels: []\n }\n this.inputGroupRef = React.createRef()\n }\n\n componentWillMount(){\n this.setPosition()\n }\n \n componentDidUpdate(prevProps){\n if (this.props.visible){\n this.setPosition()\n } \n\n \n }\n\n /*************\n * LOGIC *\n *************/\n setPosition(){\n\n if (this.props.mousePos){\n const top = this.props.mousePos.y + this.props.svg.top - 10\n const left = this.props.mousePos.x + this.props.svg.left - 10\n if (this.state.top !== top|| this.state.left !== left){ \n this.setState({\n top: top,\n left: left,\n })\n }\n }\n }\n\n onClose(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n \n annoLabelUpdate(anno){\n if (this.props.onLabelUpdate){\n this.props.onLabelUpdate(anno)\n }\n }\n\n updateAnnoLabel(label){\n if (!constraints.allowedToLabel(\n this.props.allowedActions, this.props.selectedAnno)) return\n this.annoLabelUpdate({\n ...this.props.selectedAnno,\n labelIds: label,\n status: this.props.selectedAnno.status !== annoStatus.NEW ? annoStatus.CHANGED : annoStatus.NEW\n })\n }\n\n\n /*************\n * RENDERING *\n **************/\n render(){\n if (!this.props.visible) return null\n return (\n <div ref={this.inputGroupRef} style={{position:'fixed', top:this.state.top, left:this.state.left}}>\n <LabelInput svg={this.props.svg}\n onClose={() => this.onClose()}\n initLabelIds={this.props.selectedAnno.labelIds}\n relatedId={this.props.selectedAnno.id}\n visible={this.props.visible}\n onLabelUpdate={label => this.updateAnnoLabel(label)}\n possibleLabels={this.props.possibleLabels}\n multilabels={this.props.multilabels}\n disabled={!this.props.allowedActions.label}\n renderPopup\n focusOnRender\n open={true}\n defaultLabel={this.props.defaultLabel}\n />\n </div>\n )\n }\n \n}\n\nexport default AnnoLabelInput","import React, {Component} from 'react'\nimport { Menu } from 'semantic-ui-react'\n\nclass ImgBar extends Component{\n\n constructor(props) {\n super(props)\n this.state = {\n position: {\n top: 0,\n left: 0,\n },\n }\n }\n\n componentDidMount(){\n \n }\n componentDidUpdate(prevProps){\n\n if (this.props.svg !== prevProps.svg){\n this.setState({\n position: {...this.state.position,\n left: this.props.svg.left,\n top: this.props.svg.top,\n }\n })\n }\n }\n\n /*********\n * Events\n *********/\n handleLabelUpdate(label){\n if (this.props.onLabelUpdate){\n this.props.onLabelUpdate(label)\n }\n }\n \n handleClose(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n\n handleMouseEnter(e){\n if (this.props.onMouseEnter){\n this.props.onMouseEnter(e)\n }\n }\n\n // renderImgLabelInput(){\n // if (this.props.allowedActions.label){\n // return <Menu.Item style={{padding: \"5px\"}}>\n // <LabelInput\n // // multilabels={true}\n // multilabels={this.props.multilabels}\n // relatedId={this.props.annos.image.id}\n // visible={this.props.visible}\n // onLabelUpdate={label => this.handleLabelUpdate(label)}\n // possibleLabels={this.props.possibleLabels}\n // initLabelIds={this.props.imgLabelIds}\n // relatedId={this.props.annos.image.id}\n // disabled={!this.props.allowedActions.label}\n // />\n // </Menu.Item>\n // } else {\n // return null\n // }\n // }\n\n renderImgLabels(){\n let label = ''\n if (this.props.imgLabelIds && this.props.imgLabelIds.length > 0){\n let labelObject \n this.props.imgLabelIds.forEach((lbl, idx) => {\n labelObject = this.props.possibleLabels.find(el => {\n return el.id === lbl\n })\n if (idx > 0) label += ', '\n label += labelObject.label\n })\n return <Menu.Item >\n {label}\n </Menu.Item>\n } else {\n return null\n }\n }\n\n renderImgDescription(){\n if(this.props.annos.image.description){\n return <Menu.Item>\n {this.props.annos.image.description}\n </Menu.Item>\n } else {\n return null\n }\n }\n render(){\n if (!this.props.visible) return null\n if (!this.props.annos.image) return null\n // if (!this.props.annos.image.url) return null\n return(\n <div style={{\n position:'fixed', \n top: this.state.position.top, \n left:this.state.position.left,\n width: this.props.svg.width,\n minWidth: '300px'\n }}\n onMouseEnter={e => {this.handleMouseEnter(e)}} \n >\n <Menu inverted style={{opacity:0.9, justifyContent:'center', alignItems:'center'}}>\n {/* {this.renderImgLabelInput()} */}\n {this.renderImgDescription()}\n <Menu.Item\n >\n {/* {this.props.annos.image.url.split('/').pop() +\" (ID: \"+this.props.annos.image.id+\")\"} */}\n {\"ID: \"+this.props.annos.image.id}\n </Menu.Item>\n <Menu.Item \n >\n {this.props.annos.image.number +\" / \"+ this.props.annos.image.amount}\n </Menu.Item>\n {this.renderImgLabels()}\n </Menu>\n </div>\n )\n }\n}\n\nexport default ImgBar","import React, {Component} from 'react'\nimport { Dimmer, Header } from 'semantic-ui-react'\n\nclass Prompt extends Component{\n\n constructor(props) {\n super(props)\n this.state = {\n active: false\n }\n }\n\n handleClick(e){\n if (this.props.onClick){\n this.props.onClick(e)\n }\n }\n \n componentDidMount(){\n this.setState({active: this.props.active})\n }\n\n componentDidUpdate(prevProps){\n if (this.props.active !== prevProps.active){\n this.setState({active: this.props.active})\n }\n }\n\n \n render(){\n return (\n <Dimmer page \n active={this.state.active} \n style={{zIndex:2000}}\n onClick={e => this.handleClick(e)}\n >\n <Header as=\"h3\" inverted>\n {this.props.header}\n </Header>\n {this.props.content}\n </Dimmer>\n )\n }\n}\n\nexport default Prompt","import React, {Component} from 'react'\n\nimport * as transform from './utils/transform'\n\nclass AnnoToolBar extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n top: 400,\n left: 100,\n width: 50,\n label: undefined,\n visibility: 'hidden',\n possibleLabels: []\n }\n this.inputGroupRef = React.createRef()\n }\n\n componentWillMount(){\n this.setPosition()\n }\n \n componentDidUpdate(prevProps){\n if (this.props.visible){\n this.setPosition()\n } \n\n \n }\n\n /*************\n * LOGIC *\n *************/\n setPosition(){\n if (this.props.selectedAnno){\n // const center = transform.getCenter(this.props.selectedAnno.data, this.props.selectedAnno.type)\n // const annoBox = transform.getBox(this.props.selectedAnno.data, this.props.selectedAnno.type)\n let topPoint = transform.getTopPoint(this.props.selectedAnno.data)\n topPoint = transform.getMostLeftPoint(topPoint)[0]\n const inputRect = this.inputGroupRef.current.getBoundingClientRect()\n let top = this.props.svg.top + (topPoint.y + this.props.svg.translateY) *this.props.svg.scale - 44\n let left = this.props.svg.left + (topPoint.x + this.props.svg.translateX) *this.props.svg.scale - inputRect.width /2.0 - 1\n // if (left < this.props.svg.left) left = this.props.svg.left\n // if (left+inputRect.width > this.props.svg.left+this.props.svg.width){\n // left = this.props.svg.left+this.props.svg.width - inputRect.width\n // }\n if (top < 0) top = this.props.svg.top + (topPoint.y + this.props.svg.translateY + 10) *this.props.svg.scale \n if (this.state.top !== top || this.state.left !== left){ \n this.setState({\n top,\n left,\n // width: annoBox[1].x - annoBox[0].x\n })\n }\n }\n }\n\n onClose(){\n if (this.props.onClose){\n this.props.onClose()\n }\n }\n\n handleClick(e){\n if (this.props.onClick){\n this.props.onClick(e)\n }\n }\n \n renderDaviIcon(){\n return <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n // x=\"0px\" y=\"0px\"\n // width=\"1190.549px\" height=\"841.891px\" \n viewBox=\"0 0 1190.549 841.891\" \n width=\"60px\"\n onClick={e => this.handleClick(e)}\n >\n <g id=\"Info\">\n <path id=\"Maps\" fill={this.props.color} d=\"M620.561,817.217c-1.568-3.62-3.771-7.101-4.611-10.885\n c-24.452-109.811-74.341-207.569-139.215-298.675c-27.507-38.628-55.814-77.404-77.438-119.371\n C324.363,242.85,402.696,58.71,574.209,26.508c145.509-27.32,282.953,75.871,296.543,222.773\n c4.659,50.356-7.471,97.96-32.152,141.022c-27.812,48.526-58.75,95.364-90.073,141.758\n c-50.917,75.411-91.062,155.558-113.421,244.091c-2.438,9.652-3.936,19.543-6.271,29.227c-0.992,4.104-3.023,7.961-4.584,11.93\n C623.021,817.277,621.789,817.247,620.561,817.217z\"/>\n <path id=\"Text\" fillRule=\"evenodd\" clipRule=\"evenodd\" fill=\"#FFFFFF\" d=\"M724.709,250.898\n c-0.055-3.974,0.047-7.949,0.033-11.923c-0.007-1.228-1.54-2.767-2.76-2.777c-2.428-0.021-4.862-0.015-7.29-0.015\n c-22.466,0.001-44.934,0.005-67.404,0.009c-2.475,0.001-3.658,1.154-3.658,3.588c-0.001,47.365-0.001,94.73-0.001,142.096\n c0,13.526,0,27.05,0.001,40.577c0,2.305,1.274,3.584,3.562,3.59c6.623,0.004,9.256-0.07,19.873,0.004\n c10.618,0.072,14.146,8.543,14.146,14.189c-0.002,5.645-4.233,13.055-14.299,13.367c-13.135,0.061-26.277-0.02-39.414-0.014\n c-14.575,0.004-29.146,0.004-43.722,0.02c-4.191-0.084-13.717-2.789-13.717-13.492s6.233-13.643,13.132-14.117\n c4.979,0.037,13.802,0.057,20.701,0.049c1.695,0,3.11-1.537,3.11-3.361c0.003-13.912-0.004-27.823-0.004-41.736\n c0-30.252,0-60.503,0.002-90.754c0.002-17.03,0.005-33.649,0.002-50.678c0-1.991-1.38-3.336-3.396-3.336\n c-24.79,0-49.577,0-74.362,0c-2.133,0-3.38,1.22-3.383,3.308c-0.006,3.754-0.011,7.509,0.005,11.262\n c-0.023,6.339-3.067,13.143-12.456,13.143c-9.389,0-14.337-4.647-14.915-13.23c-0.128-4.305,0.004-8.612,0.004-12.918\n c0-8.392,0-16.781,0-25.173c0-0.321,0.228-5.156,4.091-9.277c3.864-4.122,8.014-3.822,8.445-3.822\n c25.835,0.003,51.672,0.002,77.507,0.002c46.813,0.001,140.443,0.001,140.443,0.001s6.153-0.088,10.926-0.052\n c0.3-0.008,5.713,0.363,9.178,3.994c3.46,3.631,3.046,8.407,3.046,8.635c-0.007,12.862,0.079,25.725-0.003,38.587\n c-0.074,8.051-6.938,12.819-13.703,12.847C731.482,263.519,724.956,259.059,724.709,250.898z\"/>\n </g>\n </svg>\n }\n\n /*************\n * RENDERING *\n **************/\n render(){\n if (!this.props.visible) return null\n return (\n <div ref={this.inputGroupRef} \n style={{\n position:'fixed', \n top:this.state.top, \n left:this.state.left,\n cursor: 'pointer',\n }}\n >\n {/* <Button icon circular basic\n onClick={e => this.handleClick(e)}\n > */}\n {/* <Icon name=\"pencil\"\n onClick={e => this.handleClick(e)}\n /> */}\n {/* </Button> */}\n {this.renderDaviIcon()}\n </div>\n )\n }\n \n}\n\nexport default AnnoToolBar","import * as transform from './transform'\nimport * as annoStatus from '../types/annoStatus'\nimport * as modes from '../types/modes'\nimport _ from 'lodash'\n\nfunction _fixBackendAnnoElement(element){\n return {...element, \n id : element.id ? element.id : _.uniqueId('new'),\n annoTime: element.annoTime ? element.annoTime : 0.0,\n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE,\n labelIds: element.labelIds ? element.labelIds : []\n }\n}\n\nexport function fixBackendAnnos(backendAnnos){\n let annos = { \n bBoxes: [...backendAnnos.bBoxes.map((element) => {\n return _fixBackendAnnoElement(element)\n })],\n lines: [...backendAnnos.lines.map((element) => {\n return _fixBackendAnnoElement(element)\n })],\n polygons: [...backendAnnos.polygons.map((element) => {\n return _fixBackendAnnoElement(element)\n })],\n points: [...backendAnnos.points.map((element) => {\n return _fixBackendAnnoElement(element)\n })],\n }\n console.log('fixBackendAnnos', annos)\n return annos\n}\n\nexport function backendAnnosToCanvas(backendAnnos, imgSize, imgOffset){\n let annos = [\n ...backendAnnos.bBoxes.map((element) => {\n return {...element, type:'bBox', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE}\n }),\n ...backendAnnos.lines.map((element) => {\n return {...element, type:'line', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE}\n }),\n ...backendAnnos.polygons.map((element) => {\n return {...element, type:'polygon', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE}\n }),\n ...backendAnnos.points.map((element) => {\n return {...element, type:'point', \n mode: element.mode ? element.mode : modes.VIEW, \n status: element.status ? element.status : annoStatus.DATABASE\n }\n })\n ]\n annos = annos.map((el) => {\n return {...el, \n data: transform.toSia(el.data, imgSize, el.type, imgOffset)}\n })\n // this.setState({annos: [...annos]})\n return annos\n}\n\nexport function canvasToBackendAnnos(annos, imgSize, forBackendPost=false, imgOffset={x:0,y:0}){\n let myAnnos = annos\n const bAnnos = myAnnos.map( el => {\n var annoId \n if (forBackendPost){\n // If an annotation will be send to backend,\n // ids of new created annoations need to be set to \n // undefined.\n annoId = (typeof el.id) === \"string\" ? undefined : el.id\n } else {\n annoId = el.id\n }\n return {\n ...el,\n id: annoId,\n mode: modes.VIEW,\n data: transform.toBackend(el.data, imgSize, el.type, imgOffset)\n }\n })\n\n const backendFormat = {\n bBoxes: bAnnos.filter((el) => {return el.type === 'bBox'}),\n lines: bAnnos.filter((el) => {return el.type === 'line'}),\n points: bAnnos.filter((el) => {return el.type === 'point'}),\n polygons: bAnnos.filter((el) => {return el.type === 'polygon'}),\n }\n return backendFormat\n}","export const EDIT_LABEL='editLabel'\nexport const DELETE_ANNO='deleteAnno'\nexport const ENTER_ANNO_ADD_MODE='enterAnnoAddMode'\nexport const LEAVE_ANNO_ADD_MODE='leaveAnnoAddMode'\nexport const UNDO='undo'\nexport const REDO='redo'\nexport const TRAVERSE_ANNOS='traverseAnnos'\nexport const CAM_MOVE_UP='camMoveUp'\nexport const CAM_MOVE_DOWN='camMoveDown'\nexport const CAM_MOVE_LEFT='camMoveLeft'\nexport const CAM_MOVE_RIGHT='camMoveRight'\nexport const CAM_MOVE_STOP='camMoveStop'\nexport const COPY_ANNOTATION='copyAnnotation'\nexport const PASTE_ANNOTATION='pasteAnnotation'\nexport const RECREATE_ANNO='recreateAnnotation'\nexport const DELETE_ANNO_IN_CREATION='deleteAnnoInCreation'\n\nclass KeyMapper{\n constructor(keyActionHandler=undefined){\n this.controlDown = false\n this.keyActionHandler = keyActionHandler\n }\n\n keyDown(key){\n switch (key){\n case 'Enter':\n this.triggerKeyAction(EDIT_LABEL)\n break\n case 'Delete':\n this.triggerKeyAction(DELETE_ANNO)\n break\n case 'Backspace':\n this.triggerKeyAction(DELETE_ANNO)\n break\n case 'Control':\n this.controlDown = true\n this.triggerKeyAction(ENTER_ANNO_ADD_MODE)\n break\n case 'z':\n if (this.controlDown){\n this.triggerKeyAction(UNDO)\n }\n break\n case 'r':\n if (this.controlDown){\n this.triggerKeyAction(REDO)\n }\n break\n case 'Tab':\n this.triggerKeyAction(TRAVERSE_ANNOS)\n break\n case 'w':\n this.triggerKeyAction(CAM_MOVE_UP)\n break\n case 's':\n this.triggerKeyAction(CAM_MOVE_DOWN)\n break\n case 'a':\n this.triggerKeyAction(CAM_MOVE_LEFT)\n break\n case 'd':\n this.triggerKeyAction(CAM_MOVE_RIGHT)\n break\n case 'e':\n this.triggerKeyAction(RECREATE_ANNO)\n break\n case 'c':\n if (this.controlDown){\n this.triggerKeyAction(COPY_ANNOTATION)\n }\n break\n case 'v':\n if (this.controlDown){\n this.triggerKeyAction(PASTE_ANNOTATION)\n }\n break\n case 'Escape':\n this.triggerKeyAction(DELETE_ANNO_IN_CREATION)\n break\n default:\n break\n }\n }\n\n keyUp(key){\n switch (key){\n case 'Control':\n this.controlDown = false\n this.triggerKeyAction(LEAVE_ANNO_ADD_MODE)\n break\n default:\n break\n }\n }\n\n triggerKeyAction(keyAction){\n if (this.keyActionHandler){\n this.keyActionHandler(keyAction)\n }\n }\n\n}\n\nexport default KeyMapper","export const POINT = 'point'\nexport const BBOX = 'bBox'\nexport const LINE = 'line'\nexport const POLYGON = 'polygon'","class UndoRedo{\n constructor(maxElements=100){\n this.hist = []\n this.pointer = 0\n this.maxElements = maxElements\n }\n\n push(entry, description='No description'){\n const histEl = {\n entry,\n description\n }\n if (this.pointer !== 0){\n while (this.pointer !== 0){\n this.pointer--\n this.hist.shift()\n }\n }\n this.hist.unshift(histEl)\n if (this.hist.length > this.maxElements){\n this.hist.pop()\n }\n }\n\n undo(){\n if (this.pointer+1 < this.hist.length){\n // const element = \n this.pointer++\n return this.hist[this.pointer]\n } else {\n return this.hist[this.hist.length-1]\n }\n }\n\n undoMia(){\n if (this.pointer+1 < this.hist.length){\n this.pointer++\n return this.hist[this.pointer-1] \n } else {\n return this.hist[this.hist.length-1]\n }\n }\n\n redo(){\n if (this.pointer-1 >= 0){\n this.pointer--\n return this.hist[this.pointer]\n } else {\n return this.hist[0]\n }\n }\n\n getHist(){\n return this.hist\n }\n\n clearHist(){\n this.hist = []\n }\n\n isEmpty(){\n return this.hist.length === 0\n }\n\n}\n\nexport default UndoRedo","export function getViewportCoordinates(w, svg){\n const window = {\n xMin:-1*svg.translateX,\n xMax: -1*svg.translateX + (svg.width)/svg.scale,\n yMin: -1*svg.translateY,\n yMax: -1*svg.translateY + (svg.height)/svg.scale\n\n }\n const viewport = {\n xMin: 0,\n xMax: svg.width,\n yMin: 0,\n yMax: svg.height\n }\n const scaleX = (viewport.xMax - viewport.xMin)/ (window.xMax - window.xMin)\n const scaleY = (viewport.yMax - viewport.yMin)/ (window.yMax - window.yMin)\n\n const vX = viewport.xMin + (w.x - window.xMin) * scaleX\n const vY = viewport.yMin + (w.y - window.yMin) * scaleY\n return {window, viewport, vX, vY, scaleX, scaleY}\n}\n\n/**\n * \n * @param {*} w0 Point in image coordinate system\n * @param {*} svg Svg with old translation values and old scales\n * @param {*} s1 New scale/zoom\n */\nexport function getZoomTranslation(w0, svg, s1){\n const s0 = svg.scale\n let translation = {x:0,y:0}\n translation.x = (s0/s1) * (w0.x + svg.translateX) - w0.x \n translation.y = (s0/s1) * (w0.y + svg.translateY) - w0.y \n return translation\n}","import React, {Component} from 'react'\nimport _ from 'lodash'\nimport Annotation from './Annotation/Annotation'\nimport AnnoLabelInput from './AnnoLabelInput'\nimport ImgBar from './ImgBar'\nimport Prompt from './Prompt'\nimport LabelInput from './LabelInput'\nimport AnnoToolBar from './AnnoToolBar'\n\n\nimport * as annoConversion from './utils/annoConversion'\nimport * as keyActions from './utils/keyActions'\nimport KeyMapper from './utils/keyActions'\nimport * as TOOLS from './types/tools'\nimport * as modes from './types/modes'\nimport UndoRedo from './utils/hist'\nimport * as annoStatus from './types/annoStatus'\nimport * as canvasActions from './types/canvasActions'\nimport { Loader, Dimmer, Icon, Header, Button } from 'semantic-ui-react';\nimport * as mouse from './utils/mouse';\nimport * as colorlut from './utils/colorlut'\nimport * as notificationType from './types/notificationType'\nimport * as wv from './utils/windowViewport'\n\nimport './SIA.scss'\n\n\n/**\n * SIA Canvas element that handles annotations within an image\n * \n * @param {React.Ref} container - A react ref to a div that defines the\n * space where this Canvas lives in.\n * @param {object} annos - A json object containing all annotation \n * information for an image\n * {\n * image : {\n * id: int, \n * number: int, \n * amount: int, \n * isFirst: bool, \n * isLast: bool,\n * description: string, // -> optional\n * },\n * annotations: {\n * bBoxes: [{\n * id: int, // -> Not required if status === annoStatus.NEW\n * data: {},\n * labelIds: list of int, // -> optional\n * status: see annoStatus, // -> optional\n * annoTime: float, // -> optional\n * },...],\n * points: []\n * lines: []\n * polygons: []\n * }\n * }\n * @param {object} possibleLabels - Possible labels that can be assigned to \n * an annotation.\n * { \n * id: int, \n * description: str, \n * label: str, (name of the label) \n * color: str (color is optional)\n * }\n * @param {object} image - The actual image blob that will be displayed\n * {id: int, data: blob}\n * @param {object} uiConfig - User interface configs \n * {nodesRadius: int, strokeWidth: int}\n * @param {int} layoutUpdate - A counter that triggers a layout update\n * everytime it is incremented.\n * @param {string} selectedTool - The tool that is selected to draw an \n * annotation. Possible choices are: 'bBox', 'point', 'line', 'polygon'\n * @param {object} canvasConfig - Configuration for this canvas\n * {\n * annos:{\n * tools: {\n * point: bool,\n * line: bool,\n * polygon: bool,\n * bbox: bool\n * },\n * multilabels: bool,\n * actions: {\n * draw: bool,\n * label: bool,\n * edit: bool,\n * },\n * maxAnnos: null or int,\n * minArea: int\n * },\n * img: {\n * multilabels: bool,\n * actions: {\n * label: bool,\n * }\n * }\n * }\n * @param {bool} imgBarVisible - Controls visibility of the ImgBar\n * @param {bool} imgLabelInputVisible - Controls visibility of the ImgLabelInputPrompt\n * @param {object} layoutOffset - Offset of the canvas inside the container:\n * {left:int, top:int, right:int, bottom:int} values in pixels.\n * @param {bool} centerCanvasInContainer - Center the canvas in the \n * middle of the container.\n * @param {bool} maxCanvas - Maximize Canvas Size. Do not fit canvas to image size\n * @param {str or int} defaultLabel (optional) - Name or ID of the default label that is used\n * when no label was selected by the annotator. If not set \"no label\" will be used.\n * If ID is used, it needs to be one of the possible label ids.\n * @param {bool} blocked Block canvas view with loading dimmer.\n * @param {bool} lockedAnnos A list of AnnoIds of annos that should only be displayed.\n * Such annos can not be edited in any way.\n * @event onSVGUpdate - Fires when the svg in canvas changed.\n * args: {width: int, height: int, scale: float, translateX: float,\n * translateY:float}\n * @event onImageLoaded - Fires when an image was loaded into the canvas\n * @event onAnnoSelect - Fires when an annotation was selected or if the\n * selected annotation was updated.\n * @event onImgBarClose - Fires when close button on ImgBar was hit.\n * @event onImgLabelInputClose - ImgLabelInput requests to be closed.\n * @event onNotification - Callback for Notification messages\n * args: {title: str, message: str, type: str}\n * @event onKeyDown - Fires for keyDown on canvas \n * @event onKeyUp - Fires for keyUp on canvas \n * @event onAnnoPerformedAction - Fires when an anno performed an action\n * args: {annoId: int, newAnnos: list of annoObjects, pAction: str}\n */\nclass Canvas extends Component{\n\n constructor(props){\n super(props)\n this.state = {\n \n svg: {\n width: '100%',\n height: '100%',\n scale:1.0,\n translateX:0,\n translateY:0\n },\n image: {\n width: undefined,\n height: undefined\n },\n imageOffset: {\n x: 0,\n y: 0\n },\n annos: [],\n mode: modes.VIEW,\n // selectedAnnoId: {id:undefined},\n selectedAnnoId: undefined,\n showSingleAnno: undefined,\n showLabelInput: false,\n imageLoaded: false,\n imgLoadCount: 0,\n imgLabelIds: [],\n imgLabelChanged: false,\n imgAnnoTime: 0,\n imgLoadTimestamp: 0,\n performedImageInit: false,\n prevLabel: [],\n imageData: undefined,\n isJunk: false,\n imgBarVisible:false,\n annoToolBarVisible: false,\n possibleLabels: undefined\n }\n this.img = React.createRef()\n this.svg = React.createRef()\n this.container = React.createRef()\n this.hist = new UndoRedo()\n this.keyMapper = new KeyMapper((keyAction) => this.handleKeyAction(keyAction))\n this.mousePosAbs = undefined\n this.clipboard = undefined\n }\n\n componentDidMount(){\n this.updatePossibleLabels()\n if (Number.isInteger(this.props.defaultLabel)){\n\n this.setState({prevLabel:[this.props.defaultLabel]})\n }\n }\n\n componentDidUpdate(prevProps, prevState){\n // if (this.props.image.id !== prevProps.image.id){\n \n // }\n if (prevProps.annos !== this.props.annos){\n this.setState({\n imgLabelIds: this.props.annos.image.labelIds,\n imgAnnoTime: this.props.annos.image.annoTime,\n imgLoadTimestamp: performance.now()\n // isJunk: this.props.annos.image.isJunk\n })\n if (this.state.imageData) { \n this.updateCanvasView(\n annoConversion.fixBackendAnnos(this.props.annos.annotations) \n ) \n }\n // this.setState({\n // imageLoaded: false,\n // // imageData: undefined\n // })\n }\n if (prevProps.isJunk !== this.props.isJunk){\n if (this.state.isJunk !== this.props.isJunk){\n this.setState({\n isJunk: this.props.isJunk\n })\n }\n }\n if (this.state.imageData !== this.props.image.data){\n this.setState({imageData: this.props.image.data})\n }\n // if (!this.state.imageLoaded){\n // if(this.props.annos.image.id === this.props.image.id){\n // this.setState({\n // imageLoaded: true\n // })\n // if (this.props.onImageLoaded){\n // this.props.onImageLoaded()\n // }\n // }\n // }\n if (this.props.possibleLabels !== prevProps.possibleLabels){\n this.updatePossibleLabels()\n }\n if (this.state.performedImageInit){\n // Initialize canvas history\n this.setState({\n performedImageInit:false,\n annoToolBarVisible:false\n })\n if (this.props.imgBarVisible){\n this.setState({imgBarVisible:true})\n }\n this.hist.clearHist()\n this.hist.push({\n ...this.getAnnos(),\n selectedAnnoId: undefined\n }, 'init')\n }\n if (this.state.imageLoaded){\n // Selected annotation should be on top\n this.putSelectedOnTop(prevState)\n if (prevState.imgLoadCount !== this.state.imgLoadCount){\n this.updateCanvasView(\n annoConversion.fixBackendAnnos(this.props.annos.annotations)\n )\n this.setImageLabels(this.props.annos.image.labelIds)\n this.setState({\n performedImageInit:true\n })\n } \n if(prevProps.layoutUpdate !== this.props.layoutUpdate){\n this.selectAnnotation(undefined)\n // this.updateCanvasView(this.getAnnoBackendFormat())\n // const {imageOffset} = this.updateImageSize()\n this.updateCanvasView(annoConversion.canvasToBackendAnnos(\n this.state.annos, this.state.svg, false, this.state.imageOffset\n ))\n }\n \n }\n }\n\n onImageLoad(){\n this.setState({\n imageLoaded: true,\n imgLoadCount: this.state.imgLoadCount + 1,\n showLabelInput: false,\n showSingleAnno: undefined,\n selectedAnnoId: undefined\n })\n if (this.props.onImageLoaded){\n this.props.onImageLoaded()\n }\n }\n\n onMouseOver(){\n //Prevent scrolling on svg\n this.svg.current.focus()\n }\n\n onWheel(e){\n // Zoom implementation. Note that svg is first scaled and \n // second translated!\n const up = e.deltaY < 0\n const mousePos = this.getMousePosition(e)\n const zoomFactor=1.25\n let nextScale\n if (up) {\n nextScale = this.state.svg.scale * zoomFactor\n \n } else {\n nextScale = this.state.svg.scale / zoomFactor\n }\n let newTranslation\n //Constrain zoom\n if (nextScale < 1.0){\n nextScale = 1.0\n newTranslation = {x:0, y:0}\n } else if (nextScale > 200.0){\n nextScale = 200.0\n newTranslation = wv.getZoomTranslation(mousePos, this.state.svg, nextScale)\n } else {\n newTranslation = wv.getZoomTranslation(mousePos, this.state.svg, nextScale)\n }\n this.setState({svg: {\n ...this.state.svg,\n scale: nextScale,\n // translateX: -1*(mousePos.x * nextScale - mousePos.x)/nextScale,\n // translateY: -1*(mousePos.y * nextScale - mousePos.y)/nextScale\n translateX: newTranslation.x,\n translateY: newTranslation.y\n }})\n return false\n }\n\n onRightClick(e){\n e.preventDefault()\n }\n\n onMouseDown(e){\n if (e.button === 0){\n this.selectAnnotation(undefined)\n }\n else if (e.button === 1){\n this.setMode(modes.CAMERA_MOVE)\n }\n else if (e.button === 2){\n //Create annotation on right click\n this.createNewAnnotation(e)\n }\n }\n\n onAnnoMouseDown(e){\n if (e.button === 1){\n // this.collectAnnos()\n this.setMode(modes.CAMERA_MOVE)\n }\n else if (e.button === 2){\n //Create annotation on right click\n this.createNewAnnotation(e)\n }\n else if (e.button === 0){\n if (this.state.showLabelInput){\n const anno = this.findAnno(this.state.selectedAnnoId)\n this.updateSelectedAnno(anno, modes.VIEW)\n this.showSingleAnno(undefined)\n this.showLabelInput(false)\n }\n }\n }\n\n onMouseUp(e){\n switch (e.button){\n case 1:\n this.setMode(modes.VIEW)\n break\n default:\n break\n }\n }\n\n handleKeyAction(action){\n const anno = this.findAnno(this.state.selectedAnnoId)\n const camKeyStepSize = 20 * this.state.svg.scale\n\n switch(action){\n case keyActions.EDIT_LABEL:\n // Need to get the newest version of annotation data directly \n // from annotation object, when editing label/ hitting enter\n // in create mode, since annotation data in canvas are not updated\n // to this point in time. \n const ar = this.findAnnoRef(this.state.selectedAnnoId)\n let myAnno = undefined\n if (ar !== undefined){\n myAnno = ar.current.myAnno.current.getResult()\n }\n this.editAnnoLabel(myAnno)\n break\n case keyActions.DELETE_ANNO:\n this.deleteAnnotation(anno)\n break\n case keyActions.DELETE_ANNO_IN_CREATION:\n this.deleteAnnoInCreationMode(anno)\n break\n case keyActions.ENTER_ANNO_ADD_MODE:\n if (anno){\n this.updateSelectedAnno(\n anno, modes.ADD\n )\n // this.showSingleAnno(anno.id)\n }\n break\n case keyActions.LEAVE_ANNO_ADD_MODE:\n if (anno){\n this.updateSelectedAnno(\n anno, modes.VIEW\n )\n // this.showSingleAnno(undefined)\n }\n break\n case keyActions.UNDO:\n this.undo()\n break\n case keyActions.REDO:\n this.redo()\n break\n case keyActions.TRAVERSE_ANNOS:\n this.traverseAnnos()\n break\n case keyActions.CAM_MOVE_LEFT:\n // this.setMode(modes.CAMERA_MOVE)\n this.moveCamera(camKeyStepSize, 0)\n break\n case keyActions.CAM_MOVE_RIGHT:\n this.moveCamera(-camKeyStepSize, 0)\n break\n case keyActions.CAM_MOVE_UP:\n this.moveCamera(0, camKeyStepSize)\n break\n case keyActions.CAM_MOVE_DOWN:\n this.moveCamera(0, -camKeyStepSize)\n break\n case keyActions.CAM_MOVE_STOP:\n // this.setMode(modes.VIEW)\n break\n case keyActions.COPY_ANNOTATION:\n this.copyAnnotation()\n break\n case keyActions.PASTE_ANNOTATION:\n this.pasteAnnotation(0)\n break\n case keyActions.RECREATE_ANNO:\n // recreate selected annotation using the anno id\n if(this.state.selectedAnnoId) this.recreateAnnotation(this.state.selectedAnnoId)\n break\n default:\n console.warn('Unknown key action', action)\n }\n\n }\n\n onKeyDown(e){\n e.preventDefault()\n this.keyMapper.keyDown(e.key)\n // this.findAnno(this.state.selectedAnnoId)\n if (this.props.onKeyDown){\n this.props.onKeyDown(e)\n }\n }\n\n onKeyUp(e){\n e.preventDefault()\n this.keyMapper.keyUp(e.key)\n if (this.props.onKeyUp){\n this.props.onKeyUp(e)\n }\n }\n\n onMouseMove(e){\n if (this.state.mode === modes.CAMERA_MOVE){\n this.moveCamera(e.movementX, e.movementY)\n }\n }\n\n onLabelInputDeleteClick(annoId){\n this.removeSelectedAnno()\n }\n \n \n\n /**\n * Handle actions that have been performed by an annotation \n * @param {Number} anno Id of the annotation\n * @param {String} pAction Action that was performed\n */\n onAnnoPerformedAction(anno, pAction){\n let newAnnos = undefined\n switch(pAction){\n case canvasActions.ANNO_SELECTED:\n this.selectAnnotation(anno.id)\n break\n case canvasActions.ANNO_START_CREATING:\n newAnnos = this.updateSelectedAnno(anno)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_CREATED:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.showSingleAnno(undefined)\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_MOVED:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.showSingleAnno(undefined)\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_ENTER_MOVE_MODE:\n anno = this.startAnnotimeMeasure(anno)\n this.updateSelectedAnno(anno, modes.MOVE)\n this.showSingleAnno(anno.id)\n this.setState({annoToolBarVisible:false})\n break\n case canvasActions.ANNO_ENTER_EDIT_MODE:\n anno = this.startAnnotimeMeasure(anno)\n this.updateSelectedAnno(anno, modes.EDIT)\n // this.showSingleAnno(anno.id)\n this.setState({annoToolBarVisible:false})\n break\n case canvasActions.ANNO_ADDED_NODE:\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_REMOVED_NODE:\n if (!this.checkAnnoLength(anno)){\n newAnnos = this.updateSelectedAnno(anno, modes.DELETED)\n this.showSingleAnno(undefined)\n } else {\n newAnnos = this.updateSelectedAnno(anno, modes.CREATE)\n }\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_EDITED:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_DELETED:\n newAnnos = this.updateSelectedAnno(anno, modes.DELETED)\n this.selectAnnotation(undefined)\n this.showSingleAnno(undefined)\n this.pushHist(\n newAnnos, undefined,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_LABEL_UPDATE:\n anno = this.stopAnnotimeMeasure(anno)\n if (!this.checkAnnoLength(anno)){\n newAnnos = this.updateSelectedAnno(anno, modes.DELETED)\n } else {\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n }\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.setState({annoToolBarVisible:true})\n break\n case canvasActions.ANNO_CREATED_NODE:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.CREATE)\n this.pushHist(\n newAnnos, anno.id,\n pAction, this.state.showSingleAnno\n )\n break\n case canvasActions.ANNO_CREATED_FINAL_NODE:\n anno = this.stopAnnotimeMeasure(anno)\n newAnnos = this.updateSelectedAnno(anno, modes.VIEW)\n this.pushHist(\n newAnnos, anno.id,\n pAction, undefined\n )\n this.showSingleAnno(undefined)\n this.setState({annoToolBarVisible:true})\n break\n default:\n console.warn('Action not handeled', pAction)\n break\n }\n if (this.props.onAnnoPerformedAction){\n this.props.onAnnoPerformedAction(anno.id, newAnnos, pAction)\n }\n }\n\n onAnnoLabelInputUpdate(anno){\n this.updateSelectedAnno(anno)\n }\n\n onAnnoLabelInputClose(){\n this.svg.current.focus()\n this.showLabelInput(false)\n this.showSingleAnno(undefined)\n const anno = this.findAnno(this.state.selectedAnnoId)\n this.onAnnoPerformedAction(anno, canvasActions.ANNO_LABEL_UPDATE)\n }\n\n handleImgBarClose(){\n if (this.props.onImgBarClose){\n this.props.onImgBarClose()\n }\n }\n\n handleImgLabelUpdate(label){\n this.setState({\n imgLabelIds: label,\n imgLabelChanged: true,\n })\n this.pushHist(this.state.annos,\n this.state.selectedAnnoId,\n canvasActions.IMG_LABEL_UPDATE,\n this.state.showSingleAnno,\n label\n )\n }\n\n handleCanvasClick(e){\n if (this.props.imgBarVisible){\n this.setState({imgBarVisible:true})\n }\n }\n\n handleImgBarMouseEnter(e){\n this.setState({imgBarVisible:false})\n }\n\n handleImgLabelInputClose(){\n if (this.props.onImgLabelInputClose){\n this.props.onImgLabelInputClose()\n }\n }\n\n handleSvgMouseMove(e){\n this.mousePosAbs = mouse.getMousePositionAbs(e, this.state.svg)\n }\n\n handleNotification(messageObj){\n if (this.props.onNotification){\n this.props.onNotification(messageObj)\n }\n }\n\n /*************\n * LOGIC *\n **************/\n copyAnnotation(){\n this.clipboard = this.findAnno(this.state.selectedAnnoId)\n this.handleNotification({\n title: \"Copyed annotation to clipboard\",\n message: 'Copyed '+this.clipboard.type,\n type: notificationType.SUCCESS\n })\n }\n\n pasteAnnotation(offset=0){\n if (this.clipboard){\n let annos = [...this.state.annos]\n const uid = _.uniqueId('new')\n annos.push({\n ...this.clipboard,\n id: uid,\n annoTime: 0,\n status: annoStatus.NEW,\n data: this.clipboard.data.map(e => {\n return {x: e.x+offset, y: e.y+offset}\n })\n })\n this.setState({annos: annos, selectedAnnoId: uid})\n this.handleNotification({\n title: \"Pasted annotation to canvas\",\n message: 'Pasted and selected '+this.clipboard.type,\n type: notificationType.SUCCESS\n })\n }\n }\n\n\n checkAnnoLength(anno){\n if (anno.type === 'polygon' && anno.data.length < 3){\n this.handleNotification({\n title: \"Invalid polygon!\",\n message: 'A vaild polygon needs at least 3 points!',\n type: notificationType.WARNING\n })\n return false\n } \n // if (anno.type === 'line' && anno.data.length < 2){\n // this.handleNotification({\n // title: \"Invalid line!\",\n // message: 'A vaild line needs at least 2 points!',\n // type: notificationType.WARNING\n // })\n // return false\n // } \n return true\n }\n\n startAnnotimeMeasure(anno){\n anno.timestamp = performance.now()\n return anno\n }\n \n stopAnnotimeMeasure(anno){\n if (anno.timestamp === undefined){\n console.error('No timestamp for annotime measurement. Check if you started measurement', anno)\n return undefined\n } else {\n let now = performance.now()\n anno.annoTime += (now - anno.timestamp) / 1000\n anno.timestamp = now\n return anno\n }\n }\n\n updatePossibleLabels(){\n if (!this.props.possibleLabels) return\n if (this.props.possibleLabels.length <= 0) return\n let lbls = this.props.possibleLabels\n lbls = lbls.map(e => {\n if (!('color' in e)){\n return {\n ...e, color: colorlut.getColor(e.id)}\n } else {\n return {...e}\n }\n })\n this.setState({\n possibleLabels: [...lbls]\n })\n }\n\n editAnnoLabel(anno){\n if (this.state.selectedAnnoId){\n let myAnno\n if (anno === undefined){\n myAnno = this.findAnno(this.state.selectedAnnoId)\n } else {\n myAnno = {...anno}\n }\n myAnno = this.startAnnotimeMeasure(myAnno)\n this.showLabelInput()\n this.updateSelectedAnno(myAnno, modes.EDIT_LABEL)\n }\n }\n unloadImage(){\n if(this.state.imageLoaded){\n this.setState({imageLoaded:false})\n }\n }\n /**\n * Find a annotation by id in current state\n * \n * @param {int} annoId - Id of the annotation to find\n */\n findAnno(annoId){\n return this.state.annos.find(e => {\n return e.id === annoId\n })\n }\n\n findAnnoRef(annoId){\n if (this.state.selectedAnnoId === undefined) return undefined\n return this.annoRefs.find(e => {\n if (e.current){\n return e.current.isSelected()\n } else {\n return false\n }\n })\n }\n\n pushHist(annos, selectedAnnoId, pAction, showSingleAnno, imgLabelIds=this.state.imgLabelIds){\n this.hist.push({\n ...this.getAnnos(annos, false),\n selectedAnnoId: selectedAnnoId,\n showSingleAnno: showSingleAnno,\n imgLabelIds: imgLabelIds\n }, pAction)\n }\n\n undo(){\n if (!this.hist.isEmpty()){\n const cState = this.hist.undo()\n this.setCanvasState(\n cState.entry.annotations,\n cState.entry.imgLabelIds, \n cState.entry.selectedAnnoId,\n cState.entry.showSingleAnno)\n }\n }\n\n redo(){\n if (!this.hist.isEmpty()){\n const cState = this.hist.redo()\n this.setCanvasState(\n cState.entry.annotations,\n cState.entry.imgLabelIds, \n cState.entry.selectedAnnoId,\n cState.entry.showSingleAnno)\n }\n }\n\n deleteAnnotation(anno) {\n if (anno){\n if (anno.mode === modes.CREATE){\n const ar = this.findAnnoRef(this.state.selectedAnnoId)\n if (ar !== undefined) ar.current.myAnno.current.removeLastNode()\n \n } else {\n this.onAnnoPerformedAction(anno, canvasActions.ANNO_DELETED)\n }\n }\n }\n\n deleteAnnoInCreationMode(anno) {\n if (anno){\n if (anno.mode === modes.CREATE){\n // const ar = this.findAnnoRef(this.state.selectedAnnoId)\n // if (ar !== undefined) ar.current.myAnno.current.removeLastNode()\n this.onAnnoPerformedAction(anno, canvasActions.ANNO_DELETED)\n \n } else {\n }\n }\n }\n\n deleteAllAnnos(){\n let newAnnos = []\n this.state.annos.forEach( e => {\n if ((typeof e.id) !== \"string\"){\n newAnnos.push(\n {...e, status: annoStatus.DELETED}\n )\n }\n })\n this.pushHist(newAnnos, undefined, 'deletedAllAnnos', this.state.showSingleAnno, this.state.imgLabelIds)\n this.setState({annos: newAnnos})\n this.selectAnnotation(undefined)\n this.showSingleAnno(undefined)\n }\n\n /**\n * Set state of Canvas annotations and imageLabels.\n * \n * @param {list} annotations - Annotations in backend format\n * @param {list} imgLabelIds - IDs of the image labels\n * @param {object} selectedAnno - The selected annotation\n * @param {int} showSingleAnno - The id of the single annotation\n * that should be visible\n */\n setCanvasState(annotations, imgLabelIds, selectedAnnoId, showSingleAnno){\n this.updateCanvasView({...annotations})\n this.setImageLabels([...imgLabelIds])\n this.selectAnnotation(selectedAnnoId)\n this.setState({showSingleAnno: showSingleAnno})\n }\n\n isLocked(annoId){\n if (this.props.lockedAnnos){\n if (this.props.lockedAnnos.includes(annoId)){\n return true\n }\n }\n return false\n }\n\n selectAnnotation(annoId){\n if (this.isLocked(annoId)) {\n this.handleNotification({\n title: \"Annotation locked\",\n message: `Annotation with id ${annoId} is locked and can not be edited`,\n type: notificationType.WARNING\n })\n return\n } \n if (annoId){\n const anno = this.findAnno(annoId)\n this.setState({\n selectedAnnoId: annoId\n })\n if (anno){\n if (anno.mode !== modes.CREATE){\n this.setState({\n annoToolBarVisible: true\n })\n }\n }\n } else {\n this.setState({\n selectedAnnoId: undefined,\n annoToolBarVisible: false\n })\n if (this.state.showLabelInput){\n this.onAnnoLabelInputClose()\n }\n }\n if(this.props.onAnnoSelect){\n const anno = this.findAnno(annoId)\n this.props.onAnnoSelect(anno)\n }\n }\n\n /**\n * Traverse annotations by key hit\n */\n traverseAnnos(){\n if (this.state.annos.length > 0){\n const myAnnos = this.state.annos.filter(e => {\n return e.status !== annoStatus.DELETED && !this.isLocked(e.id)\n })\n if (myAnnos.length > 0){\n if (!this.state.selectedAnnoId){\n this.selectAnnotation(myAnnos[0].id)\n } else {\n let currentIdx = myAnnos.findIndex( e => {\n return e.id === this.state.selectedAnnoId\n })\n if (currentIdx+1 < myAnnos.length){\n this.selectAnnotation(myAnnos[currentIdx+1].id)\n } else {\n this.selectAnnotation(myAnnos[0].id)\n }\n }\n }\n }\n } \n\n getAnnos(annos=undefined, removeFrontedIds=true){\n const myAnnos = annos ? annos : this.state.annos\n // const backendFormat = this.getAnnoBackendFormat(removeFrontedIds, myAnnos)\n const backendFormat = annoConversion.canvasToBackendAnnos(myAnnos, \n this.state.svg, removeFrontedIds, this.state.imageOffset)\n const finalData = {\n imgId: this.props.annos.image.id,\n imgLabelIds: this.state.imgLabelIds,\n imgLabelChanged: this.state.imgLabelChanged,\n annotations: backendFormat,\n isJunk: this.state.isJunk,\n annoTime: this.props.annos.image.annoTime + (performance.now() - this.state.imgLoadTimestamp)/1000\n }\n return finalData\n }\n\n /**\n * Reset zoom level on Canvas\n */\n resetZoom(){\n this.setState({svg: {\n ...this.state.svg,\n translateX: 0,\n translateY: 0,\n scale: 1.0\n }})\n }\n\n moveCamera(movementX, movementY){\n let trans_x = this.state.svg.translateX + movementX / this.state.svg.scale\n let trans_y = this.state.svg.translateY + movementY / this.state.svg.scale\n const vXMin = this.state.svg.width * 0.25\n const vXMax = this.state.svg.width * 0.75\n const yXMin = this.state.svg.height * 0.25\n const yXMax = this.state.svg.height * 0.75\n const vLeft = wv.getViewportCoordinates({x:0, y:0}, this.state.svg)\n const vRight = wv.getViewportCoordinates({x:this.state.svg.width, y:this.state.svg.height}, this.state.svg)\n if (vLeft.vX >= vXMin){\n trans_x = this.state.svg.translateX - 5\n } else if (vRight.vX <= vXMax){\n trans_x = this.state.svg.translateX +5\n } \n if (vLeft.vY >= yXMin){\n trans_y = this.state.svg.translateY - 5\n } else if (vRight.vY <= yXMax){\n trans_y= this.state.svg.translateY +5\n } \n this.setState({svg: {\n ...this.state.svg,\n translateX: trans_x,\n translateY: trans_y\n }})\n }\n\n setMode(mode){\n if (this.state.mode !== mode){\n this.setState({mode: mode})\n }\n }\n \n getMousePosition(e){\n const absPos = this.getMousePositionAbs(e)\n return {\n x: (absPos.x )/this.state.svg.scale - this.state.svg.translateX,\n y: (absPos.y )/this.state.svg.scale - this.state.svg.translateY\n }\n }\n\n getMousePositionAbs(e){\n return {\n x: (e.pageX - this.svg.current.getBoundingClientRect().left),\n y: (e.pageY - this.svg.current.getBoundingClientRect().top)\n }\n }\n\n showLabelInput(visible=true){\n this.setState({\n showLabelInput: visible\n })\n if (visible){\n this.showSingleAnno(this.state.selectedAnnoId)\n }\n }\n\n createNewAnnotation(e){\n //Do not create new Annotation if controlKey was pressed!\n let allowed = false\n if (this.keyMapper.controlDown) return\n if (this.props.selectedTool){\n const maxAnnos = this.props.canvasConfig.annos.maxAnnos\n if (maxAnnos){\n if (this.state.annos.length < maxAnnos){\n allowed = true\n } else {\n console.warn('Maximum number of annotations reached! MaxAnnos:', maxAnnos)\n this.handleNotification({\n title: 'Maximum number of annotations reached!',\n message: `Only ${maxAnnos} annotations per image are allowed by config` ,\n type: notificationType.WARNING\n })\n }\n } else {\n allowed = true\n }\n } else {\n console.warn('No annotation tool selected!')\n this.handleNotification({\n title: 'No tool selected!',\n message: 'Please select an annotation tool in the toolbar.',\n type: notificationType.INFO\n })\n }\n if (allowed){\n const mousePos = this.getMousePosition(e)\n // const selAnno = this.findAnno(this.state.selectedAnnoId)\n let newAnno = {\n id: _.uniqueId('new'),\n type: this.props.selectedTool,\n data: [{\n x: mousePos.x, \n y: mousePos.y\n },{\n x: mousePos.x,\n y: mousePos.y\n }],\n mode: modes.CREATE,\n status: annoStatus.NEW,\n labelIds: this.state.prevLabel,\n selectedNode: 1,\n annoTime: 0.0\n }\n newAnno = this.startAnnotimeMeasure(newAnno)\n this.setState({\n annos: [...this.state.annos, newAnno],\n selectedAnnoId: newAnno.id,\n showSingleAnno: newAnno.id,\n annoToolBarVisible: false\n })\n if (this.props.selectedTool !== TOOLS.BBOX && \n this.props.selectedTool !== TOOLS.POINT){ \n const merged = this.mergeSelectedAnno(newAnno)\n this.pushHist(\n merged.newAnnos,\n newAnno.id, \n canvasActions.ANNO_CREATED_NODE,\n newAnno.id\n )\n }\n }\n }\n\n /**\n * recreate an existing annotation in case the creation process was not finished\n * @param {string} id of annotation\n */\n recreateAnnotation(annoID) {\n\n let annos = this.state.annos\n\n // search for id of selected anno in all annos (should normally be last item in list, but to be sure)\n let annoIndex\n let anno\n \n for(var k in annos) if(annos[k].id == annoID) {\n annoIndex = k\n anno = annos[k]\n break\n }\n\n // editing is only allowed on line and polygon\n if(!['line', 'polygon'].includes(anno.type)) return console.log(\"Cant recreate annotation: Type \" + anno.type + \" is forbidden\")\n\n // remove the old annotation\n this.state.annos.splice(annoIndex, 1)\n\n // create a new annotation based on the datapoints of the old annotation\n let newAnno = {\n id: anno.id,\n type: anno.type,\n data: anno.data,\n mode: modes.CREATE,\n status: (anno.status == 'database' ? annoStatus.CHANGED : annoStatus.NEW),\n labelIds: anno.labelIds,\n selectedNode: anno.data.length - 1,\n annoTime: anno.annoTime\n }\n\n newAnno = this.startAnnotimeMeasure(newAnno)\n this.setState({\n annos: [...this.state.annos, newAnno],\n selectedAnnoId: newAnno.id,\n showSingleAnno: newAnno.id,\n annoToolBarVisible: false\n })\n\n console.log(\"Annotation recreated\")\n }\n\n putSelectedOnTop(prevState){\n // The selected annotation need to be rendered as last one in \n // oder to be above all other annotations.\n if (this.state.selectedAnnoId){\n if (prevState.selectedAnnoId !== this.state.selectedAnnoId){\n const annos = this.state.annos.filter( (el) => {\n return el.id !== this.state.selectedAnnoId\n })\n const lastAnno = this.state.annos.find( el => {\n return el.id === this.state.selectedAnnoId\n })\n annos.push(lastAnno)\n this.setState({annos: [\n ...annos\n ]})\n }\n }\n }\n\n getLabel(lblId){\n return this.state.possibleLabels.find( e => {\n return e.id === lblId\n })\n }\n\n getAnnoColor(){\n if (this.state.selectedAnnoId){\n const anno = this.findAnno(this.state.selectedAnnoId)\n if (anno){\n if (anno.labelIds.length > 0){\n return this.getLabel(anno.labelIds[0]).color\n }\n } \n }\n return colorlut.getDefaultColor()\n }\n\n /**\n * Update selected anno and override mode if desired\n * \n * @param {object} anno - The new annotation the becomes the selected anno\n * @param {string} mode - The new mode for the selected anno\n * @returns The new anno that was set as selectedAnno in state and \n * the new annos list that was set in state\n */\n updateSelectedAnno(anno, mode=undefined){\n if (!anno) return\n const {newAnnos, newAnno} = this.mergeSelectedAnno(anno, mode)\n this.setState({\n annos: newAnnos,\n selectedAnnoId: anno.id,\n prevLabel: anno.labelIds, \n })\n if(this.props.onAnnoSelect){\n if (newAnno !== null){\n this.props.onAnnoSelect(newAnno)\n }\n }\n return newAnnos\n }\n\n mergeSelectedAnno(anno, mode=undefined){\n const filtered = this.state.annos.filter( (el) => {\n return el.id !== anno.id\n }) \n let newAnno\n if (mode){\n newAnno = {...anno, mode:mode}\n if (mode === modes.DELETED){\n if (anno.status !== annoStatus.NEW){\n newAnno = {\n ...newAnno,\n status: annoStatus.DELETED\n }\n } else {\n newAnno = null\n }\n } else {\n newAnno = {\n ...newAnno,\n status: anno.status !== annoStatus.NEW ? annoStatus.CHANGED : annoStatus.NEW\n }\n }\n } else {\n newAnno = {...anno}\n }\n if (newAnno !== null){\n filtered.push(newAnno)\n }\n const newAnnos = [...filtered]\n return {newAnnos, newAnno}\n }\n\n showSingleAnno(annoId){\n if (this.state.showSingleAnno !== annoId){\n this.setState({showSingleAnno: annoId})\n } \n }\n\n updateImageSize(){\n \n var container = this.props.container.current.getBoundingClientRect()\n \n // if (container.left < this.props.uiConfig.toolBarWidth){\n // canvasLeft = this.props.uiConfig.toolBarWidth + 10\n // } else {\n // canvasLeft = container.left\n // }\n // var clientWidth = document.documentElement.clientWidth\n var clientHeight = document.documentElement.clientHeight\n var canvasTop\n var canvasLeft\n var maxImgHeight\n var maxImgWidth \n if(this.props.layoutOffset){\n canvasTop = container.top + this.props.layoutOffset.top\n canvasLeft = container.left + this.props.layoutOffset.left\n maxImgHeight = clientHeight - container.top - this.props.layoutOffset.bottom - this.props.layoutOffset.top\n maxImgWidth = container.right -canvasLeft - this.props.layoutOffset.right\n } else {\n canvasTop = container.top\n canvasLeft = container.left\n maxImgHeight = clientHeight - container.top\n maxImgWidth = container.right -canvasLeft\n }\n // if (this.props.appliedFullscreen) maxImgHeight = maxImgHeight + 10 \n var ratio = this.img.current.naturalWidth / this.img.current.naturalHeight\n var imgWidth = \"100%\"\n var imgHeight = \"100%\"\n if (maxImgHeight * ratio > maxImgWidth){\n imgWidth = maxImgWidth\n imgHeight = maxImgWidth / ratio\n } else {\n imgWidth = maxImgHeight * ratio\n imgHeight = maxImgHeight\n }\n var svg \n const imgOffset = {x: 0, y:0}\n if (this.props.maxCanvas){\n imgOffset.x = (maxImgWidth - imgWidth)/2\n imgOffset.y = (maxImgHeight - imgHeight)/2\n console.log(`imgOffset: `, imgOffset)\n svg = {\n ...this.state.svg, width: maxImgWidth, height: maxImgHeight,\n left: canvasLeft, top: canvasTop\n }\n } else {\n if (this.props.centerCanvasInContainer){\n const resSpaceX = maxImgWidth - imgWidth\n if (resSpaceX > 2){\n canvasLeft = canvasLeft + resSpaceX / 2\n }\n const resSpaceY = maxImgHeight - imgHeight\n if (resSpaceY > 2){\n canvasTop = canvasTop + resSpaceY / 2\n }\n }\n svg = {\n ...this.state.svg, width : imgWidth, height: imgHeight,\n left: canvasLeft, top: canvasTop\n }\n }\n this.setState({\n svg,\n image:{\n width: this.img.current.naturalWidth,\n height: this.img.current.naturalHeight,\n },\n imageOffset: imgOffset\n })\n this.svgUpdate(svg)\n return {imgWidth, imgHeight, imgOffset}\n }\n\n svgUpdate(svg){\n if(this.props.onSVGUpdate){\n this.props.onSVGUpdate(svg)\n }\n }\n\n setImageLabels(labelIds){\n if (labelIds !== this.state.imgLabelIds){\n this.setState({\n imgLabelIds: labelIds\n })\n }\n }\n\n updateCanvasView(annotations){\n \n\n var annos = []\n //Annotation data should be present and a pixel accurate value \n //for svg should be calculated\n if(annotations){\n const imgSize = this.updateImageSize()\n this.setState({annos: [...annoConversion.backendAnnosToCanvas(annotations, {width: imgSize.imgWidth, height:imgSize.imgHeight}, imgSize.imgOffset)]})\n }\n }\n\n renderAnnotations(){\n // Do not render annotations while moving the camera!\n if (this.state.mode !== modes.CAMERA_MOVE){\n this.annoRefs = []\n const annos = this.state.annos.map((el) => {\n this.annoRefs.push(React.createRef())\n return <Annotation type={el.type} \n data={el} key={el.id} svg={{...this.state.svg}}\n ref={this.annoRefs[this.annoRefs.length - 1]}\n onMouseDown={e => this.onAnnoMouseDown(e)}\n onAction={(anno, pAction) => this.onAnnoPerformedAction(anno, pAction)}\n selectedAnno={this.state.selectedAnnoId}\n // onModeChange={(anno) => this.onAnnoModeChange(anno)}\n showSingleAnno={this.state.showSingleAnno}\n uiConfig={this.props.uiConfig}\n allowedActions={this.props.canvasConfig.annos.actions}\n possibleLabels={this.state.possibleLabels}\n image={this.state.image}\n canvasConfig={this.props.canvasConfig}\n onNotification={(messageObj) => this.handleNotification(messageObj) }\n defaultLabel={this.props.defaultLabel}\n />\n })\n return <g>{annos}</g>\n } else {\n return null\n }\n \n }\n\n renderImgLabelInput(){\n if (!this.props.annos.image) return null\n return <Prompt \n onClick={() => this.handleImgLabelInputClose()}\n active={this.props.imgLabelInputVisible}\n header={<div>\n Add label for the whole image\n </div>}\n content={<div>\n <LabelInput\n // multilabels={true}\n multilabels={this.props.canvasConfig.img.multilabels}\n // relatedId={this.props.annos.image.id}\n visible={true}\n onLabelUpdate={label => this.handleImgLabelUpdate(label)}\n possibleLabels={this.state.possibleLabels}\n initLabelIds={this.state.imgLabelIds}\n relatedId={this.props.annos.image.id}\n defaultLabel={this.props.defaultLabel}\n // disabled={!this.props.allowedActions.label}\n // renderPopup\n />\n <Button basic color=\"green\" inverted\n onClick={() => this.handleImgLabelInputClose()}\n >\n <Icon name='check'></Icon>\n OK\n </Button>\n </div>}\n />\n }\n\n renderAnnoToolBar(selectedAnno){\n let visible = this.state.annoToolBarVisible\n if (this.state.mode === modes.CAMERA_MOVE) visible = false\n return <AnnoToolBar visible={visible} \n selectedAnno={selectedAnno}\n svg={this.state.svg}\n onClick={() => this.editAnnoLabel()}\n color={this.getAnnoColor()}\n />\n }\n\n renderAnnoLabelInpput(selectedAnno){\n let visible = this.state.showLabelInput\n if (this.state.mode === modes.CAMERA_MOVE) visible = false\n return <AnnoLabelInput svg={this.state.svg} \n // svgRef={this.svg}\n onClose={() => this.onAnnoLabelInputClose()}\n onDeleteClick={annoId => this.onLabelInputDeleteClick(annoId)}\n selectedAnno={selectedAnno}\n visible={visible}\n onLabelUpdate={anno => this.onAnnoLabelInputUpdate(anno)}\n possibleLabels={this.state.possibleLabels}\n allowedActions={this.props.canvasConfig.annos.actions}\n multilabels={this.props.canvasConfig.annos.multilabels}\n mousePos={this.mousePosAbs}\n defaultLabel={this.props.defaultLabel}\n // multilabels={true}\n />\n }\n render(){\n const selectedAnno = this.findAnno(this.state.selectedAnnoId)\n return(\n <div ref={this.container} >\n <div height={this.state.svg.height} \n style={{position: 'fixed', top: this.state.svg.top, left: this.state.svg.left}}\n >\n {this.renderImgLabelInput()}\n <ImgBar container={this.container} \n visible={this.state.imgBarVisible}\n possibleLabels={this.state.possibleLabels}\n annos={this.props.annos}\n svg={this.state.svg}\n onClose={() => this.handleImgBarClose()}\n imgLabelIds={this.state.imgLabelIds}\n // onLabelUpdate={label => this.handleImgLabelUpdate(label)}\n // imgLabelIds={this.state.imgLabelIds}\n // multilabels={this.props.canvasConfig.img.multilabels}\n // allowedActions={this.props.canvasConfig.img.actions}\n onMouseEnter={e => this.handleImgBarMouseEnter(e)}\n />\n <Dimmer active={!this.state.imageLoaded||this.props.blocked}><Loader>Loading</Loader></Dimmer>\n <Dimmer active={this.state.isJunk}>\n <Header as='h2' icon inverted>\n <Icon name='ban' />\n Marked as Junk\n </Header>\n </Dimmer>\n {this.renderAnnoToolBar(selectedAnno)}\n {/* <div style={{position: 'fixed', top: this.props.container.top, left: this.props.container.left}}> */}\n {this.renderAnnoLabelInpput(selectedAnno)}\n <svg ref={this.svg} width={this.state.svg.width} \n height={this.state.svg.height}\n onKeyDown={e => this.onKeyDown(e)}\n onKeyUp={e => this.onKeyUp(e)}\n onClick={e => this.handleCanvasClick(e)}\n onMouseMove={e => this.handleSvgMouseMove(e)}\n tabIndex=\"0\"\n >\n <g \n transform={`scale(${this.state.svg.scale}) translate(${this.state.svg.translateX}, ${this.state.svg.translateY})`}\n onMouseOver={() => {this.onMouseOver()}}\n onMouseUp={(e) => {this.onMouseUp(e)}}\n onWheel={(e) => this.onWheel(e)}\n onMouseMove={(e) => {this.onMouseMove(e)}}\n >\n <image\n onContextMenu={(e) => this.onRightClick(e)}\n onMouseDown={(e) => this.onMouseDown(e)}\n href={this.props.image.data} \n width={this.state.svg.width} \n height={this.state.svg.height}\n />\n {this.renderAnnotations()}\n </g>\n </svg>\n <img \n alt='sia' style={{display:'none'}} ref={this.img} \n onLoad={() => {this.onImageLoad()}} src={this.state.imageData}\n width=\"100%\" height=\"100%\"\n />\n {/* </div> */}\n </div>\n {/* Placeholder for Layout*/}\n <div style={{minHeight: this.state.svg.height}}></div> \n </div>)\n }\n}\n\nexport default Canvas"],"names":["toSia","data","image","type","imgOffset","w","width","h","height","x0","x","y0","y","map","e","toBackend","svg","imgWidth","imgHeight","xList","yList","minX","Math","min","maxX","max","minY","maxY","warn","getArea","scaledImg","originalImg","relData","abs","undefined","area","length","j","i","move","movementX","movementY","getMostLeftPoint","Infinity","minXList","forEach","el","push","getTopPoint","minYList","correctAnnotation","corrected","VIEW","EDIT","CREATE","MOVE","ADD","CAMERA_MOVE","EDIT_LABEL","DELETED","defaultFontSize","defaultRectHeight","AnnoBar","props","state","textRef","React","createRef","mode","modes","setPosition","preventDefault","onClick","topPoint","transform","anno","current","text","getBoundingClientRect","textPadding","rectWidth","scale","setState","ceil","top","left","label","possibleLabels","labelObject","labelIds","lbl","idx","find","id","defaultLabel","Number","isInteger","style","handleClick","fontSize","Component","InfSelectionArea","enable","enableSelArea","disableSelArea","onMouseMove","onMouseUp","selAreaCss","CREATE_NODE","EDIT_NODE","NORMAL_NODE","Node","getCursorStyle","prevProps","isPoint","turnSelAreaOn","turnHaloOn","button","turnSelAreaOff","stopPropagation","onMouseDown","isSelected","turnHaloOff","onDoubleClick","onMouseLeave","cursorstyles","haloCss","r","onContextMenu","handleMouseLeave","renderHalo","className","onMouseOver","renderNodes","ANNO_DELETED","ANNO_SELECTED","ANNO_CREATED","ANNO_MOVED","ANNO_ENTER_MOVE_MODE","ANNO_EDITED","ANNO_ENTER_EDIT_MODE","ANNO_ADDED_NODE","ANNO_REMOVED_NODE","ANNO_LABEL_UPDATE","ANNO_CREATED_NODE","ANNO_CREATED_FINAL_NODE","ANNO_START_CREATING","IMG_LABEL_UPDATE","Point","newAnno","requestModeChange","performedAction","canvasActions","pAction","onAction","onModeChangeRequest","selectedNode","onNodeMouseDown","renderPoint","renderNode","renderInfSelectionArea","getMousePosition","absPos","getMousePositionAbs","translateX","translateY","pageX","pageY","BBox","mousePos","mouse","idxMinus","idxPlus","newAnnoData","join","toPolygonStr","onNodeMouseUp","onNodeMouseMove","handleNodeMouseLeave","renderPolygon","Edge","p1","p2","closingEdge","strokeWidth","Polygon","updateAnnoByMousePos","addNode","mPos","slice","oldRest","concat","onNodeDoubleClick","edges","onEdgeMouseDown","renderEdges","Line","fill","renderPolyline","NEW","DATABASE","CHANGED","colors20","colors","nColors","getColor","n","getDefaultColor","allowedToLabel","allowedActions","allowedToEdit","status","annoStatus","edit","INFO","SUCCESS","WARNING","Annotation","myAnno","showSingleAnno","setVisible","setMode","messageObj","onNotification","canvasConfig","annos","minArea","notify","round","notificationType","constraints","setAnnoMode","visible","visibility","selectedAnno","lblId","getLabel","color","colorlut","uiConfig","nodeRadius","getStyle","getCssClass","handleModeChangeRequest","performedAnnoAction","onNodeClick","error","annoType","renderAnnoBar","renderAnno","LabelInput","inputRef","updatePossibleLabels","initLabelIds","performInit","prevState","focusOnRender","click","confirmLabel","annoLabelUpdate","closeLabelInput","relatedId","performKeyAction","key","item","multilabels","value","event","onItemClick","unshift","onLabelUpdate","filter","val","onClose","onKeyDown","onChange","opacity","disabled","open","__html","description","renderLabelInfo","renderPopup","renderLabelInput","renderPopupContent","AnnoLabelInput","inputGroupRef","position","updateAnnoLabel","ImgBar","onMouseEnter","imgLabelIds","handleMouseEnter","justifyContent","alignItems","renderImgDescription","number","amount","renderImgLabels","Prompt","active","zIndex","header","content","AnnoToolBar","inputRect","renderDaviIcon","_fixBackendAnnoElement","element","_","uniqueId","annoTime","fixBackendAnnos","backendAnnos","bBoxes","lines","polygons","points","log","backendAnnosToCanvas","imgSize","canvasToBackendAnnos","forBackendPost","myAnnos","bAnnos","annoId","backendFormat","DELETE_ANNO","ENTER_ANNO_ADD_MODE","LEAVE_ANNO_ADD_MODE","UNDO","REDO","TRAVERSE_ANNOS","CAM_MOVE_UP","CAM_MOVE_DOWN","CAM_MOVE_LEFT","CAM_MOVE_RIGHT","CAM_MOVE_STOP","COPY_ANNOTATION","PASTE_ANNOTATION","RECREATE_ANNO","DELETE_ANNO_IN_CREATION","KeyMapper","keyActionHandler","controlDown","triggerKeyAction","keyAction","POINT","BBOX","UndoRedo","maxElements","hist","pointer","entry","histEl","shift","pop","getViewportCoordinates","window","viewport","scaleX","xMax","xMin","scaleY","yMax","yMin","vX","vY","getZoomTranslation","w0","s1","s0","translation","Canvas","img","container","keyMapper","handleKeyAction","mousePosAbs","clipboard","prevLabel","performance","now","imageData","updateCanvasView","annoConversion","annotations","isJunk","performedImageInit","imgBarVisible","clearHist","getAnnos","imageLoaded","putSelectedOnTop","imgLoadCount","setImageLabels","layoutUpdate","selectAnnotation","imageOffset","onImageLoaded","focus","up","deltaY","zoomFactor","nextScale","newTranslation","wv","createNewAnnotation","showLabelInput","findAnno","selectedAnnoId","updateSelectedAnno","action","camKeyStepSize","keyActions","ar","findAnnoRef","getResult","editAnnoLabel","deleteAnnotation","deleteAnnoInCreationMode","undo","redo","traverseAnnos","moveCamera","copyAnnotation","pasteAnnotation","recreateAnnotation","keyDown","keyUp","onKeyUp","removeSelectedAnno","newAnnos","pushHist","stopAnnotimeMeasure","annoToolBarVisible","startAnnotimeMeasure","checkAnnoLength","onAnnoPerformedAction","onImgBarClose","onImgLabelInputClose","handleNotification","offset","uid","timestamp","lbls","annoRefs","isEmpty","cState","setCanvasState","removeLastNode","lockedAnnos","includes","isLocked","onAnnoLabelInputClose","onAnnoSelect","currentIdx","findIndex","removeFrontedIds","finalData","imgLabelChanged","imgLoadTimestamp","trans_x","trans_y","vXMin","vXMax","yXMin","yXMax","vLeft","vRight","allowed","selectedTool","maxAnnos","TOOLS","merged","mergeSelectedAnno","annoID","annoIndex","k","console","splice","lastAnno","filtered","clientHeight","document","documentElement","canvasTop","canvasLeft","maxImgHeight","maxImgWidth","layoutOffset","bottom","right","ratio","naturalWidth","naturalHeight","maxCanvas","centerCanvasInContainer","resSpaceX","resSpaceY","svgUpdate","onSVGUpdate","updateImageSize","onAnnoMouseDown","actions","handleImgLabelInputClose","imgLabelInputVisible","handleImgLabelUpdate","getAnnoColor","onLabelInputDeleteClick","onAnnoLabelInputUpdate","renderImgLabelInput","handleImgBarClose","handleImgBarMouseEnter","blocked","renderAnnoToolBar","renderAnnoLabelInpput","handleCanvasClick","handleSvgMouseMove","onWheel","onRightClick","renderAnnotations","display","onImageLoad","minHeight"],"mappings":"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"}
|