You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.8 KiB
TypeScript
140 lines
3.8 KiB
TypeScript
import React from 'react';
|
|
|
|
import {
|
|
Layout,
|
|
} from 'antd';
|
|
|
|
import {
|
|
GridColor,
|
|
} from '../../../reducers/interfaces';
|
|
|
|
import { Canvas } from '../../../canvas';
|
|
|
|
interface Props {
|
|
canvasInstance: Canvas;
|
|
jobInstance: any;
|
|
annotations: any[];
|
|
frameData: any;
|
|
grid: boolean;
|
|
gridSize: number;
|
|
gridColor: GridColor;
|
|
gridOpacity: number;
|
|
onSetupCanvas: () => void;
|
|
}
|
|
|
|
export default class CanvasWrapperComponent extends React.PureComponent<Props> {
|
|
public componentDidMount(): void {
|
|
const {
|
|
canvasInstance,
|
|
} = this.props;
|
|
|
|
// It's awful approach from the point of view React
|
|
// But we do not have another way because cvat-canvas returns regular DOM element
|
|
const [wrapper] = window.document
|
|
.getElementsByClassName('cvat-annotation-page-canvas-container');
|
|
wrapper.appendChild(canvasInstance.html());
|
|
|
|
this.initialSetup();
|
|
this.updateCanvas();
|
|
}
|
|
|
|
public componentDidUpdate(prevProps: Props): void {
|
|
const {
|
|
grid,
|
|
gridSize,
|
|
gridColor,
|
|
gridOpacity,
|
|
canvasInstance,
|
|
} = this.props;
|
|
|
|
if (prevProps.grid !== grid) {
|
|
const gridElement = window.document.getElementById('cvat_canvas_grid');
|
|
if (gridElement) {
|
|
gridElement.style.display = grid ? 'block' : 'none';
|
|
}
|
|
}
|
|
|
|
if (prevProps.gridSize !== gridSize) {
|
|
canvasInstance.grid(gridSize, gridSize);
|
|
}
|
|
|
|
if (prevProps.gridColor !== gridColor) {
|
|
const gridPattern = window.document.getElementById('cvat_canvas_grid_pattern');
|
|
if (gridPattern) {
|
|
gridPattern.style.stroke = gridColor.toLowerCase();
|
|
}
|
|
}
|
|
|
|
if (prevProps.gridOpacity !== gridOpacity) {
|
|
const gridPattern = window.document.getElementById('cvat_canvas_grid_pattern');
|
|
if (gridPattern) {
|
|
gridPattern.style.opacity = `${gridOpacity / 100}`;
|
|
}
|
|
}
|
|
|
|
this.updateCanvas();
|
|
}
|
|
|
|
private initialSetup(): void {
|
|
const {
|
|
grid,
|
|
gridSize,
|
|
gridColor,
|
|
gridOpacity,
|
|
canvasInstance,
|
|
jobInstance,
|
|
onSetupCanvas,
|
|
} = this.props;
|
|
|
|
// Size
|
|
canvasInstance.fitCanvas();
|
|
|
|
// Grid
|
|
const gridElement = window.document.getElementById('cvat_canvas_grid');
|
|
const gridPattern = window.document.getElementById('cvat_canvas_grid_pattern');
|
|
if (gridElement) {
|
|
gridElement.style.display = grid ? 'block' : 'none';
|
|
}
|
|
if (gridPattern) {
|
|
gridPattern.style.stroke = gridColor.toLowerCase();
|
|
gridPattern.style.opacity = `${gridOpacity / 100}`;
|
|
}
|
|
canvasInstance.grid(gridSize, gridSize);
|
|
|
|
// Events
|
|
canvasInstance.html().addEventListener('canvas.setup', (): void => {
|
|
onSetupCanvas();
|
|
if (jobInstance.task.mode === 'annotation') {
|
|
canvasInstance.fit();
|
|
}
|
|
});
|
|
|
|
canvasInstance.html().addEventListener('canvas.setup', () => {
|
|
canvasInstance.fit();
|
|
}, { once: true });
|
|
}
|
|
|
|
private updateCanvas(): void {
|
|
const {
|
|
annotations,
|
|
frameData,
|
|
canvasInstance,
|
|
} = this.props;
|
|
|
|
if (frameData !== null) {
|
|
canvasInstance.setup(frameData, annotations);
|
|
}
|
|
}
|
|
|
|
public render(): JSX.Element {
|
|
return (
|
|
// This element doesn't have any props
|
|
// So, React isn't going to rerender it
|
|
// And it's a reason why cvat-canvas appended in mount function works
|
|
<Layout.Content
|
|
className='cvat-annotation-page-canvas-container'
|
|
/>
|
|
);
|
|
}
|
|
}
|