前端移除 UI 编辑器合并与绑定调用

- 删除 features/ui-editor/merge.ts 与 MergeDTO、BindingDTO、BindingChange 类型文件
- useUiEditorPage 去掉 mergeUi 操作、合并运行态、合并状态与投影字段
- isAiRunning 不再把合并运行态计入编辑器忙状态
This commit is contained in:
2026-09-23 17:46:06 +08:00
parent 31a1660e41
commit fb49b5fc5d
5 changed files with 1 additions and 63 deletions
@@ -1,10 +0,0 @@
import type { MergeDTO } from './types/MergeDTO';
import type { State } from './types/State';
/** 合并阶段返回一棵新树,成功后替换当前全部逐图识别树。 */
export function applyMergeResult(state: State, result: MergeDTO): State {
return {
...structuredClone(state),
ui_trees: [structuredClone(result.ui_tree)],
};
}
@@ -1,6 +0,0 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { NodeComponent } from "./NodeComponent";
import type { NodeId } from "./NodeId";
import type { StageStatus } from "./StageStatus";
export type BindingChange = { node_id: NodeId, component: NodeComponent, component_status: StageStatus, };
@@ -1,4 +0,0 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { BindingChange } from "./BindingChange";
export type BindingDTO = { changes: Array<BindingChange>, };
@@ -1,4 +0,0 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { UITree } from "./UITree";
export type MergeDTO = { ui_tree: UITree, };
@@ -8,7 +8,6 @@ import {
prepareFontAssetBatch,
prepareSpriteAssetBatch,
} from '../../features/ui-editor/importAdapter';
import { applyMergeResult } from '../../features/ui-editor/merge';
import {
findStateNodePageContext,
pageRectSize,
@@ -27,7 +26,6 @@ import { collectUiNodeIds } from '../../features/ui-editor/treeUtils';
import type { ChildrenDisplayMode } from '../../features/ui-editor/types/ChildrenDisplayMode';
import type { Component } from '../../features/ui-editor/types/Component';
import type { FontAssetId } from '../../features/ui-editor/types/FontAssetId';
import type { MergeDTO } from '../../features/ui-editor/types/MergeDTO';
import type { Node as UiNode } from '../../features/ui-editor/types/Node';
import type { NodeId } from '../../features/ui-editor/types/NodeId';
import type { RecognitionDTO } from '../../features/ui-editor/types/RecognitionDTO';
@@ -230,18 +228,12 @@ export function useUiEditorSession(
const [pendingRemoval, setPendingRemoval] =
useState<PendingResourceRemoval | null>(null);
const recognitionOperation = useUiEditorOperation();
const mergeOperation = useUiEditorOperation();
const separationOperation = useUiEditorOperation();
const isRecognizing = recognitionOperation.running;
const recognitionStatus = recognitionOperation.status;
const beginRecognition = recognitionOperation.begin;
const finishRecognition = recognitionOperation.finish;
const setRecognitionStatus = recognitionOperation.setStatus;
const isMerging = mergeOperation.running;
const mergeStatus = mergeOperation.status;
const beginMerge = mergeOperation.begin;
const finishMerge = mergeOperation.finish;
const setMergeStatus = mergeOperation.setStatus;
const isSeparating = separationOperation.running;
const separationStatus = separationOperation.status;
const beginSeparation = separationOperation.begin;
@@ -382,7 +374,7 @@ export function useUiEditorSession(
const activeImage = activeImageId ? images[activeImageId] : null;
const selectedSprite = selectedSpriteId ? sprites[selectedSpriteId] : null;
const selectedFont = selectedFontId ? fonts[selectedFontId] : null;
const isAiRunning = isRecognizing || isMerging || isSeparating;
const isAiRunning = isRecognizing || isSeparating;
const isWorkflowBusy =
isAiRunning || isSaving || isGenerating || isLoading || editor.isLocked;
const stateSignature = JSON.stringify(editor.state);
@@ -974,33 +966,6 @@ export function useUiEditorSession(
}
}
async function mergeUi() {
// TODO: This experimental operation is intentionally outside the formal workflow.
if (isMerging || isWorkflowBusy) return;
setMergeStatus(null);
beginMerge();
try {
await editor.runWithStateLocked(async (snapshot) => {
const result = await invoke<MergeDTO>('merge_ui', { state: snapshot });
const nextState = applyMergeResult(snapshot, result);
const mergedTrees = nextState.ui_trees;
nextState.ui_trees = [];
for (const tree of mergedTrees) {
nextState.ui_trees.push(
createTree(nextState, tree.src_ui_design, tree.root),
);
}
editor.replaceState(nextState);
setSelectedNodeId(null);
setMergeStatus('已生成合并后的单棵界面树。');
});
} catch (cause) {
setMergeStatus(cause instanceof Error ? cause.message : String(cause));
} finally {
finishMerge();
}
}
async function runSeparationWorkflow() {
if (!resourceId || isWorkflowBusy) return;
beginSeparation();
@@ -1494,14 +1459,11 @@ export function useUiEditorSession(
selectedNodeId,
focusRequest,
operations: {
isMerging,
isRecognizing,
mergeStatus,
recognitionStatus,
},
checkPrerequisites,
separateUi,
mergeUi,
recognizeUi,
openImporter: setImportKind,
selectDesignImage,