-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathedge.js
95 lines (72 loc) · 2.82 KB
/
edge.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* SPDX-License-Identifier: GPL-3.0-only */
'use strict';
import { translationMat, EMPTY_TRANSLATION_MAT } from "../events/event";
import { EdgeLine } from "./line";
import { EdgeSerializable } from "../serialization/serialize";
export class Edge {
static SELECTED_CLASS = 'selected';
constructor(vertexHolderA, vertexHolderB) {
this.vertexHolderA = vertexHolderA;
this.vertexHolderB = vertexHolderB;
this.drawingContext = null;
}
draw(graph) {
// group drawing context
this.drawingContext = graph.svgMainG.append("g").classed('edge', true);
const vertexA = this.vertexHolderA.vertex;
const vertexB = this.vertexHolderB.vertex;
const connectorA = this.vertexHolderA.connector;
const connectorB = this.vertexHolderB.connector;
const translateA = translationMat(vertexA.drawingContext.node());
const translateB = translationMat(vertexB.drawingContext.node());
connectorA.setSelected(true);
connectorB.setSelected(true);
let bboxVertA = connectorA.edgeConnectorEl.node().getBBox();
let bboxVertB = connectorB.edgeConnectorEl.node().getBBox();
let line = new EdgeLine(this.drawingContext, EMPTY_TRANSLATION_MAT);
line.draw(
// pointer1
{
x: bboxVertA.x + translateA.e + (bboxVertA.width / 2),
y: bboxVertA.y + translateA.f + (bboxVertA.height / 2),
},
// pointer2
{
x: bboxVertB.x + translateB.e + (bboxVertB.width / 2),
y: bboxVertB.y + translateB.f + (bboxVertB.height / 2),
},
);
// add support for selecting invididual edges
this.setupClickEvents(graph);
}
setupClickEvents(graph) {
this.drawingContext.on('click', (event) => {
event.stopPropagation();
/* ignore event if graph is in readOnly mode */
if(graph.readOnly) return;
this.setSelected(!this.isSelected());
});
}
setSelected(value){
this.drawingContext.classed(Edge.SELECTED_CLASS, value);
}
isSelected() {
return this.drawingContext.classed(Edge.SELECTED_CLASS);
}
remove() {
if (this.drawingContext) {
// deselect (sigh) edge connectors of vertices involved
const connectorA = this.vertexHolderA.connector;
const connectorB = this.vertexHolderB.connector;
connectorA.setSelected(false);
connectorB.setSelected(false);
this.drawingContext.remove();
}
}
serialize() {
return new EdgeSerializable(
this.vertexHolderA.connector._uuid,
this.vertexHolderB.connector._uuid
);
}
}