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.

245 lines
7.8 KiB
TypeScript

// Copyright (C) 2020 Intel Corporation
//
// SPDX-License-Identifier: MIT
import React from 'react';
import Icon from 'antd/lib/icon';
import Menu from 'antd/lib/menu';
import Button from 'antd/lib/button';
import Modal from 'antd/lib/modal';
import Tooltip from 'antd/lib/tooltip';
import {
BackgroundIcon, ForegroundIcon, ResetPerspectiveIcon, ColorizeIcon,
} from 'icons';
import { ObjectType, ShapeType, ColorBy } from 'reducers/interfaces';
import ColorPicker from './color-picker';
interface Props {
readonly: boolean;
serverID: number | undefined;
locked: boolean;
shapeType: ShapeType;
objectType: ObjectType;
color: string;
colorBy: ColorBy;
colorPickerVisible: boolean;
changeColorShortcut: string;
copyShortcut: string;
pasteShortcut: string;
propagateShortcut: string;
toBackgroundShortcut: string;
toForegroundShortcut: string;
removeShortcut: string;
changeColor(value: string): void;
copy(): void;
remove(): void;
propagate(): void;
createURL(): void;
switchOrientation(): void;
toBackground(): void;
toForeground(): void;
resetCuboidPerspective(): void;
changeColorPickerVisible(visible: boolean): void;
activateTracking(): void;
}
interface ItemProps {
toolProps: Props;
}
function CreateURLItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { serverID, createURL } = toolProps;
return (
<Menu.Item {...rest}>
<Button disabled={serverID === undefined} type='link' icon='link' onClick={createURL}>
Create object URL
</Button>
</Menu.Item>
);
}
function MakeCopyItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { copyShortcut, pasteShortcut, copy } = toolProps;
return (
<Menu.Item {...rest}>
<Tooltip title={`${copyShortcut} and ${pasteShortcut}`} mouseLeaveDelay={0}>
<Button type='link' icon='copy' onClick={copy}>
Make a copy
</Button>
</Tooltip>
</Menu.Item>
);
}
function PropagateItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { propagateShortcut, propagate } = toolProps;
return (
<Menu.Item {...rest}>
<Tooltip title={`${propagateShortcut}`} mouseLeaveDelay={0}>
<Button type='link' icon='block' onClick={propagate}>
Propagate
</Button>
</Tooltip>
</Menu.Item>
);
}
function TrackingItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { activateTracking } = toolProps;
return (
<Menu.Item {...rest}>
<Tooltip title='Run tracking with the active tracker' mouseLeaveDelay={0}>
<Button type='link' onClick={activateTracking}>
<Icon type='gateway' />
Track
</Button>
</Tooltip>
</Menu.Item>
);
}
function SwitchOrientationItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { switchOrientation } = toolProps;
return (
<Menu.Item {...rest}>
<Button type='link' icon='retweet' onClick={switchOrientation}>
Switch orientation
</Button>
</Menu.Item>
);
}
function ResetPerspectiveItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { resetCuboidPerspective } = toolProps;
return (
<Menu.Item {...rest}>
<Button type='link' onClick={resetCuboidPerspective}>
<Icon component={ResetPerspectiveIcon} />
Reset perspective
</Button>
</Menu.Item>
);
}
function ToBackgroundItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { toBackgroundShortcut, toBackground } = toolProps;
return (
<Menu.Item {...rest}>
<Tooltip title={`${toBackgroundShortcut}`} mouseLeaveDelay={0}>
<Button type='link' onClick={toBackground}>
<Icon component={BackgroundIcon} />
To background
</Button>
</Tooltip>
</Menu.Item>
);
}
function ToForegroundItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { toForegroundShortcut, toForeground } = toolProps;
return (
<Menu.Item {...rest}>
<Tooltip title={`${toForegroundShortcut}`} mouseLeaveDelay={0}>
<Button type='link' onClick={toForeground}>
<Icon component={ForegroundIcon} />
To foreground
</Button>
</Tooltip>
</Menu.Item>
);
}
function SwitchColorItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const {
color,
colorPickerVisible,
changeColorShortcut,
colorBy,
changeColor,
changeColorPickerVisible,
} = toolProps;
return (
<Menu.Item {...rest}>
<ColorPicker
value={color}
onChange={changeColor}
visible={colorPickerVisible}
onVisibleChange={changeColorPickerVisible}
resetVisible={false}
>
<Tooltip title={`${changeColorShortcut}`} mouseLeaveDelay={0}>
<Button type='link'>
<Icon component={ColorizeIcon} />
{`Change ${colorBy.toLowerCase()} color`}
</Button>
</Tooltip>
</ColorPicker>
</Menu.Item>
);
}
function RemoveItem(props: ItemProps): JSX.Element {
const { toolProps, ...rest } = props;
const { removeShortcut, locked, remove } = toolProps;
return (
<Menu.Item {...rest}>
<Tooltip title={`${removeShortcut}`} mouseLeaveDelay={0}>
<Button
type='link'
icon='delete'
onClick={(): void => {
if (locked) {
Modal.confirm({
title: 'Object is locked',
content: 'Are you sure you want to remove it?',
onOk() {
remove();
},
});
} else {
remove();
}
}}
>
Remove
</Button>
</Tooltip>
</Menu.Item>
);
}
export default function ItemMenu(props: Props): JSX.Element {
const {
readonly, shapeType, objectType, colorBy,
} = props;
return (
<Menu className='cvat-object-item-menu'>
<CreateURLItem toolProps={props} />
{!readonly && <MakeCopyItem toolProps={props} />}
{!readonly && <PropagateItem toolProps={props} />}
{!readonly && objectType === ObjectType.TRACK && shapeType === ShapeType.RECTANGLE && (
<TrackingItem toolProps={props} />
)}
{!readonly && [ShapeType.POLYGON, ShapeType.POLYLINE, ShapeType.CUBOID].includes(shapeType) && (
<SwitchOrientationItem toolProps={props} />
)}
{!readonly && shapeType === ShapeType.CUBOID && <ResetPerspectiveItem toolProps={props} />}
{!readonly && objectType !== ObjectType.TAG && <ToBackgroundItem toolProps={props} />}
{!readonly && objectType !== ObjectType.TAG && <ToForegroundItem toolProps={props} />}
{[ColorBy.INSTANCE, ColorBy.GROUP].includes(colorBy) && <SwitchColorItem toolProps={props} />}
{!readonly && <RemoveItem toolProps={props} />}
</Menu>
);
}