Skip to content

Commit a6c8217

Browse files
committed
feat: 增加带边扩散选择的四个快捷键
1 parent 042e127 commit a6c8217

7 files changed

Lines changed: 174 additions & 0 deletions

File tree

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Project, service } from "@/core/Project";
22
import { RectangleTransformEffect } from "@/core/service/feedbackService/effectEngine/concrete/RectangleTransformEffect";
33
import { ConnectableEntity } from "@/core/stage/stageObject/abstract/ConnectableEntity";
4+
import { Edge } from "@/core/stage/stageObject/association/Edge";
45
import { Section } from "@/core/stage/stageObject/entity/Section";
56
import { Direction } from "@/types/directions";
67
import { Vector } from "@graphif/data-structures";
@@ -225,6 +226,63 @@ export class SelectChangeEngine {
225226
}
226227
}
227228

229+
/**
230+
* 扩散选择(节点和连线交替)
231+
* 正向:节点 -> 出边 -> 子节点
232+
* 反向:节点 -> 入边 -> 父节点
233+
*/
234+
expandSelectWithEdge(isKeepExpand = false, reversed: boolean = false) {
235+
if (!this.project.keyboardOnlyEngine.isOpenning()) {
236+
return;
237+
}
238+
239+
const selectedEntities = this.project.stageManager
240+
.getSelectedEntities()
241+
.filter((entity) => entity instanceof ConnectableEntity);
242+
const selectedEdges = this.project.stageManager
243+
.getSelectedAssociations()
244+
.filter((association) => association instanceof Edge);
245+
246+
if (selectedEntities.length === 0 && selectedEdges.length === 0) {
247+
return;
248+
}
249+
250+
const nextEntities = new Set<ConnectableEntity>();
251+
const nextEdges = new Set<Edge>();
252+
253+
if (reversed) {
254+
for (const selectedEntity of selectedEntities) {
255+
this.project.graphMethods.edgeParentArray(selectedEntity).map((edge) => nextEdges.add(edge));
256+
}
257+
for (const selectedEdge of selectedEdges) {
258+
nextEntities.add(selectedEdge.source);
259+
}
260+
} else {
261+
for (const selectedEntity of selectedEntities) {
262+
this.project.graphMethods.edgeChildrenArray(selectedEntity).map((edge) => nextEdges.add(edge));
263+
}
264+
for (const selectedEdge of selectedEdges) {
265+
nextEntities.add(selectedEdge.target);
266+
}
267+
}
268+
269+
if (!isKeepExpand) {
270+
for (const selectedEntity of selectedEntities) {
271+
selectedEntity.isSelected = false;
272+
}
273+
for (const selectedEdge of selectedEdges) {
274+
selectedEdge.isSelected = false;
275+
}
276+
}
277+
278+
for (const nextEntity of nextEntities) {
279+
nextEntity.isSelected = true;
280+
}
281+
for (const nextEdge of nextEdges) {
282+
nextEdge.isSelected = true;
283+
}
284+
}
285+
228286
private afterSelect(
229287
selectedNodeRect: ConnectableEntity,
230288
newSelectedConnectableEntity: ConnectableEntity | null,

app/src/core/service/controlService/shortcutKeysEngine/shortcutKeysRegister.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,6 +1471,46 @@ export const allKeyBinds: KeyBindItem[] = [
14711471
project!.selectChangeEngine.expandSelect(true, true);
14721472
},
14731473
},
1474+
{
1475+
id: "expandSelectEntityWithEdge",
1476+
defaultKey: "e C-w",
1477+
icon: Link,
1478+
when: whenKeyboardOnlyOpenWithSelectedStageObjects,
1479+
onPress: (project) => {
1480+
if (!project!.keyboardOnlyEngine.isOpenning()) return;
1481+
project!.selectChangeEngine.expandSelectWithEdge(false, false);
1482+
},
1483+
},
1484+
{
1485+
id: "expandSelectEntityReversedWithEdge",
1486+
defaultKey: "e C-S-w",
1487+
icon: Link,
1488+
when: whenKeyboardOnlyOpenWithSelectedStageObjects,
1489+
onPress: (project) => {
1490+
if (!project!.keyboardOnlyEngine.isOpenning()) return;
1491+
project!.selectChangeEngine.expandSelectWithEdge(false, true);
1492+
},
1493+
},
1494+
{
1495+
id: "expandSelectEntityKeepLastSelectedWithEdge",
1496+
defaultKey: "e C-A-w",
1497+
icon: Link,
1498+
when: whenKeyboardOnlyOpenWithSelectedStageObjects,
1499+
onPress: (project) => {
1500+
if (!project!.keyboardOnlyEngine.isOpenning()) return;
1501+
project!.selectChangeEngine.expandSelectWithEdge(true, false);
1502+
},
1503+
},
1504+
{
1505+
id: "expandSelectEntityReversedKeepLastSelectedWithEdge",
1506+
defaultKey: "e C-A-S-w",
1507+
icon: Link,
1508+
when: whenKeyboardOnlyOpenWithSelectedStageObjects,
1509+
onPress: (project) => {
1510+
if (!project!.keyboardOnlyEngine.isOpenning()) return;
1511+
project!.selectChangeEngine.expandSelectWithEdge(true, true);
1512+
},
1513+
},
14741514

