diff --git a/README.md b/README.md index d3cb5d21..83eda5fb 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ docker logs make-sense | Zoom out | Editor | + - | Ctrl + - | | Move image | Editor | Up / Down / Left / Right | Up / Down / Left / Right | | Select Label | Editor | + 0-9 | Ctrl + 0-9 | +| Show/Hide All Labels | Editor | h | h | Exit popup | Popup | Escape | Escape | **Table 1.** Supported keyboard shortcuts diff --git a/src/logic/actions/ImageActions.ts b/src/logic/actions/ImageActions.ts index bce4b7cd..84bc2393 100644 --- a/src/logic/actions/ImageActions.ts +++ b/src/logic/actions/ImageActions.ts @@ -17,6 +17,7 @@ import { LabelRect, } from "../../store/labels/types"; import { LabelStatus } from "../../data/enums/LabelStatus"; +import { LabelActions } from "./LabelActions"; import { remove } from "lodash"; export class ImageActions { @@ -60,6 +61,13 @@ export class ImageActions { store.dispatch(updateActiveLabelNameId(labelNames[1].id)); } + public static toggleAllLabelsVisibility(): void { + const imageData: ImageData = LabelsSelector.getActiveImageData(); + const newToggleValue = imageData.allLabelsVisibilityToggle !== null ? !imageData.allLabelsVisibilityToggle : false; + + LabelActions.setAllLabelsVisibility(imageData.id, newToggleValue); + } + private static mapNewImageData( imageData: ImageData, labelIndex: number diff --git a/src/logic/actions/LabelActions.ts b/src/logic/actions/LabelActions.ts index d47f2e7d..ead33a86 100644 --- a/src/logic/actions/LabelActions.ts +++ b/src/logic/actions/LabelActions.ts @@ -71,6 +71,28 @@ export class LabelActions { store.dispatch(updateImageDataById(imageData.id, newImageData)); } + public static setAllLabelsVisibility(imageId: string, isVisible: boolean) { + const imageData: ImageData = LabelsSelector.getImageDataById(imageId); + const newImageData = { + ...imageData, + allLabelsVisibilityToggle: isVisible, + labelPoints: imageData.labelPoints.map((labelPoint: LabelPoint) => { + return LabelUtil.setAnnotationVisibility(labelPoint, isVisible) + }), + labelRects: imageData.labelRects.map((labelRect: LabelRect) => { + return LabelUtil.setAnnotationVisibility(labelRect, isVisible) + }), + labelPolygons: imageData.labelPolygons.map((labelPolygon: LabelPolygon) => { + return LabelUtil.setAnnotationVisibility(labelPolygon, isVisible) + }), + labelLines: imageData.labelLines.map((labelLine: LabelLine) => { + return LabelUtil.setAnnotationVisibility(labelLine, isVisible) + }), + }; + + store.dispatch(updateImageDataById(imageData.id, newImageData)); + } + public static toggleLabelVisibilityById(imageId: string, labelId: string) { const imageData: ImageData = LabelsSelector.getImageDataById(imageId); const newImageData = { diff --git a/src/logic/context/EditorContext.ts b/src/logic/context/EditorContext.ts index 14ee56ae..f5e227da 100644 --- a/src/logic/context/EditorContext.ts +++ b/src/logic/context/EditorContext.ts @@ -167,6 +167,13 @@ export class EditorContext extends BaseContext { ImageActions.setActiveLabelOnActiveImage(9); EditorActions.fullRender(); } - } + }, + { + keyCombo: ["h"], + action: (event: KeyboardEvent) => { + ImageActions.toggleAllLabelsVisibility(); + EditorActions.fullRender(); + } + }, ]; } \ No newline at end of file diff --git a/src/store/labels/types.ts b/src/store/labels/types.ts index 38397f7e..2c597c4c 100644 --- a/src/store/labels/types.ts +++ b/src/store/labels/types.ts @@ -49,6 +49,8 @@ export type ImageData = { labelPolygons: LabelPolygon[]; labelNameIds: string[]; + allLabelsVisibilityToggle: boolean; + // YOLO isVisitedByYOLOObjectDetector: boolean; diff --git a/src/utils/LabelUtil.ts b/src/utils/LabelUtil.ts index feec03d6..125f65ee 100644 --- a/src/utils/LabelUtil.ts +++ b/src/utils/LabelUtil.ts @@ -56,6 +56,13 @@ export class LabelUtil { } } + public static setAnnotationVisibility(annotation: AnnotationType, isVisible: boolean): AnnotationType { + return { + ...annotation, + isVisible + } + } + public static labelNamesIdsDiff(oldLabelNames: LabelName[], newLabelNames: LabelName[]): string[] { return oldLabelNames.reduce((missingIds: string[], labelName: LabelName) => { if (!find(newLabelNames, { 'id': labelName.id })) {