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.

163 lines
5.5 KiB
TypeScript

// Copyright (C) 2021 Intel Corporation
//
// SPDX-License-Identifier: MIT
import React from 'react';
import ObjectButtonsContainer from 'containers/annotation-page/standard-workspace/objects-side-bar/object-buttons';
import { ObjectType, ShapeType, ColorBy } from 'reducers/interfaces';
import ItemDetails, { attrValuesAreEqual } from './object-item-details';
import ItemBasics from './object-item-basics';
interface Props {
normalizedKeyMap: Record<string, string>;
readonly: boolean;
activated: boolean;
objectType: ObjectType;
shapeType: ShapeType;
clientID: number;
serverID: number | undefined;
labelID: number;
locked: boolean;
attrValues: Record<number, string>;
color: string;
colorBy: ColorBy;
labels: any[];
attributes: any[];
collapsed: boolean;
jobInstance: any;
activate(): void;
copy(): void;
propagate(): void;
createURL(): void;
switchOrientation(): void;
toBackground(): void;
toForeground(): void;
remove(): void;
changeLabel(label: any): void;
changeAttribute(attrID: number, value: string): void;
changeColor(color: string): void;
collapse(): void;
resetCuboidPerspective(): void;
}
function objectItemsAreEqual(prevProps: Props, nextProps: Props): boolean {
return (
nextProps.activated === prevProps.activated &&
nextProps.readonly === prevProps.readonly &&
nextProps.locked === prevProps.locked &&
nextProps.labelID === prevProps.labelID &&
nextProps.color === prevProps.color &&
nextProps.clientID === prevProps.clientID &&
nextProps.serverID === prevProps.serverID &&
nextProps.objectType === prevProps.objectType &&
nextProps.shapeType === prevProps.shapeType &&
nextProps.collapsed === prevProps.collapsed &&
nextProps.labels === prevProps.labels &&
nextProps.attributes === prevProps.attributes &&
nextProps.normalizedKeyMap === prevProps.normalizedKeyMap &&
nextProps.colorBy === prevProps.colorBy &&
attrValuesAreEqual(nextProps.attrValues, prevProps.attrValues)
);
}
function ObjectItemComponent(props: Props): JSX.Element {
const {
activated,
readonly,
objectType,
shapeType,
clientID,
serverID,
locked,
attrValues,
labelID,
color,
colorBy,
attributes,
labels,
collapsed,
normalizedKeyMap,
activate,
copy,
propagate,
createURL,
switchOrientation,
toBackground,
toForeground,
remove,
changeLabel,
changeAttribute,
changeColor,
collapse,
resetCuboidPerspective,
jobInstance,
} = props;
const type =
objectType === ObjectType.TAG ?
ObjectType.TAG.toUpperCase() :
`${shapeType.toUpperCase()} ${objectType.toUpperCase()}`;
const className = !activated ?
'cvat-objects-sidebar-state-item' :
'cvat-objects-sidebar-state-item cvat-objects-sidebar-state-active-item';
return (
<div style={{ display: 'flex', marginBottom: '1px' }}>
<div className='cvat-objects-sidebar-state-item-color' style={{ background: `${color}` }} />
<div
onMouseEnter={activate}
id={`cvat-objects-sidebar-state-item-${clientID}`}
className={className}
style={{ backgroundColor: `${color}88` }}
>
<ItemBasics
jobInstance={jobInstance}
readonly={readonly}
serverID={serverID}
clientID={clientID}
labelID={labelID}
labels={labels}
shapeType={shapeType}
objectType={objectType}
color={color}
colorBy={colorBy}
type={type}
locked={locked}
copyShortcut={normalizedKeyMap.COPY_SHAPE}
pasteShortcut={normalizedKeyMap.PASTE_SHAPE}
propagateShortcut={normalizedKeyMap.PROPAGATE_OBJECT}
toBackgroundShortcut={normalizedKeyMap.TO_BACKGROUND}
toForegroundShortcut={normalizedKeyMap.TO_FOREGROUND}
removeShortcut={normalizedKeyMap.DELETE_OBJECT}
changeColorShortcut={normalizedKeyMap.CHANGE_OBJECT_COLOR}
changeLabel={changeLabel}
changeColor={changeColor}
copy={copy}
remove={remove}
propagate={propagate}
createURL={createURL}
switchOrientation={switchOrientation}
toBackground={toBackground}
toForeground={toForeground}
resetCuboidPerspective={resetCuboidPerspective}
/>
<ObjectButtonsContainer readonly={readonly} clientID={clientID} />
{!!attributes.length && (
<ItemDetails
readonly={readonly}
collapsed={collapsed}
attributes={attributes}
values={attrValues}
collapse={collapse}
changeAttribute={changeAttribute}
/>
)}
</div>
</div>
);
}
export default React.memo(ObjectItemComponent, objectItemsAreEqual);