Skip to content

Commit 5e7c5fd

Browse files
committed
feat(树形引擎): 添加树形生长后的镜头行为选项
为树形深度生长和广度生长功能添加镜头行为设置选项,支持保持不动、移动至新节点或重置视野至整个树形结构
1 parent b64565b commit 5e7c5fd

File tree

6 files changed

+65
-4
lines changed

6 files changed

+65
-4
lines changed

app/src/core/service/Settings.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ export const settingsSchema = z.object({
128128
allowAddCycleEdge: z.boolean().default(false),
129129
autoLayoutWhenTreeGenerate: z.boolean().default(true),
130130
textNodeAutoFormatTreeWhenExitEdit: z.boolean().default(false),
131+
treeGenerateCameraBehavior: z
132+
.union([z.literal("none"), z.literal("moveToNewNode"), z.literal("resetToTree")])
133+
.default("moveToNewNode"),
131134
enableBackslashGenerateNodeInInput: z.boolean().default(false),
132135
gamepadDeadzone: z.number().min(0).max(1).default(0.1),
133136
showGrid: z.boolean().default(true),

app/src/core/service/SettingsIcons.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,5 @@ export const settingsIcons = {
164164
historyManagerMode: Undo,
165165
soundPitchVariationRange: ListMusic,
166166
textNodeAutoFormatTreeWhenExitEdit: ListTree,
167+
treeGenerateCameraBehavior: Fullscreen,
167168
};

app/src/core/service/controlService/keyboardOnlyEngine/keyboardOnlyTreeEngine.tsx

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,28 @@ export class KeyboardOnlyTreeEngine {
231231
},
232232
(1000 / 60) * 6,
233233
);
234-
// 重置视野
235-
this.project.camera.bombMove(newNode.collisionBox.getRectangle().center, 5);
234+
// 根据设置决定镜头行为
235+
switch (Settings.treeGenerateCameraBehavior) {
236+
case "none":
237+
// 镜头不动
238+
break;
239+
case "moveToNewNode":
240+
// 镜头移动向新创建的节点
241+
this.project.camera.bombMove(newNode.collisionBox.getRectangle().center, 5);
242+
break;
243+
case "resetToTree":
244+
// 重置视野,使视野覆盖当前树形结构的外接矩形
245+
if (rootNodeParents.length === 1) {
246+
const rootNodeParent = rootNodeParents[0];
247+
const allNodes = this.project.graphMethods.getSuccessorSet(rootNodeParent, true);
248+
const treeBoundingRect = Rectangle.getBoundingRectangle(
249+
allNodes.map((node) => node.collisionBox.getRectangle()),
250+
10, // 添加一些 padding
251+
);
252+
this.project.camera.resetByRectangle(treeBoundingRect);
253+
}
254+
break;
255+
}
236256
}
237257

238258
/**
@@ -331,8 +351,28 @@ export class KeyboardOnlyTreeEngine {
331351
},
332352
(1000 / 60) * 6,
333353
);
334-
// 重置视野
335-
this.project.camera.bombMove(newNode.collisionBox.getRectangle().center, 5);
354+
// 根据设置决定镜头行为
355+
switch (Settings.treeGenerateCameraBehavior) {
356+
case "none":
357+
// 镜头不动
358+
break;
359+
case "moveToNewNode":
360+
// 镜头移动向新创建的节点
361+
this.project.camera.bombMove(newNode.collisionBox.getRectangle().center, 5);
362+
break;
363+
case "resetToTree":
364+
// 重置视野,使视野覆盖当前树形结构的外接矩形
365+
if (rootNodeParents.length === 1) {
366+
const rootNodeParent = rootNodeParents[0];
367+
const allNodes = this.project.graphMethods.getSuccessorSet(rootNodeParent, true);
368+
const treeBoundingRect = Rectangle.getBoundingRectangle(
369+
allNodes.map((node) => node.collisionBox.getRectangle()),
370+
10, // 添加一些 padding
371+
);
372+
this.project.camera.resetByRectangle(treeBoundingRect);
373+
}
374+
break;
375+
}
336376
}
337377

338378
/**

app/src/locales/en.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,14 @@ settings:
453453
title: Auto Format Tree Structure When Exiting Edit Mode
454454
description: |
455455
Automatically formats the tree structure when a text node exits edit mode.
456+
treeGenerateCameraBehavior:
457+
title: Camera Behavior After Tree Node Generation
458+
description: |
459+
Set the camera behavior after creating new nodes using tree depth or breadth generation functions.
460+
options:
461+
none: Camera Remains Stationary
462+
moveToNewNode: Move Camera to New Node
463+
resetToTree: Reset View to Cover Entire Tree Structure
456464
enableDragAutoAlign:
457465
title: Enable Automatic Alignment When Dragging Nodes
458466
description: |

app/src/locales/zh_CN.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,14 @@ settings:
558558
title: 退出编辑模式时自动格式化树形结构
559559
description: |
560560
当文本节点退出编辑模式时,自动对其所在的树形结构进行格式化布局
561+
treeGenerateCameraBehavior:
562+
title: 树形生长节点后的镜头行为选项
563+
description: |
564+
设置在使用树形深度生长或广度生长功能创建新节点后,镜头的行为方式
565+
options:
566+
none: 镜头不动
567+
moveToNewNode: 镜头移动向新创建的节点
568+
resetToTree: 重置视野,使视野覆盖当前树形结构的外接矩形
561569
enableDragAutoAlign:
562570
title: 鼠标拖动自动吸附对齐节点
563571
description: |

app/src/sub/SettingsWindow/settings.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ const categories = {
276276
"autoLayoutWhenTreeGenerate",
277277
"enableBackslashGenerateNodeInInput",
278278
"textNodeAutoFormatTreeWhenExitEdit",
279+
"treeGenerateCameraBehavior",
279280
],
280281
gamepad: ["gamepadDeadzone"],
281282
},

0 commit comments

Comments
 (0)