main
Dmitry Kalinin 6 years ago
parent 965ff77898
commit 4d0c22513a

@ -18,6 +18,7 @@ import {
Task, Task,
FrameSpeed, FrameSpeed,
Rotation, Rotation,
ContextMenuType,
} from 'reducers/interfaces'; } from 'reducers/interfaces';
import getCore from 'cvat-core'; import getCore from 'cvat-core';
@ -270,13 +271,19 @@ ThunkAction<Promise<void>, {}, {}, AnyAction> {
}; };
} }
export function updateCanvasContextMenu(visible: boolean, left: number, top: number): AnyAction { export function updateCanvasContextMenu(
visible: boolean,
left: number,
top: number,
type?: ContextMenuType,
): AnyAction {
return { return {
type: AnnotationActionTypes.UPDATE_CANVAS_CONTEXT_MENU, type: AnnotationActionTypes.UPDATE_CANVAS_CONTEXT_MENU,
payload: { payload: {
visible, visible,
left, left,
top, top,
type,
}, },
}; };
} }

@ -0,0 +1,34 @@
// Copyright (C) 2020 Intel Corporation
//
// SPDX-License-Identifier: MIT
import React from 'react';
import ReactDOM from 'react-dom';
interface Props {
activatedStateID: number | null;
visible: boolean;
left: number;
top: number;
}
export default function CanvasPointContextMenu(props: Props): JSX.Element | null {
const {
activatedStateID,
visible,
left,
top,
} = props;
if (!visible || activatedStateID === null) {
return null;
}
return ReactDOM.createPortal(
<div className='cvat-canvas-point-context-menu' style={{ top, left }}>
<span>Haha</span>
</div>,
window.document.body,
);
}

