lost-sia
Version:
Single Image Annotation Tool
154 lines (143 loc) • 5.61 kB
JSX
import React, { Component } from "react";
import * as transform from "./utils/transform";
class AnnoToolBar extends Component {
constructor(props) {
super(props);
this.state = {
top: 400,
left: 100,
width: 50,
label: undefined,
visibility: "hidden",
possibleLabels: [],
};
this.inputGroupRef = React.createRef();
}
componentWillMount() {
this.setPosition();
}
componentDidUpdate(prevProps) {
if (this.props.visible) {
this.setPosition();
}
}
/*************
* LOGIC *
*************/
setPosition() {
if (this.props.selectedAnno) {
// const center = transform.getCenter(this.props.selectedAnno.data, this.props.selectedAnno.type)
// const annoBox = transform.getBox(this.props.selectedAnno.data, this.props.selectedAnno.type)
let topPoint = transform.getTopPoint(this.props.selectedAnno.data);
topPoint = transform.getMostLeftPoint(topPoint)[0];
const inputRect = this.inputGroupRef.current.getBoundingClientRect();
let top =
this.props.svg.top +
(topPoint.y + this.props.svg.translateY) * this.props.svg.scale -
44;
let left =
this.props.svg.left +
(topPoint.x + this.props.svg.translateX) * this.props.svg.scale -
inputRect.width / 2.0 -
1;
// if (left < this.props.svg.left) left = this.props.svg.left
// if (left+inputRect.width > this.props.svg.left+this.props.svg.width){
// left = this.props.svg.left+this.props.svg.width - inputRect.width
// }
if (top < 0)
top =
this.props.svg.top +
(topPoint.y + this.props.svg.translateY + 10) * this.props.svg.scale;
if (this.state.top !== top || this.state.left !== left) {
this.setState({
top,
left,
// width: annoBox[1].x - annoBox[0].x
});
}
}
}
onClose() {
if (this.props.onClose) {
this.props.onClose();
}
}
handleClick(e) {
if (this.props.onClick) {
this.props.onClick(e);
}
}
renderDaviIcon() {
return (
<svg
version="1.1"
xmlns="http://www.w3.org/2000/svg"
// x="0px" y="0px"
// width="1190.549px" height="841.891px"
viewBox="0 0 1190.549 841.891"
width="60px"
onClick={(e) => this.handleClick(e)}
>
<g id="Info">
<path
id="Maps"
fill={this.props.color}
d="M620.561,817.217c-1.568-3.62-3.771-7.101-4.611-10.885
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
C324.363,242.85,402.696,58.71,574.209,26.508c145.509-27.32,282.953,75.871,296.543,222.773
c4.659,50.356-7.471,97.96-32.152,141.022c-27.812,48.526-58.75,95.364-90.073,141.758
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
C623.021,817.277,621.789,817.247,620.561,817.217z"
/>
<path
id="Text"
fillRule="evenodd"
clipRule="evenodd"
fill="#FFFFFF"
d="M724.709,250.898
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
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
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
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
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
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
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
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
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
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
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
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
c-0.074,8.051-6.938,12.819-13.703,12.847C731.482,263.519,724.956,259.059,724.709,250.898z"
/>
</g>
</svg>
);
}
/*************
* RENDERING *
**************/
render() {
if (!this.props.visible) return null;
return (
<div
ref={this.inputGroupRef}
style={{
position: "fixed",
top: this.state.top,
left: this.state.left,
cursor: "pointer",
}}
>
{/* <Button icon circular basic
onClick={e => this.handleClick(e)}
> */}
{/* <Icon name="pencil"
onClick={e => this.handleClick(e)}
/> */}
{/* </Button> */}
{this.renderDaviIcon()}
</div>
);
}
}
export default AnnoToolBar;