From 3399f081375925b2f720ece9759c0d6138fa724b Mon Sep 17 00:00:00 2001 From: zhangheng Date: Sat, 11 Apr 2026 16:55:13 +0800 Subject: [PATCH] feat(hotkeys): h --- components/label/LabelNossr.tsx | 52 ++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/components/label/LabelNossr.tsx b/components/label/LabelNossr.tsx index 1875527..478966a 100644 --- a/components/label/LabelNossr.tsx +++ b/components/label/LabelNossr.tsx @@ -1512,27 +1512,37 @@ const LabelPage = ({ ] ) - const handleToggleHideSelectedObject = useCallback(() => { - const selectedContext = resolveSelectedObjectContext() - if (!selectedContext) { - notifications.show({ - color: "yellow", - message: "请先选中单个对象", - }) - return - } + const handleToggleHideAllObjects = useCallback(() => { + const activeImageLabel = labelData.get(activeImage) + if (!activeImageLabel?.size) return - const currentHideStatus = - useObjectStore.getState().pathStatus[ - selectedContext.imageId + selectedContext.objectId - ]?.HIDE || false - toggleObjectHideByShortcut( - selectedContext.imageId, - selectedContext.operationId, - selectedContext.objectId, - !currentHideStatus + const activeImageOperations = Array.from(activeImageLabel.keys()) + const totalObjectCount = activeImageOperations.reduce( + (count, operationId) => { + return count + (activeImageLabel.get(operationId)?.length || 0) + }, + 0 ) - }, [resolveSelectedObjectContext]) + if (!totalObjectCount) return + + const pathStatus = useObjectStore.getState().pathStatus + const areAllObjectsHidden = activeImageOperations.every((operationId) => { + const operationChildren = activeImageLabel.get(operationId) || [] + return operationChildren.every( + ([objectId]) => pathStatus[activeImage + objectId]?.HIDE ?? false + ) + }) + + const nextHide = !areAllObjectsHidden + const { updateOperationStatus } = useObjectStore.getState() + + activeImageOperations.forEach((operationId) => { + updateOperationStatus(activeImage + operationId, "HIDE", nextHide) + activeImageLabel.get(operationId)?.forEach(([objectId]) => { + toggleObjectHideByShortcut(activeImage, operationId, objectId, nextHide) + }) + }) + }, [activeImage, labelData]) const rerenderActiveImageByLabel = useCallback( ( @@ -2123,7 +2133,7 @@ const LabelPage = ({ if (!e.ctrlKey && !e.metaKey && !e.altKey && lowerKey === "h") { e.preventDefault() - handleToggleHideSelectedObject() + handleToggleHideAllObjects() return } @@ -2424,7 +2434,7 @@ const LabelPage = ({ enterSelectedObjectDrawMode, focusInput, getOperationSchema, - handleToggleHideSelectedObject, + handleToggleHideAllObjects, handleMergeSelectedObjects, handleContinueSelectedPolygon, handleShortcut,