From 9e30905e0a0f3d5d9efe04ca8f22f31d089a0a99 Mon Sep 17 00:00:00 2001 From: Krishna Subramanian Date: Fri, 9 Jun 2023 17:38:04 +0200 Subject: [PATCH] Add option to draw Sugiyama edges without triangles --- lib/layered/SugiyamaAlgorithm.dart | 2 +- lib/layered/SugiyamaConfiguration.dart | 2 ++ lib/layered/SugiyamaEdgeRenderer.dart | 31 ++++++++++++++++++-------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/layered/SugiyamaAlgorithm.dart b/lib/layered/SugiyamaAlgorithm.dart index 8e2a649..e03525d 100644 --- a/lib/layered/SugiyamaAlgorithm.dart +++ b/lib/layered/SugiyamaAlgorithm.dart @@ -16,7 +16,7 @@ class SugiyamaAlgorithm extends Algorithm { var nodeCount = 1; SugiyamaAlgorithm(this.configuration) { - renderer = SugiyamaEdgeRenderer(nodeData, edgeData, configuration.bendPointShape); + renderer = SugiyamaEdgeRenderer(nodeData, edgeData, configuration.bendPointShape, configuration.addTriangleToEdge); } int get dummyId => 'Dummy ${nodeCount++}'.hashCode; diff --git a/lib/layered/SugiyamaConfiguration.dart b/lib/layered/SugiyamaConfiguration.dart index 0bcc442..a8641b7 100644 --- a/lib/layered/SugiyamaConfiguration.dart +++ b/lib/layered/SugiyamaConfiguration.dart @@ -18,6 +18,8 @@ class SugiyamaConfiguration { BendPointShape bendPointShape = SharpBendPointShape(); CoordinateAssignment coordinateAssignment = CoordinateAssignment.Average; + bool addTriangleToEdge = true; + int getLevelSeparation() { return levelSeparation; } diff --git a/lib/layered/SugiyamaEdgeRenderer.dart b/lib/layered/SugiyamaEdgeRenderer.dart index a0dce24..a7ab267 100644 --- a/lib/layered/SugiyamaEdgeRenderer.dart +++ b/lib/layered/SugiyamaEdgeRenderer.dart @@ -4,8 +4,9 @@ class SugiyamaEdgeRenderer extends ArrowEdgeRenderer { Map nodeData; Map edgeData; BendPointShape bendPointShape; + bool addTriangleToEdge; - SugiyamaEdgeRenderer(this.nodeData, this.edgeData, this.bendPointShape); + SugiyamaEdgeRenderer(this.nodeData, this.edgeData, this.bendPointShape, this.addTriangleToEdge); var path = Path(); @@ -51,9 +52,6 @@ class SugiyamaEdgeRenderer extends ArrowEdgeRenderer { bendPoints[size - 4], bendPoints[size - 3], bendPoints[size - 2], bendPoints[size - 1], destination); } - final triangleCentroid = drawTriangle( - canvas, edgeTrianglePaint ?? trianglePaint, clippedLine[0], clippedLine[1], clippedLine[2], clippedLine[3]); - path.reset(); path.moveTo(bendPoints[0], bendPoints[1]); @@ -83,7 +81,16 @@ class SugiyamaEdgeRenderer extends ArrowEdgeRenderer { _drawSharpBendPointsEdge(bendPointsWithoutDuplication); } - path.lineTo(triangleCentroid[0], triangleCentroid[1]); + if (addTriangleToEdge) { + final triangleCentroid = drawTriangle( + canvas, edgeTrianglePaint ?? trianglePaint, clippedLine[0], clippedLine[1], clippedLine[2], clippedLine[3]); + + path.lineTo(triangleCentroid[0], triangleCentroid[1]); + } else { + final stopX = x1 + destination.width / 2; + final stopY = y1 + destination.height / 2; + path.lineTo(stopX, stopY); + } canvas.drawPath(path, currentPaint); } else { final startX = x + source.width / 2; @@ -93,11 +100,17 @@ class SugiyamaEdgeRenderer extends ArrowEdgeRenderer { clippedLine = clipLine(startX, startY, stopX, stopY, destination); - final triangleCentroid = drawTriangle( - canvas, edgeTrianglePaint ?? trianglePaint, clippedLine[0], clippedLine[1], clippedLine[2], clippedLine[3]); + if (addTriangleToEdge) { + final triangleCentroid = drawTriangle( + canvas, edgeTrianglePaint ?? trianglePaint, clippedLine[0], + clippedLine[1], clippedLine[2], clippedLine[3]); - canvas.drawLine( - Offset(clippedLine[0], clippedLine[1]), Offset(triangleCentroid[0], triangleCentroid[1]), currentPaint); + canvas.drawLine( + Offset(clippedLine[0], clippedLine[1]), Offset(triangleCentroid[0], triangleCentroid[1]), currentPaint); + } else { + canvas.drawLine( + Offset(clippedLine[0], clippedLine[1]), Offset(stopX, stopY), currentPaint); + } } }); }