UI编辑器收口多树上下文菜单目标

预览菜单携带所属树 ID

避免非当前图片树的结构操作写错目标
This commit is contained in:
2026-09-14 18:14:02 +08:00
parent f679cfa179
commit f0bba18841
2 changed files with 19 additions and 4 deletions
@@ -98,6 +98,7 @@ export function PreviewWorkspace({
>(new Map());
const [contextMenu, setContextMenu] = useState<{
nodeId: NodeId;
treeId: string;
x: number;
y: number;
isPageRoot: boolean;
@@ -480,9 +481,12 @@ export function PreviewWorkspace({
event: ReactMouseEvent<HTMLDivElement>,
node: NonNullable<typeof tree>['root'],
isPageRoot: boolean,
treeId?: string,
) => {
if (!treeId) return;
setContextMenu({
nodeId: node.id,
treeId,
x: event.clientX,
y: event.clientY,
isPageRoot,
@@ -566,6 +570,7 @@ export function PreviewWorkspace({
) : null}
<UiTreeRenderer
tree={item}
treeId={item.src_ui_design}
showFrame={showFrame}
showComponent={showComponent}
hiddenNodeIds={canvas.hiddenNodeIds}
@@ -602,9 +607,15 @@ export function PreviewWorkspace({
isPageRoot={contextMenu.isPageRoot}
disabled={canvas.isLocked}
onClose={() => setContextMenu(null)}
onInsertChild={(nodeId) => canvas.insertNode(nodeId)}
onInsertSibling={(nodeId) => canvas.insertNodeAfter(nodeId)}
onDelete={(nodeId) => canvas.deleteNode(nodeId)}
onInsertChild={(nodeId) =>
canvas.insertNode(nodeId, contextMenu.treeId)
}
onInsertSibling={(nodeId) =>
canvas.insertNodeAfter(nodeId, contextMenu.treeId)
}
onDelete={(nodeId) =>
canvas.deleteNode(nodeId, contextMenu.treeId)
}
/>
) : null}
<div
@@ -29,6 +29,7 @@ type NodePointerDown = (
type UiTreeRendererProps = {
tree: UITree | null;
treeId?: string;
showFrame: boolean;
showComponent: boolean;
hiddenNodeIds: ReadonlySet<NodeId>;
@@ -41,6 +42,7 @@ type UiTreeRendererProps = {
event: ReactMouseEvent<HTMLDivElement>,
node: UiNode,
isPageRoot: boolean,
treeId?: string,
) => void;
onNodePointerDown: NodePointerDown;
onNodePointerMove: (event: ReactPointerEvent<HTMLDivElement>) => void;
@@ -81,6 +83,7 @@ const EMPTY_PREVIEW_TRANSFORMS: ReadonlyMap<
function RenderNode({
node,
treeId,
isRoot,
parentContainer,
showFrame,
@@ -173,7 +176,7 @@ function RenderNode({
event.preventDefault();
event.stopPropagation();
onSelectNode(node.id);
onNodeContextMenu(event, node, Boolean(isRoot));
onNodeContextMenu(event, node, Boolean(isRoot), treeId);
}}
onPointerDown={
receivesPointerGesture
@@ -206,6 +209,7 @@ function RenderNode({
<RenderNode
key={child.id}
node={child}
treeId={treeId}
parentContainer={
isContainer(node.layout.container)
? node.layout.container