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.
255 lines
8.1 KiB
TypeScript
255 lines
8.1 KiB
TypeScript
// Copyright (C) 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
|
|
import { RadioChangeEvent } from 'antd/lib/radio';
|
|
import { SliderValue } from 'antd/lib/slider';
|
|
import { CheckboxChangeEvent } from 'antd/lib/checkbox';
|
|
|
|
import ObjectsSidebarComponent from 'components/annotation-page/standard-workspace/objects-side-bar/objects-side-bar';
|
|
import {
|
|
CombinedState,
|
|
ColorBy,
|
|
} from 'reducers/interfaces';
|
|
|
|
import {
|
|
collapseSidebar as collapseSidebarAction,
|
|
collapseAppearance as collapseAppearanceAction,
|
|
updateTabContentHeight as updateTabContentHeightAction,
|
|
} from 'actions/annotation-actions';
|
|
|
|
import {
|
|
changeShapesColorBy as changeShapesColorByAction,
|
|
changeShapesOpacity as changeShapesOpacityAction,
|
|
changeSelectedShapesOpacity as changeSelectedShapesOpacityAction,
|
|
changeShapesBlackBorders as changeShapesBlackBordersAction,
|
|
changeShowBitmap as changeShowUnlabeledRegionsAction,
|
|
changeShowProjections as changeShowProjectionsAction,
|
|
} from 'actions/settings-actions';
|
|
|
|
import { Canvas } from 'cvat-canvas-wrapper';
|
|
|
|
interface StateToProps {
|
|
sidebarCollapsed: boolean;
|
|
appearanceCollapsed: boolean;
|
|
colorBy: ColorBy;
|
|
opacity: number;
|
|
selectedOpacity: number;
|
|
blackBorders: boolean;
|
|
showBitmap: boolean;
|
|
showProjections: boolean;
|
|
canvasInstance: Canvas;
|
|
}
|
|
|
|
interface DispatchToProps {
|
|
collapseSidebar(): void;
|
|
collapseAppearance(): void;
|
|
updateTabContentHeight(): void;
|
|
changeShapesColorBy(colorBy: ColorBy): void;
|
|
changeShapesOpacity(shapesOpacity: number): void;
|
|
changeSelectedShapesOpacity(selectedShapesOpacity: number): void;
|
|
changeShapesBlackBorders(blackBorders: boolean): void;
|
|
changeShowBitmap(showBitmap: boolean): void;
|
|
changeShowProjections(showProjections: boolean): void;
|
|
}
|
|
|
|
function mapStateToProps(state: CombinedState): StateToProps {
|
|
const {
|
|
annotation: {
|
|
sidebarCollapsed,
|
|
appearanceCollapsed,
|
|
canvas: {
|
|
instance: canvasInstance,
|
|
},
|
|
},
|
|
settings: {
|
|
shapes: {
|
|
colorBy,
|
|
opacity,
|
|
selectedOpacity,
|
|
blackBorders,
|
|
showBitmap,
|
|
showProjections,
|
|
},
|
|
},
|
|
} = state;
|
|
|
|
return {
|
|
sidebarCollapsed,
|
|
appearanceCollapsed,
|
|
colorBy,
|
|
opacity,
|
|
selectedOpacity,
|
|
blackBorders,
|
|
showBitmap,
|
|
showProjections,
|
|
canvasInstance,
|
|
};
|
|
}
|
|
|
|
function computeHeight(): number {
|
|
const [sidebar] = window.document.getElementsByClassName('cvat-objects-sidebar');
|
|
const [appearance] = window.document.getElementsByClassName('cvat-objects-appearance-collapse');
|
|
const [tabs] = Array.from(
|
|
window.document.querySelectorAll('.cvat-objects-sidebar-tabs > .ant-tabs-card-bar'),
|
|
);
|
|
|
|
if (sidebar && appearance && tabs) {
|
|
const maxHeight = sidebar ? sidebar.clientHeight : 0;
|
|
const appearanceHeight = appearance ? appearance.clientHeight : 0;
|
|
const tabsHeight = tabs ? tabs.clientHeight : 0;
|
|
return maxHeight - appearanceHeight - tabsHeight;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function mapDispatchToProps(dispatch: any): DispatchToProps {
|
|
return {
|
|
collapseSidebar(): void {
|
|
dispatch(collapseSidebarAction());
|
|
},
|
|
collapseAppearance(): void {
|
|
dispatch(collapseAppearanceAction());
|
|
|
|
const [collapser] = window.document
|
|
.getElementsByClassName('cvat-objects-appearance-collapse');
|
|
|
|
if (collapser) {
|
|
collapser.addEventListener('transitionend', () => {
|
|
dispatch(
|
|
updateTabContentHeightAction(
|
|
computeHeight(),
|
|
),
|
|
);
|
|
}, { once: true });
|
|
}
|
|
},
|
|
updateTabContentHeight(): void {
|
|
dispatch(
|
|
updateTabContentHeightAction(
|
|
computeHeight(),
|
|
),
|
|
);
|
|
},
|
|
changeShapesColorBy(colorBy: ColorBy): void {
|
|
dispatch(changeShapesColorByAction(colorBy));
|
|
},
|
|
changeShapesOpacity(shapesOpacity: number): void {
|
|
dispatch(changeShapesOpacityAction(shapesOpacity));
|
|
},
|
|
changeSelectedShapesOpacity(selectedShapesOpacity: number): void {
|
|
dispatch(changeSelectedShapesOpacityAction(selectedShapesOpacity));
|
|
},
|
|
changeShapesBlackBorders(blackBorders: boolean): void {
|
|
dispatch(changeShapesBlackBordersAction(blackBorders));
|
|
},
|
|
changeShowBitmap(showBitmap: boolean) {
|
|
dispatch(changeShowUnlabeledRegionsAction(showBitmap));
|
|
},
|
|
changeShowProjections(showProjections: boolean) {
|
|
dispatch(changeShowProjectionsAction(showProjections));
|
|
},
|
|
};
|
|
}
|
|
|
|
type Props = StateToProps & DispatchToProps;
|
|
class ObjectsSideBarContainer extends React.PureComponent<Props> {
|
|
public componentDidMount(): void {
|
|
window.addEventListener('resize', this.alignTabHeight);
|
|
this.alignTabHeight();
|
|
}
|
|
|
|
public componentWillUnmount(): void {
|
|
window.removeEventListener('resize', this.alignTabHeight);
|
|
}
|
|
|
|
private alignTabHeight = (): void => {
|
|
const {
|
|
sidebarCollapsed,
|
|
updateTabContentHeight,
|
|
} = this.props;
|
|
|
|
if (!sidebarCollapsed) {
|
|
updateTabContentHeight();
|
|
}
|
|
};
|
|
|
|
private changeShapesColorBy = (event: RadioChangeEvent): void => {
|
|
const { changeShapesColorBy } = this.props;
|
|
changeShapesColorBy(event.target.value);
|
|
};
|
|
|
|
private changeShapesOpacity = (value: SliderValue): void => {
|
|
const { changeShapesOpacity } = this.props;
|
|
changeShapesOpacity(value as number);
|
|
};
|
|
|
|
private changeSelectedShapesOpacity = (value: SliderValue): void => {
|
|
const { changeSelectedShapesOpacity } = this.props;
|
|
changeSelectedShapesOpacity(value as number);
|
|
};
|
|
|
|
private changeShapesBlackBorders = (event: CheckboxChangeEvent): void => {
|
|
const { changeShapesBlackBorders } = this.props;
|
|
changeShapesBlackBorders(event.target.checked);
|
|
};
|
|
|
|
private changeShowBitmap = (event: CheckboxChangeEvent): void => {
|
|
const { changeShowBitmap } = this.props;
|
|
changeShowBitmap(event.target.checked);
|
|
};
|
|
|
|
private changeShowProjections = (event: CheckboxChangeEvent): void => {
|
|
const { changeShowProjections } = this.props;
|
|
changeShowProjections(event.target.checked);
|
|
};
|
|
|
|
public render(): JSX.Element {
|
|
const {
|
|
sidebarCollapsed,
|
|
appearanceCollapsed,
|
|
colorBy,
|
|
opacity,
|
|
selectedOpacity,
|
|
blackBorders,
|
|
showBitmap,
|
|
showProjections,
|
|
canvasInstance,
|
|
collapseSidebar,
|
|
collapseAppearance,
|
|
} = this.props;
|
|
|
|
return (
|
|
<ObjectsSidebarComponent
|
|
sidebarCollapsed={sidebarCollapsed}
|
|
appearanceCollapsed={appearanceCollapsed}
|
|
colorBy={colorBy}
|
|
opacity={opacity}
|
|
selectedOpacity={selectedOpacity}
|
|
blackBorders={blackBorders}
|
|
showBitmap={showBitmap}
|
|
showProjections={showProjections}
|
|
canvasInstance={canvasInstance}
|
|
collapseSidebar={collapseSidebar}
|
|
collapseAppearance={collapseAppearance}
|
|
changeShapesColorBy={this.changeShapesColorBy}
|
|
changeShapesOpacity={this.changeShapesOpacity}
|
|
changeSelectedShapesOpacity={this.changeSelectedShapesOpacity}
|
|
changeShapesBlackBorders={this.changeShapesBlackBorders}
|
|
changeShowBitmap={this.changeShowBitmap}
|
|
changeShowProjections={this.changeShowProjections}
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default connect(
|
|
mapStateToProps,
|
|
mapDispatchToProps,
|
|
)(ObjectsSideBarContainer);
|