|
| 1 | +/** |
| 2 | + * This story is here to showcase straight and curved arrows and double-arrows |
| 3 | + * renderers. |
| 4 | + */ |
| 5 | +import EdgeCurveProgram, { EdgeCurvedArrowProgram, EdgeCurvedDoubleArrowProgram } from "@sigma/edge-curve"; |
| 6 | +import { MultiGraph } from "graphology"; |
| 7 | +import Sigma from "sigma"; |
| 8 | +import { EdgeArrowProgram, EdgeDoubleArrowProgram, EdgeRectangleProgram } from "sigma/rendering"; |
| 9 | + |
| 10 | +export default () => { |
| 11 | + const container = document.getElementById("sigma-container") as HTMLElement; |
| 12 | + |
| 13 | + // Create a graph, with various parallel edges: |
| 14 | + const graph = new MultiGraph(); |
| 15 | + |
| 16 | + graph.addNode("a", { x: 0, y: 0, size: 10, label: "Alexandra" }); |
| 17 | + graph.addNode("b", { x: 1, y: -1, size: 20, label: "Bastian" }); |
| 18 | + graph.addNode("c", { x: 3, y: -2, size: 10, label: "Charles" }); |
| 19 | + graph.addNode("d", { x: 1, y: -3, size: 10, label: "Dorothea" }); |
| 20 | + graph.addNode("e", { x: 3, y: -4, size: 20, label: "Ernestine" }); |
| 21 | + graph.addNode("f", { x: 4, y: -5, size: 10, label: "Fabian" }); |
| 22 | + |
| 23 | + graph.addEdge("a", "b", { size: 5 }); |
| 24 | + graph.addEdge("b", "c", { size: 6, curved: true }); |
| 25 | + graph.addEdge("b", "d", { size: 5 }); |
| 26 | + graph.addEdge("c", "b", { size: 5, curved: true }); |
| 27 | + graph.addEdge("c", "e", { size: 9 }); |
| 28 | + graph.addEdge("d", "c", { size: 5, curved: true }); |
| 29 | + graph.addEdge("d", "e", { size: 5, curved: true }); |
| 30 | + graph.addEdge("e", "d", { size: 4, curved: true }); |
| 31 | + graph.addEdge("f", "e", { size: 7, curved: true }); |
| 32 | + |
| 33 | + const renderer = new Sigma(graph, container, { |
| 34 | + allowInvalidContainer: true, |
| 35 | + defaultEdgeType: "straightNoArrow", |
| 36 | + renderEdgeLabels: true, |
| 37 | + edgeProgramClasses: { |
| 38 | + straightNoArrow: EdgeRectangleProgram, |
| 39 | + curvedNoArrow: EdgeCurveProgram, |
| 40 | + straightArrow: EdgeArrowProgram, |
| 41 | + curvedArrow: EdgeCurvedArrowProgram, |
| 42 | + straightDoubleArrow: EdgeDoubleArrowProgram, |
| 43 | + curvedDoubleArrow: EdgeCurvedDoubleArrowProgram, |
| 44 | + }, |
| 45 | + }); |
| 46 | + |
| 47 | + // Add a form to play with arrow heads sides: |
| 48 | + const select = document.createElement("select") as HTMLSelectElement; |
| 49 | + select.style.fontFamily = "sans-serif"; |
| 50 | + select.style.position = "absolute"; |
| 51 | + select.style.top = "10px"; |
| 52 | + select.style.right = "10px"; |
| 53 | + select.style.padding = "10px"; |
| 54 | + select.innerHTML = ` |
| 55 | + <option value="NoArrow">No arrow</option> |
| 56 | + <option value="Arrow">Arrows</option> |
| 57 | + <option value="DoubleArrow">Double-sided arrows</option> |
| 58 | + `; |
| 59 | + select.value = "Arrow"; |
| 60 | + document.body.append(select); |
| 61 | + |
| 62 | + const refreshEdgeTypes = () => { |
| 63 | + const suffix = select.value; |
| 64 | + graph.forEachEdge((edge, { curved }) => |
| 65 | + graph.setEdgeAttribute(edge, "type", `${curved ? "curved" : "straight"}${suffix}`), |
| 66 | + ); |
| 67 | + }; |
| 68 | + refreshEdgeTypes(); |
| 69 | + select.addEventListener("change", refreshEdgeTypes); |
| 70 | + |
| 71 | + return () => { |
| 72 | + renderer.kill(); |
| 73 | + }; |
| 74 | +}; |
0 commit comments