From 29b0b944bd66aff7640659e660e74e2e47cc7046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 5 Sep 2026 19:54:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=A9=E6=94=BE=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E7=84=A6=E7=82=B9=E6=8B=A6=E6=88=AA=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 允许缩放滑杆和缩放按钮焦点下继续执行 Delete/Backspace。 修正 UI 树宽度测量重复节点文本并保持预览点击选择语义。 补充缩放焦点快捷键回归测试与交互文档。 --- .../view/ui-editor/components/UiTreePanel.tsx | 52 ++++++------------- .../components/preview/PreviewWorkspace.tsx | 5 +- .../components/preview/UiTreeRenderer.tsx | 9 ++-- .../ui-editor/uiEditorKeyboardShortcuts.ts | 3 +- .../tests/uiEditorKeyboardShortcuts.test.ts | 45 ++++++++++++++++ ...【交互设计】预览画布缩放滑杆-2026-09-05.md | 1 + 6 files changed, 73 insertions(+), 42 deletions(-) diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/UiTreePanel.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/components/UiTreePanel.tsx index ae521ce83..14fde9869 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/UiTreePanel.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/UiTreePanel.tsx @@ -206,7 +206,6 @@ export function UiTreePanel({ }: UiTreePanelProps) { const treeApiRef = useRef | undefined>(undefined); const treeContainerRef = useRef(null); - const treeSizerRef = useRef(null); const [treeHeight, setTreeHeight] = useState(0); const [treeWidth, setTreeWidth] = useState(0); const [contextMenu, setContextMenu] = useState<{ @@ -246,21 +245,29 @@ export function UiTreePanel({ return rows; }, [root]); + const treeContentWidth = useMemo( + () => + treeRows.reduce((width, { node, depth }) => { + const labelWidth = Math.max( + 56, + (node.metadata.name || '未命名节点').length * 8, + ); + return Math.max(width, 16 + depth * 16 + 24 + labelWidth + 42 + 52); + }, 0), + [treeRows], + ); + useEffect(() => { - const sizer = treeSizerRef.current; const container = treeContainerRef.current; - if (!sizer || !container) return; + if (!container) return; const updateWidth = () => { - setTreeWidth( - Math.max(Math.ceil(sizer.scrollWidth), container.clientWidth), - ); + setTreeWidth(Math.max(treeContentWidth, container.clientWidth)); }; updateWidth(); const resizeObserver = new ResizeObserver(updateWidth); - resizeObserver.observe(sizer); resizeObserver.observe(container); return () => resizeObserver.disconnect(); - }, [treeRows]); + }, [treeContentWidth]); const handleMove: MoveHandler = ({ dragIds, @@ -334,35 +341,6 @@ export function UiTreePanel({ ref={treeContainerRef} className="relative min-h-0 flex-1 overflow-x-auto overflow-y-hidden" > - {root && treeHeight > 0 ? ( ref={treeApiRef} diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/PreviewWorkspace.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/PreviewWorkspace.tsx index a85ecf46d..df640566d 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/PreviewWorkspace.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/PreviewWorkspace.tsx @@ -512,7 +512,10 @@ export function PreviewWorkspace({ onScaleFromCenter={scaleViewportFromCenter} > {(actions) => ( -
+