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.
175 lines
4.5 KiB
TypeScript
175 lines
4.5 KiB
TypeScript
// Copyright (C) 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
|
|
import { updateAnnotationsAsync } from 'actions/annotation-actions';
|
|
|
|
import LabelItemComponent from 'components/annotation-page/standard-workspace/objects-side-bar/label-item';
|
|
import { CombinedState, ObjectType } from 'reducers/interfaces';
|
|
|
|
interface OwnProps {
|
|
labelID: number;
|
|
}
|
|
|
|
interface StateToProps {
|
|
label: any;
|
|
labelName: string;
|
|
labelColor: string;
|
|
objectStates: any[];
|
|
jobInstance: any;
|
|
frameNumber: any;
|
|
}
|
|
|
|
interface DispatchToProps {
|
|
updateAnnotations(states: any[]): void;
|
|
}
|
|
|
|
function mapStateToProps(state: CombinedState, own: OwnProps): StateToProps {
|
|
const {
|
|
annotation: {
|
|
annotations: { states: objectStates },
|
|
job: { labels, instance: jobInstance },
|
|
player: {
|
|
frame: { number: frameNumber },
|
|
},
|
|
},
|
|
} = state;
|
|
|
|
const [label] = labels.filter((_label: any) => _label.id === own.labelID);
|
|
|
|
return {
|
|
label,
|
|
labelColor: label.color,
|
|
labelName: label.name,
|
|
objectStates,
|
|
jobInstance,
|
|
frameNumber,
|
|
};
|
|
}
|
|
|
|
function mapDispatchToProps(dispatch: any): DispatchToProps {
|
|
return {
|
|
updateAnnotations(states: any[]): void {
|
|
dispatch(updateAnnotationsAsync(states));
|
|
},
|
|
};
|
|
}
|
|
|
|
type Props = StateToProps & DispatchToProps & OwnProps;
|
|
interface State {
|
|
objectStates: any[];
|
|
ownObjectStates: any[];
|
|
visible: boolean;
|
|
statesHidden: boolean;
|
|
statesLocked: boolean;
|
|
}
|
|
|
|
class LabelItemContainer extends React.PureComponent<Props, State> {
|
|
public constructor(props: Props) {
|
|
super(props);
|
|
this.state = {
|
|
objectStates: [],
|
|
ownObjectStates: [],
|
|
visible: true,
|
|
statesHidden: false,
|
|
statesLocked: false,
|
|
};
|
|
}
|
|
|
|
static getDerivedStateFromProps(props: Props, state: State): State | null {
|
|
if (props.objectStates === state.objectStates) {
|
|
return null;
|
|
}
|
|
|
|
const ownObjectStates = props.objectStates.filter(
|
|
(ownObjectState: any): boolean => ownObjectState.label.id === props.labelID,
|
|
);
|
|
const visible = !!ownObjectStates.length;
|
|
let statesHidden = true;
|
|
let statesLocked = true;
|
|
|
|
ownObjectStates.forEach((objectState: any) => {
|
|
const { lock, objectType } = objectState;
|
|
if (!lock && objectType !== ObjectType.TAG) {
|
|
statesHidden = statesHidden && objectState.hidden;
|
|
statesLocked = statesLocked && objectState.lock;
|
|
}
|
|
});
|
|
|
|
return {
|
|
...state,
|
|
objectStates: props.objectStates,
|
|
ownObjectStates,
|
|
statesHidden,
|
|
statesLocked,
|
|
visible,
|
|
};
|
|
}
|
|
|
|
private hideStates = (): void => {
|
|
this.switchHidden(true);
|
|
};
|
|
|
|
private showStates = (): void => {
|
|
this.switchHidden(false);
|
|
};
|
|
|
|
private lockStates = (): void => {
|
|
this.switchLock(true);
|
|
};
|
|
|
|
private unlockStates = (): void => {
|
|
this.switchLock(false);
|
|
};
|
|
|
|
private switchHidden(value: boolean): void {
|
|
const { updateAnnotations } = this.props;
|
|
|
|
const { ownObjectStates } = this.state;
|
|
for (const state of ownObjectStates) {
|
|
state.hidden = value;
|
|
}
|
|
|
|
updateAnnotations(ownObjectStates);
|
|
}
|
|
|
|
private switchLock(value: boolean): void {
|
|
const { updateAnnotations } = this.props;
|
|
|
|
const { ownObjectStates } = this.state;
|
|
for (const state of ownObjectStates) {
|
|
state.lock = value;
|
|
}
|
|
|
|
updateAnnotations(ownObjectStates);
|
|
}
|
|
|
|
public render(): JSX.Element {
|
|
const { visible, statesHidden, statesLocked } = this.state;
|
|
|
|
const { labelName, labelColor } = this.props;
|
|
|
|
return (
|
|
<LabelItemComponent
|
|
labelName={labelName}
|
|
labelColor={labelColor}
|
|
visible={visible}
|
|
statesHidden={statesHidden}
|
|
statesLocked={statesLocked}
|
|
hideStates={this.hideStates}
|
|
showStates={this.showStates}
|
|
lockStates={this.lockStates}
|
|
unlockStates={this.unlockStates}
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default connect<StateToProps, DispatchToProps, OwnProps, CombinedState>(
|
|
mapStateToProps,
|
|
mapDispatchToProps,
|
|
)(LabelItemContainer);
|