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.
327 lines
12 KiB
TypeScript
327 lines
12 KiB
TypeScript
// Copyright (C) 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import React from 'react';
|
|
import { Row, Col } from 'antd/lib/grid';
|
|
import Icon from '@ant-design/icons';
|
|
import Tooltip from 'antd/lib/tooltip';
|
|
|
|
import { ObjectType, ShapeType } from 'reducers/interfaces';
|
|
import {
|
|
ObjectOutsideIcon, FirstIcon, LastIcon, PreviousIcon, NextIcon,
|
|
} from 'icons';
|
|
|
|
interface Props {
|
|
readonly: boolean;
|
|
objectType: ObjectType;
|
|
shapeType: ShapeType;
|
|
occluded: boolean;
|
|
outside: boolean | undefined;
|
|
locked: boolean;
|
|
pinned: boolean;
|
|
hidden: boolean;
|
|
keyframe: boolean | undefined;
|
|
outsideDisabled: boolean;
|
|
hiddenDisabled: boolean;
|
|
keyframeDisabled: boolean;
|
|
switchOccludedShortcut: string;
|
|
switchOutsideShortcut: string;
|
|
switchLockShortcut: string;
|
|
switchHiddenShortcut: string;
|
|
switchKeyFrameShortcut: string;
|
|
nextKeyFrameShortcut: string;
|
|
prevKeyFrameShortcut: string;
|
|
|
|
navigateFirstKeyframe: null | (() => void);
|
|
navigatePrevKeyframe: null | (() => void);
|
|
navigateNextKeyframe: null | (() => void);
|
|
navigateLastKeyframe: null | (() => void);
|
|
|
|
setOccluded(): void;
|
|
unsetOccluded(): void;
|
|
setOutside(): void;
|
|
unsetOutside(): void;
|
|
setKeyframe(): void;
|
|
unsetKeyframe(): void;
|
|
lock(): void;
|
|
unlock(): void;
|
|
pin(): void;
|
|
unpin(): void;
|
|
hide(): void;
|
|
show(): void;
|
|
}
|
|
|
|
const classes = {
|
|
firstKeyFrame: { className: 'cvat-object-item-button-first-keyframe' },
|
|
prevKeyFrame: { className: 'cvat-object-item-button-prev-keyframe' },
|
|
nextKeyFrame: { className: 'cvat-object-item-button-next-keyframe' },
|
|
lastKeyFrame: { className: 'cvat-object-item-button-last-keyframe' },
|
|
outside: {
|
|
enabled: { className: 'cvat-object-item-button-outside cvat-object-item-button-outside-enabled' },
|
|
disabled: { className: 'cvat-object-item-button-outside' },
|
|
},
|
|
lock: {
|
|
enabled: { className: 'cvat-object-item-button-lock cvat-object-item-button-lock-enabled' },
|
|
disabled: { className: 'cvat-object-item-button-lock' },
|
|
},
|
|
occluded: {
|
|
enabled: { className: 'cvat-object-item-button-occluded cvat-object-item-button-occluded-enabled' },
|
|
disabled: { className: 'cvat-object-item-button-occluded' },
|
|
},
|
|
pinned: {
|
|
enabled: { className: 'cvat-object-item-button-pinned cvat-object-item-button-pinned-enabled' },
|
|
disabled: { className: 'cvat-object-item-button-pinned' },
|
|
},
|
|
hidden: {
|
|
enabled: { className: 'cvat-object-item-button-hidden cvat-object-item-button-hidden-enabled' },
|
|
disabled: { className: 'cvat-object-item-button-hidden' },
|
|
},
|
|
keyframe: {
|
|
enabled: { className: 'cvat-object-item-button-keyframe cvat-object-item-button-keyframe-enabled' },
|
|
disabled: { className: 'cvat-object-item-button-keyframe' },
|
|
},
|
|
};
|
|
|
|
function NavigateFirstKeyframe(props: Props): JSX.Element {
|
|
const { navigateFirstKeyframe } = props;
|
|
return navigateFirstKeyframe ? (
|
|
<Icon {...classes.firstKeyFrame} component={FirstIcon} onClick={navigateFirstKeyframe} />
|
|
) : (
|
|
<Icon {...classes.firstKeyFrame} component={FirstIcon} style={{ opacity: 0.5, pointerEvents: 'none' }} />
|
|
);
|
|
}
|
|
|
|
function NavigatePrevKeyframe(props: Props): JSX.Element {
|
|
const { prevKeyFrameShortcut, navigatePrevKeyframe } = props;
|
|
return navigatePrevKeyframe ? (
|
|
<Tooltip title={`Go to previous keyframe ${prevKeyFrameShortcut}`} mouseLeaveDelay={0}>
|
|
<Icon {...classes.prevKeyFrame} component={PreviousIcon} onClick={navigatePrevKeyframe} />
|
|
</Tooltip>
|
|
) : (
|
|
<Icon {...classes.prevKeyFrame} component={PreviousIcon} style={{ opacity: 0.5, pointerEvents: 'none' }} />
|
|
);
|
|
}
|
|
|
|
function NavigateNextKeyframe(props: Props): JSX.Element {
|
|
const { navigateNextKeyframe, nextKeyFrameShortcut } = props;
|
|
return navigateNextKeyframe ? (
|
|
<Tooltip title={`Go to next keyframe ${nextKeyFrameShortcut}`} mouseLeaveDelay={0}>
|
|
<Icon {...classes.nextKeyFrame} component={NextIcon} onClick={navigateNextKeyframe} />
|
|
</Tooltip>
|
|
) : (
|
|
<Icon {...classes.nextKeyFrame} component={NextIcon} style={{ opacity: 0.5, pointerEvents: 'none' }} />
|
|
);
|
|
}
|
|
|
|
function NavigateLastKeyframe(props: Props): JSX.Element {
|
|
const { navigateLastKeyframe } = props;
|
|
return navigateLastKeyframe ? (
|
|
<Icon {...classes.lastKeyFrame} component={LastIcon} onClick={navigateLastKeyframe} />
|
|
) : (
|
|
<Icon {...classes.lastKeyFrame} component={LastIcon} style={{ opacity: 0.5, pointerEvents: 'none' }} />
|
|
);
|
|
}
|
|
|
|
function SwitchLock(props: Props): JSX.Element {
|
|
const {
|
|
locked, switchLockShortcut, lock, unlock,
|
|
} = props;
|
|
return (
|
|
<Tooltip title={`Switch lock property ${switchLockShortcut}`} mouseLeaveDelay={0}>
|
|
{locked ? (
|
|
<Icon {...classes.lock.enabled} type='lock' theme='filled' onClick={unlock} />
|
|
) : (
|
|
<Icon {...classes.lock.disabled} type='unlock' onClick={lock} />
|
|
)}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
function SwitchOccluded(props: Props): JSX.Element {
|
|
const {
|
|
switchOccludedShortcut, occluded, unsetOccluded, setOccluded,
|
|
} = props;
|
|
return (
|
|
<Tooltip title={`Switch occluded property ${switchOccludedShortcut}`} mouseLeaveDelay={0}>
|
|
{occluded ? (
|
|
<Icon {...classes.occluded.enabled} type='team' onClick={unsetOccluded} />
|
|
) : (
|
|
<Icon {...classes.occluded.disabled} type='user' onClick={setOccluded} />
|
|
)}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
function SwitchPinned(props: Props): JSX.Element {
|
|
const { pinned, pin, unpin } = props;
|
|
return (
|
|
<Tooltip title='Switch pinned property' mouseLeaveDelay={0}>
|
|
{pinned ? (
|
|
<Icon {...classes.pinned.enabled} type='pushpin' theme='filled' onClick={unpin} />
|
|
) : (
|
|
<Icon {...classes.pinned.disabled} type='pushpin' onClick={pin} />
|
|
)}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
function SwitchHidden(props: Props): JSX.Element {
|
|
const {
|
|
switchHiddenShortcut, hidden, hiddenDisabled, show, hide,
|
|
} = props;
|
|
const hiddenStyle = hiddenDisabled ? { opacity: 0.5, pointerEvents: 'none' as const } : {};
|
|
return (
|
|
<Tooltip title={`Switch hidden property ${switchHiddenShortcut}`} mouseLeaveDelay={0}>
|
|
{hidden ? (
|
|
<Icon
|
|
{...classes.hidden.enabled}
|
|
type='eye-invisible'
|
|
theme='filled'
|
|
onClick={show}
|
|
style={hiddenStyle}
|
|
/>
|
|
) : (
|
|
<Icon {...classes.hidden.disabled} type='eye' onClick={hide} style={hiddenStyle} />
|
|
)}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
function SwitchOutside(props: Props): JSX.Element {
|
|
const {
|
|
outside, switchOutsideShortcut, outsideDisabled, unsetOutside, setOutside,
|
|
} = props;
|
|
const outsideStyle = outsideDisabled ? { opacity: 0.5, pointerEvents: 'none' as const } : {};
|
|
return (
|
|
<Tooltip title={`Switch outside property ${switchOutsideShortcut}`} mouseLeaveDelay={0}>
|
|
{outside ? (
|
|
<Icon
|
|
{...classes.outside.enabled}
|
|
component={ObjectOutsideIcon}
|
|
onClick={unsetOutside}
|
|
style={outsideStyle}
|
|
/>
|
|
) : (
|
|
<Icon {...classes.outside.disabled} type='select' onClick={setOutside} style={outsideStyle} />
|
|
)}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
function SwitchKeyframe(props: Props): JSX.Element {
|
|
const {
|
|
keyframe, switchKeyFrameShortcut, keyframeDisabled, unsetKeyframe, setKeyframe,
|
|
} = props;
|
|
const keyframeStyle = keyframeDisabled ? { opacity: 0.5, pointerEvents: 'none' as const } : {};
|
|
return (
|
|
<Tooltip title={`Switch keyframe property ${switchKeyFrameShortcut}`} mouseLeaveDelay={0}>
|
|
{keyframe ? (
|
|
<Icon
|
|
{...classes.keyframe.enabled}
|
|
type='star'
|
|
theme='filled'
|
|
onClick={unsetKeyframe}
|
|
style={keyframeStyle}
|
|
/>
|
|
) : (
|
|
<Icon {...classes.keyframe.disabled} type='star' onClick={setKeyframe} style={keyframeStyle} />
|
|
)}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
function ItemButtonsComponent(props: Props): JSX.Element {
|
|
const { readonly, objectType, shapeType } = props;
|
|
|
|
if (objectType === ObjectType.TRACK) {
|
|
return (
|
|
<Row type='flex' align='middle' justify='space-around'>
|
|
<Col span={20} style={{ textAlign: 'center' }}>
|
|
<Row type='flex' justify='space-around'>
|
|
<Col>
|
|
<NavigateFirstKeyframe {...props} />
|
|
</Col>
|
|
<Col>
|
|
<NavigatePrevKeyframe {...props} />
|
|
</Col>
|
|
<Col>
|
|
<NavigateNextKeyframe {...props} />
|
|
</Col>
|
|
<Col>
|
|
<NavigateLastKeyframe {...props} />
|
|
</Col>
|
|
</Row>
|
|
{!readonly && (
|
|
<Row type='flex' justify='space-around'>
|
|
<Col>
|
|
<SwitchOutside {...props} />
|
|
</Col>
|
|
<Col>
|
|
<SwitchLock {...props} />
|
|
</Col>
|
|
<Col>
|
|
<SwitchOccluded {...props} />
|
|
</Col>
|
|
<Col>
|
|
<SwitchHidden {...props} />
|
|
</Col>
|
|
<Col>
|
|
<SwitchKeyframe {...props} />
|
|
</Col>
|
|
{shapeType !== ShapeType.POINTS && (
|
|
<Col>
|
|
<SwitchPinned {...props} />
|
|
</Col>
|
|
)}
|
|
</Row>
|
|
)}
|
|
</Col>
|
|
</Row>
|
|
);
|
|
}
|
|
|
|
if (readonly) {
|
|
return <div />;
|
|
}
|
|
|
|
if (objectType === ObjectType.TAG) {
|
|
return (
|
|
<Row type='flex' align='middle' justify='space-around'>
|
|
<Col span={20} style={{ textAlign: 'center' }}>
|
|
<Row type='flex' justify='space-around'>
|
|
<Col>
|
|
<SwitchLock {...props} />
|
|
</Col>
|
|
</Row>
|
|
</Col>
|
|
</Row>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Row type='flex' align='middle' justify='space-around'>
|
|
<Col span={20} style={{ textAlign: 'center' }}>
|
|
<Row type='flex' justify='space-around'>
|
|
<Col>
|
|
<SwitchLock {...props} />
|
|
</Col>
|
|
<Col>
|
|
<SwitchOccluded {...props} />
|
|
</Col>
|
|
<Col>
|
|
<SwitchHidden {...props} />
|
|
</Col>
|
|
{shapeType !== ShapeType.POINTS && (
|
|
<Col>
|
|
<SwitchPinned {...props} />
|
|
</Col>
|
|
)}
|
|
</Row>
|
|
</Col>
|
|
</Row>
|
|
);
|
|
}
|
|
|
|
export default React.memo(ItemButtonsComponent);
|