14751515
/*------- 树/图 生成 -------*/
14761516
{

app/src/locales/en.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,6 +1653,26 @@ keyBinds:
16531653
If the current selection is graffiti, it will select entities touched by the graffiti.
16541654
If the current selection is an entity, it will select all graffiti that touch it.
16551655
Pressing multiple times will alternate the diffusion selection
1656+
expandSelectEntityWithEdge:
1657+
title: Expand Selection Across Nodes and Edges
1658+
description: |
1659+
Expands the selection step by step along graph connections.
1660+
In forward mode, each press alternates through "node -> outgoing edge -> child node".
1661+
expandSelectEntityReversedWithEdge:
1662+
title: Reverse Expand Selection Across Nodes and Edges
1663+
description: |
1664+
Expands the selection backward step by step along graph connections.
1665+
In reverse mode, each press alternates through "node -> incoming edge -> parent node".
1666+
expandSelectEntityKeepLastSelectedWithEdge:
1667+
title: Expand Selection Across Nodes and Edges (Keep Current Selection)
1668+
description: |
1669+
Expands the selection step by step along graph connections.
1670+
In forward mode, each press alternates through "node -> outgoing edge -> child node" while keeping the current selection.
1671+
expandSelectEntityReversedKeepLastSelectedWithEdge:
1672+
title: Reverse Expand Selection Across Nodes and Edges (Keep Current Selection)
1673+
description: |
1674+
Expands the selection backward step by step along graph connections.
1675+
In reverse mode, each press alternates through "node -> incoming edge -> parent node" while keeping the current selection.
16561676
clickAppMenuSettingsButton:
16571677
title: Open settings page
16581678
description: "When this key is pressed, the settings page opens without mouse\n"

app/src/locales/zh_CN.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,6 +1815,26 @@ keyBinds:
18151815
title: 反向扩散选择节点(保留当前节点的选择状态)
18161816
description: |
18171817
按下后,实体的选择状态会转移到父级节点上,同时保留当前节点的选择状态
1818+
expandSelectEntityWithEdge:
1819+
title: 扩散选择节点与连线
1820+
description: |
1821+
按下后,选择状态会沿着连线逐步扩散。
1822+
正向扩散时,会在“节点 -> 出边 -> 子节点”之间交替前进。
1823+
expandSelectEntityReversedWithEdge:
1824+
title: 反向扩散选择节点与连线
1825+
description: |
1826+
按下后,选择状态会沿着连线逐步反向扩散。
1827+
反向扩散时,会在“节点 -> 入边 -> 父节点”之间交替前进。
1828+
expandSelectEntityKeepLastSelectedWithEdge:
1829+
title: 扩散选择节点与连线(保留当前选择)
1830+
description: |
1831+
按下后,选择状态会沿着连线逐步扩散。
1832+
正向扩散时,会在“节点 -> 出边 -> 子节点”之间交替前进,同时保留当前选择。
1833+
expandSelectEntityReversedKeepLastSelectedWithEdge:
1834+
title: 反向扩散选择节点与连线(保留当前选择)
1835+
description: |
1836+
按下后,选择状态会沿着连线逐步反向扩散。
1837+
反向扩散时,会在“节点 -> 入边 -> 父节点”之间交替前进,同时保留当前选择。
18181838
CameraMoveUp:
18191839
title: 向上移动视野
18201840
description: 按下后,视野向上移动

app/src/locales/zh_TW.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,6 +1815,26 @@ keyBinds:
18151815
title: 反向擴散選擇節點(保留當前節點的選擇狀態)
18161816
description: |
18171817
按下後,實體的選擇狀態會轉移到父級節點上,同時保留當前節點的選擇狀態
1818+
expandSelectEntityWithEdge:
1819+
title: 擴散選擇節點與連線
1820+
description: |
1821+
按下後,選擇狀態會沿著連線逐步擴散。
1822+
正向擴散時,會在“節點 -> 出邊 -> 子節點”之間交替前進。
1823+
expandSelectEntityReversedWithEdge:
1824+
title: 反向擴散選擇節點與連線
1825+
description: |
1826+
按下後,選擇狀態會沿著連線逐步反向擴散。
1827+
反向擴散時,會在“節點 -> 入邊 -> 父節點”之間交替前進。
1828+
expandSelectEntityKeepLastSelectedWithEdge:
1829+
title: 擴散選擇節點與連線(保留當前選擇)
1830+
description: |
1831+
按下後,選擇狀態會沿著連線逐步擴散。
1832+
正向擴散時,會在“節點 -> 出邊 -> 子節點”之間交替前進,同時保留當前選擇。
1833+
expandSelectEntityReversedKeepLastSelectedWithEdge:
1834+
title: 反向擴散選擇節點與連線(保留當前選擇)
1835+
description: |
1836+
按下後,選擇狀態會沿著連線逐步反向擴散。
1837+
反向擴散時,會在“節點 -> 入邊 -> 父節點”之間交替前進,同時保留當前選擇。
18181838
CameraMoveUp:
18191839
title: 向上移動視野
18201840
description: 按下後,視野向上移動

app/src/locales/zh_TWC.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,6 +1739,18 @@ keyBinds:
17391739
expandSelectEntityReversedKeepLastSelected:
17401740
title: 反向擴散選擇節點(保留目前節點的選擇狀態)
17411741
description: 按下後,實體的選取狀態會轉移到父節點上,同時保留目前節點的選取狀態
1742+
expandSelectEntityWithEdge:
1743+
title: 擴散選擇節點與連線
1744+
description: 按下後,選取狀態會沿著連線逐步擴散。正向擴散時,會在「節點 -> 出邊 -> 子節點」之間交替前進。
1745+
expandSelectEntityReversedWithEdge:
1746+
title: 反向擴散選擇節點與連線
1747+
description: 按下後,選取狀態會沿著連線逐步反向擴散。反向擴散時,會在「節點 -> 入邊 -> 父節點」之間交替前進。
1748+
expandSelectEntityKeepLastSelectedWithEdge:
1749+
title: 擴散選擇節點與連線(保留目前選擇)
1750+
description: 按下後,選取狀態會沿著連線逐步擴散。正向擴散時,會在「節點 -> 出邊 -> 子節點」之間交替前進,同時保留目前選擇。
1751+
expandSelectEntityReversedKeepLastSelectedWithEdge:
1752+
title: 反向擴散選擇節點與連線(保留目前選擇)
1753+
description: 按下後,選取狀態會沿著連線逐步反向擴散。反向擴散時,會在「節點 -> 入邊 -> 父節點」之間交替前進,同時保留目前選擇。
17421754
CameraMoveUp:
17431755
title: 向上移動視野
17441756
description: 按下後,視野向上移動

app/src/sub/SettingsWindow/keybinds.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,10 @@ export const shortcutKeysGroups: ShortcutKeysGroup[] = [
673673
"expandSelectEntityReversed",
674674
"expandSelectEntityKeepLastSelected",
675675
"expandSelectEntityReversedKeepLastSelected",
676+
"expandSelectEntityWithEdge",
677+
"expandSelectEntityReversedWithEdge",
678+
"expandSelectEntityKeepLastSelectedWithEdge",
679+
"expandSelectEntityReversedKeepLastSelectedWithEdge",
676680
],
677681
},
678682
{

0 commit comments

Comments
 (0)