From 061b7fa78d3340f26727520bb343bb6f61038bf5 Mon Sep 17 00:00:00 2001 From: Kirill Lakhov Date: Tue, 8 Oct 2024 11:34:25 +0300 Subject: [PATCH 1/5] initial commit --- .../canvas/views/canvas2d/brush-tools.tsx | 244 +++++++++++------- 1 file changed, 152 insertions(+), 92 deletions(-) diff --git a/cvat-ui/src/components/annotation-page/canvas/views/canvas2d/brush-tools.tsx b/cvat-ui/src/components/annotation-page/canvas/views/canvas2d/brush-tools.tsx index 3e365cdb360..fc5e0063baf 100644 --- a/cvat-ui/src/components/annotation-page/canvas/views/canvas2d/brush-tools.tsx +++ b/cvat-ui/src/components/annotation-page/canvas/views/canvas2d/brush-tools.tsx @@ -24,6 +24,10 @@ import CVATTooltip from 'components/common/cvat-tooltip'; import { CombinedState, ObjectType, ShapeType } from 'reducers'; import LabelSelector from 'components/label-selector/label-selector'; import { rememberObject, updateCanvasBrushTools } from 'actions/annotation-actions'; +import { ShortcutScope } from 'utils/enums'; +import GlobalHotKeys from 'utils/mousetrap-react'; +import { subKeyMap } from 'utils/component-subkeymap'; +import { registerComponentShortcuts } from 'actions/shortcuts-actions'; import useDraggable from './draggable-hoc'; const DraggableArea = ( @@ -32,6 +36,34 @@ const DraggableArea = ( ); +const componentShortcuts = { + ACTIVATE_BRUSH_TOOL_STANDARD_CONTROLS: { + name: 'Brush tool', + description: 'Activate brush tool (in mask edit mode)', + sequences: ['shift+1'], + scope: ShortcutScope.STANDARD_WORKSPACE_CONTROLS, + }, + ACTIVATE_ERASER_TOOL_STANDARD_CONTROLS: { + name: 'Eraser tool', + description: 'Activate eraser tool (in mask edit mode)', + sequences: ['shift+2'], + scope: ShortcutScope.STANDARD_WORKSPACE_CONTROLS, + }, + ACTIVATE_POLYGON_TOOL_STANDARD_CONTROLS: { + name: 'Polygon tool', + description: 'Activate polygon tool (in mask edit mode)', + sequences: ['shift+3'], + scope: ShortcutScope.STANDARD_WORKSPACE_CONTROLS, + }, + ACTIVATE_POLYGON_REMOVE_TOOL_STANDARD_CONTROLS: { + name: 'Polygon remove tool', + description: 'Activate polygon remove tool (in mask edit mode)', + sequences: ['shift+4'], + scope: ShortcutScope.STANDARD_WORKSPACE_CONTROLS, + }, +}; +registerComponentShortcuts(componentShortcuts); + const MIN_BRUSH_SIZE = 1; function BrushTools(): React.ReactPortal | null { const dispatch = useDispatch(); @@ -39,6 +71,7 @@ function BrushTools(): React.ReactPortal | null { const config = useSelector((state: CombinedState) => state.annotation.canvas.brushTools); const canvasInstance = useSelector((state: CombinedState) => state.annotation.canvas.instance); const labels = useSelector((state: CombinedState) => state.annotation.job.labels); + const { keyMap } = useSelector((state: CombinedState) => state.shortcuts); const { visible } = config; const [editableState, setEditableState] = useState(null); @@ -53,6 +86,26 @@ function BrushTools(): React.ReactPortal | null { 'polygon-minus': false, }); + const setBrushTool = useCallback(() => setCurrentTool('brush'), [setCurrentTool]); + const setEraserTool = useCallback(() => { + if (!blockedTools.eraser) { + setCurrentTool('eraser'); + } + }, [setCurrentTool, blockedTools]); + const setPolygonTool = useCallback(() => setCurrentTool('polygon-plus'), [setCurrentTool]); + const setPolygonRemoveTool = useCallback(() => { + if (!blockedTools['polygon-minus']) { + setCurrentTool('polygon-minus'); + } + }, [setCurrentTool, blockedTools]); + + const handlers: Record void> = { + ACTIVATE_BRUSH_TOOL_STANDARD_CONTROLS: setBrushTool, + ACTIVATE_ERASER_TOOL_STANDARD_CONTROLS: setEraserTool, + ACTIVATE_POLYGON_TOOL_STANDARD_CONTROLS: setPolygonTool, + ACTIVATE_POLYGON_REMOVE_TOOL_STANDARD_CONTROLS: setPolygonRemoveTool, + }; + const [removeUnderlyingPixels, setRemoveUnderlyingPixels] = useState(false); const dragBar = useDraggable( (): number[] => { @@ -201,110 +254,117 @@ function BrushTools(): React.ReactPortal | null { } return ReactDOM.createPortal(( -
-
+