@ -13,7 +13,12 @@ import {
} from 'antd'; } from 'antd';
import { SliderValue } from 'antd/lib//slider'; import { SliderValue } from 'antd/lib//slider';
import { ColorBy, GridColor, ObjectType } from 'reducers/interfaces'; import {
ColorBy,
GridColor,
ObjectType,
ContextMenuType,
} from 'reducers/interfaces';
import { Canvas } from 'cvat-canvas'; import { Canvas } from 'cvat-canvas';
import getCore from 'cvat-core'; import getCore from 'cvat-core';
@ -48,6 +53,8 @@ interface Props {
contrastLevel: number; contrastLevel: number;
saturationLevel: number; saturationLevel: number;
resetZoom: boolean; resetZoom: boolean;
contextVisible: boolean;
contextType: ContextMenuType;
onSetupCanvas: () => void; onSetupCanvas: () => void;
onDragCanvas: (enabled: boolean) => void; onDragCanvas: (enabled: boolean) => void;
onZoomCanvas: (enabled: boolean) => void; onZoomCanvas: (enabled: boolean) => void;
@ -64,7 +71,7 @@ interface Props {
onSplitAnnotations(sessionInstance: any, frame: number, state: any): void; onSplitAnnotations(sessionInstance: any, frame: number, state: any): void;
onActivateObject(activatedStateID: number | null): void; onActivateObject(activatedStateID: number | null): void;
onSelectObjects(selectedStatesID: number[]): void; onSelectObjects(selectedStatesID: number[]): void;
onUpdateContextMenu(visible: boolean, left: number, top: number): void; onUpdateContextMenu(visible: boolean, left: number, top: number, type: ContextMenuType): void;
onAddZLayer(): void; onAddZLayer(): void;
onSwitchZLayer(cur: number): void; onSwitchZLayer(cur: number): void;
onChangeBrightnessLevel(level: number): void; onChangeBrightnessLevel(level: number): void;
@ -414,9 +421,14 @@ export default class CanvasWrapperComponent extends React.PureComponent<Props> {
canvasInstance.html().addEventListener('contextmenu', (e: MouseEvent): void => { canvasInstance.html().addEventListener('contextmenu', (e: MouseEvent): void => {
const { const {
activatedStateID, activatedStateID,
contextType,
contextVisible,
} = this.props; } = this.props;
onUpdateContextMenu(activatedStateID !== null, e.clientX, e.clientY); if (!(contextVisible && contextType === ContextMenuType.CANVAS_SHAPE_POINT)) {
onUpdateContextMenu(activatedStateID !== null, e.clientX, e.clientY,
ContextMenuType.CANVAS_SHAPE);
}
}); });
canvasInstance.html().addEventListener('canvas.editstart', (): void => { canvasInstance.html().addEventListener('canvas.editstart', (): void => {
@ -518,7 +530,14 @@ export default class CanvasWrapperComponent extends React.PureComponent<Props> {
canvasInstance.html().addEventListener('canvas.splitted', this.onTrackSplitted.bind(this)); canvasInstance.html().addEventListener('canvas.splitted', this.onTrackSplitted.bind(this));
canvasInstance.html().addEventListener('point.contextmenu', (event: any) => { canvasInstance.html().addEventListener('point.contextmenu', (event: any) => {
console.log(event); // const {
// activatedStateID,
// } = this.props;
// console.log(event);
// onUpdateContextMenu(activatedStateID !== null, event.detail.mouseEvent.clientX,
// event.detail.mouseEvent.clientY, ContextMenuType.CANVAS_SHAPE_POINT);
}); });
} }

@ -129,6 +129,19 @@
} }
} }
.cvat-canvas-point-context-menu {
opacity: 0.6;
position: fixed;
width: 100px;
z-index: 10;
max-height: 50%;
overflow-y: auto;
&:hover {
opacity: 1;
}
}
.cvat-canvas-z-axis-wrapper { .cvat-canvas-z-axis-wrapper {
position: absolute; position: absolute;
background: $background-color-2; background: $background-color-2;

@ -5,15 +5,17 @@
import React from 'react'; import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { CombinedState } from 'reducers/interfaces'; import { CombinedState, ContextMenuType } from 'reducers/interfaces';
import CanvasContextMenuComponent from 'components/annotation-page/standard-workspace/canvas-context-menu'; import CanvasContextMenuComponent from 'components/annotation-page/standard-workspace/canvas-context-menu';
import CanvasPointContextMenuComponent from 'components/annotation-page/standard-workspace/canvas-point-context-menu';
interface StateToProps { interface StateToProps {
activatedStateID: number | null; activatedStateID: number | null;
visible: boolean; visible: boolean;
top: number; top: number;
left: number; left: number;
type: ContextMenuType;
collapsed: boolean | undefined; collapsed: boolean | undefined;
} }
@ -29,6 +31,7 @@ function mapStateToProps(state: CombinedState): StateToProps {
visible, visible,
top, top,
left, left,
type,
}, },
}, },
}, },
@ -40,6 +43,7 @@ function mapStateToProps(state: CombinedState): StateToProps {
visible, visible,
left, left,
top, top,
type,
}; };
} }
@ -175,6 +179,7 @@ class CanvasContextMenuContainer extends React.PureComponent<Props, State> {
const { const {
visible, visible,
activatedStateID, activatedStateID,
type,
} = this.props; } = this.props;
return ( return (

@ -39,6 +39,7 @@ import {
GridColor, GridColor,
ObjectType, ObjectType,
CombinedState, CombinedState,
ContextMenuType,
} from 'reducers/interfaces'; } from 'reducers/interfaces';
import { Canvas } from 'cvat-canvas'; import { Canvas } from 'cvat-canvas';
@ -70,6 +71,8 @@ interface StateToProps {
minZLayer: number; minZLayer: number;
maxZLayer: number; maxZLayer: number;
curZLayer: number; curZLayer: number;
contextVisible: boolean;
contextType: ContextMenuType;
} }
interface DispatchToProps { interface DispatchToProps {
@ -89,7 +92,7 @@ interface DispatchToProps {
onSplitAnnotations(sessionInstance: any, frame: number, state: any): void; onSplitAnnotations(sessionInstance: any, frame: number, state: any): void;
onActivateObject: (activatedStateID: number | null) => void; onActivateObject: (activatedStateID: number | null) => void;
onSelectObjects: (selectedStatesID: number[]) => void; onSelectObjects: (selectedStatesID: number[]) => void;
onUpdateContextMenu(visible: boolean, left: number, top: number): void; onUpdateContextMenu(visible: boolean, left: number, top: number, type: ContextMenuType): void;
onAddZLayer(): void; onAddZLayer(): void;
onSwitchZLayer(cur: number): void; onSwitchZLayer(cur: number): void;
onChangeBrightnessLevel(level: number): void; onChangeBrightnessLevel(level: number): void;
@ -104,6 +107,10 @@ function mapStateToProps(state: CombinedState): StateToProps {
const { const {
annotation: { annotation: {
canvas: { canvas: {
contextMenu: {
visible: contextVisible,
type: contextType,
},
instance: canvasInstance, instance: canvasInstance,
}, },
drawing: { drawing: {
@ -179,6 +186,8 @@ function mapStateToProps(state: CombinedState): StateToProps {
curZLayer, curZLayer,
minZLayer, minZLayer,
maxZLayer, maxZLayer,
contextVisible,
contextType,
}; };
} }
@ -236,8 +245,13 @@ function mapDispatchToProps(dispatch: any): DispatchToProps {
onSelectObjects(selectedStatesID: number[]): void { onSelectObjects(selectedStatesID: number[]): void {
dispatch(selectObjects(selectedStatesID)); dispatch(selectObjects(selectedStatesID));
}, },
onUpdateContextMenu(visible: boolean, left: number, top: number): void { onUpdateContextMenu(
dispatch(updateCanvasContextMenu(visible, left, top)); visible: boolean,
left: number,
top: number,
type: ContextMenuType,
): void {
dispatch(updateCanvasContextMenu(visible, left, top, type));
}, },
onAddZLayer(): void { onAddZLayer(): void {
dispatch(addZLayer()); dispatch(addZLayer());

@ -12,6 +12,7 @@ import {
ActiveControl, ActiveControl,
ShapeType, ShapeType,
ObjectType, ObjectType,
ContextMenuType,
} from './interfaces'; } from './interfaces';
const defaultState: AnnotationState = { const defaultState: AnnotationState = {
@ -23,6 +24,7 @@ const defaultState: AnnotationState = {
visible: false, visible: false,
left: 0, left: 0,
top: 0, top: 0,
type: ContextMenuType.CANVAS_SHAPE,
}, },
instance: new Canvas(), instance: new Canvas(),
ready: false, ready: false,
@ -923,6 +925,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => {
visible, visible,
left, left,
top, top,
type,
} = action.payload; } = action.payload;
return { return {
@ -934,6 +937,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => {
visible, visible,
left, left,
top, top,
type,
}, },
}, },
}; };

@ -282,6 +282,7 @@ export enum StatesOrdering {
export enum ContextMenuType { export enum ContextMenuType {
CANVAS = 'canvas', CANVAS = 'canvas',
CANVAS_SHAPE = 'canvas_shape', CANVAS_SHAPE = 'canvas_shape',
CANVAS_SHAPE_POINT = 'canvas_shape_point',
} }
export enum Rotation { export enum Rotation {
@ -301,6 +302,7 @@ export interface AnnotationState {
visible: boolean; visible: boolean;
top: number; top: number;
left: number; left: number;
type: ContextMenuType;
}; };
instance: Canvas; instance: Canvas;
ready: boolean; ready: boolean;

Loading…
Cancel
Save