From a92121e09dfc37b39ae369072e6eb2c57eedd055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 12 Sep 2026 21:22:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=A1=E5=87=86=E7=B4=A0=E6=9D=90=E5=88=87?= =?UTF-8?q?=E5=88=86=E6=A6=82=E8=A7=88=E7=9A=84=E8=B5=84=E6=BA=90=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 图片与字体槽位仅在引用的项目资源存在时计为已绑定。 概览组件接入字体资源表并保留无资源参数时的旧调用语义。 --- .../features/ui-editor/separationOverview.ts | 21 ++++++++++++++----- .../components/SeparationOverview.tsx | 7 +++++-- .../src/view/ui-editor/index.tsx | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/ui-editor/separationOverview.ts b/apps/ai-game-creator-shell/src/features/ui-editor/separationOverview.ts index 1330e2b7c..99fc27163 100644 --- a/apps/ai-game-creator-shell/src/features/ui-editor/separationOverview.ts +++ b/apps/ai-game-creator-shell/src/features/ui-editor/separationOverview.ts @@ -5,6 +5,7 @@ import { type UiTreeNodeTarget, } from './stageStatusOverview'; import type { Component } from './types/Component'; +import type { FontAsset } from './types/FontAsset'; import type { SpriteAsset } from './types/SpriteAsset'; import type { UITree } from './types/UITree'; @@ -39,12 +40,17 @@ function countRequiredAssetSlot(isBound: boolean): ComponentSeparationCounts { export function getImageSeparationCounts( component: Extract['Image'], + spriteAssets?: Record, ): ComponentSeparationCounts { - return countRequiredAssetSlot(component.target_graphic !== null); + return countRequiredAssetSlot( + component.target_graphic !== null && + (spriteAssets === undefined || component.target_graphic in spriteAssets), + ); } export function getTextSeparationCounts( component: Extract['Text'], + fontAssets?: Record, ): ComponentSeparationCounts { if ( typeof component.font !== 'object' || @@ -53,17 +59,21 @@ export function getTextSeparationCounts( ) { return EMPTY_COMPONENT_SEPARATION_COUNTS; } - return countRequiredAssetSlot(true); + return countRequiredAssetSlot( + fontAssets === undefined || component.font.Bound in fontAssets, + ); } export function getComponentSeparationCounts( component: Component, + spriteAssets?: Record, + fontAssets?: Record, ): ComponentSeparationCounts { if ('Image' in component) { - return getImageSeparationCounts(component.Image); + return getImageSeparationCounts(component.Image, spriteAssets); } if ('Text' in component) { - return getTextSeparationCounts(component.Text); + return getTextSeparationCounts(component.Text, fontAssets); } return EMPTY_COMPONENT_SEPARATION_COUNTS; } @@ -81,6 +91,7 @@ function addSeparationCounts( export function getSeparationOverview( uiTrees: UITree[], spriteAssets: Record, + fontAssets: Record = {}, ): SeparationOverview { const overview: SeparationOverview = { ...EMPTY_COMPONENT_SEPARATION_COUNTS, @@ -98,7 +109,7 @@ export function getSeparationOverview( if (node.component) { addSeparationCounts( overview, - getComponentSeparationCounts(node.component), + getComponentSeparationCounts(node.component, spriteAssets, fontAssets), ); } } diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/SeparationOverview.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/components/SeparationOverview.tsx index 6a24c82f7..79f17eceb 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/SeparationOverview.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/SeparationOverview.tsx @@ -5,6 +5,7 @@ import { nodeHasBlockedComponents, nodeNeedsComponentReview, } from '../../../features/ui-editor/separationOverview'; +import type { FontAsset } from '../../../features/ui-editor/types/FontAsset'; import type { NodeId } from '../../../features/ui-editor/types/NodeId'; import type { SpriteAsset } from '../../../features/ui-editor/types/SpriteAsset'; import type { UIDesignImageId } from '../../../features/ui-editor/types/UIDesignImageId'; @@ -14,15 +15,17 @@ import { useUiTreeNodeCycle } from '../useUiTreeNodeCycle'; export function SeparationOverview({ uiTrees, sprites, + fonts, onFocusStatusNode, }: { uiTrees: UITree[]; sprites: Record; + fonts: Record; onFocusStatusNode: (treeId: UIDesignImageId, nodeId: NodeId) => void; }) { const overview = useMemo( - () => getSeparationOverview(uiTrees, sprites), - [sprites, uiTrees], + () => getSeparationOverview(uiTrees, sprites, fonts), + [fonts, sprites, uiTrees], ); const attentionCycle = useUiTreeNodeCycle({ uiTrees, diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx index 2ea43b868..4696d76f9 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx @@ -269,6 +269,7 @@ export default function UiEditorPage({ { session.input.focusNode(treeId, nodeId); session.input.highlightStatusField(nodeId, 'component_status');