Skip to content

Commit ed47a71

Browse files
committed
feat: 给两种不同模式的框选框的鼠标松开增加特效
1 parent d80c2bf commit ed47a71

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

app/src/core/service/controlService/rectangleSelectEngine/rectangleSelectEngine.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Project, service } from "@/core/Project";
22
import { Settings } from "@/core/service/Settings";
3+
import { RectangleFadeEffect } from "@/core/service/feedbackService/effectEngine/concrete/RectangleFadeEffect";
34
import { StageObject } from "@/core/stage/stageObject/abstract/StageObject";
45
import { Edge } from "@/core/stage/stageObject/association/Edge";
56
import { ImageNode } from "@/core/stage/stageObject/entity/ImageNode";
67
import { Section } from "@/core/stage/stageObject/entity/Section";
78
import { isMac } from "@/utils/platform";
8-
import { Vector } from "@graphif/data-structures";
9+
import { Color, ProgressNumber, Vector } from "@graphif/data-structures";
910
import { Rectangle } from "@graphif/shapes";
1011

1112
/**
@@ -102,6 +103,10 @@ export class RectangleSelect {
102103
* 相当于鼠标松开释放
103104
*/
104105
endSelecting() {
106+
// 保存当前框选矩形和模式,用于创建淡化特效
107+
const currentRectangle = this.selectingRectangle;
108+
const currentMode = this.getSelectMode();
109+
105110
// 将所有选择到的增加到上次选择的节点中
106111
this.project.controller.lastSelectedEntityUUID.clear();
107112
for (const node of this.project.stageManager.getEntities()) {
@@ -116,6 +121,28 @@ export class RectangleSelect {
116121
this.project.controller.lastSelectedEdgeUUID.add(edge.uuid);
117122
}
118123
}
124+
125+
// 添加框选矩形淡化消失特效
126+
if (currentRectangle) {
127+
const style = this.project.stageStyleManager.currentStyle;
128+
// 根据框选模式决定特效样式:
129+
// - 碰撞框选(intersect):只显示填充色,无边框
130+
// - 完全覆盖框选(contain):只显示边框色,无填充
131+
const isIntersectMode = currentMode === "intersect";
132+
const fillColor = isIntersectMode ? style.SelectRectangleFill.clone() : Color.Transparent;
133+
const strokeColor = isIntersectMode ? Color.Transparent : style.SelectRectangleBorder.toNewAlpha(1);
134+
const strokeWidth = isIntersectMode ? 0 : 1;
135+
136+
const effect = new RectangleFadeEffect(
137+
new ProgressNumber(0, 20),
138+
currentRectangle,
139+
fillColor,
140+
strokeColor,
141+
strokeWidth,
142+
);
143+
this.project.effects.addEffect(effect);
144+
}
145+
119146
this.selectingRectangle = null;
120147
}
121148

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Project } from "@/core/Project";
2+
import { Effect } from "@/core/service/feedbackService/effectEngine/effectObject";
3+
import { Color, mixColors, ProgressNumber } from "@graphif/data-structures";
4+
import { Rectangle } from "@graphif/shapes";
5+
6+
/**
7+
* 矩形淡化消失特效
8+
* 用于矩形区域的淡出效果,支持自定义填充色和边框色
9+
*/
10+
export class RectangleFadeEffect extends Effect {
11+
constructor(
12+
public override timeProgress: ProgressNumber,
13+
private rectangle: Rectangle,
14+
private fillColor: Color,
15+
private strokeColor: Color,
16+
private strokeWidth: number,
17+
) {
18+
super(timeProgress);
19+
}
20+
21+
render(project: Project) {
22+
const viewRectangle = project.renderer.transformWorld2View(this.rectangle);
23+
24+
project.shapeRenderer.renderRect(
25+
viewRectangle,
26+
mixColors(this.fillColor, Color.Transparent, this.timeProgress.rate),
27+
mixColors(this.strokeColor, Color.Transparent, this.timeProgress.rate),
28+
this.strokeWidth,
29+
);
30+
}
31+
}

0 commit comments

Comments
 (0)