data/RelationGraphRoutes.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "RelationGraphRoutes.h" | ||
| 2 | |||
| 3 | #include "RelationGraphRows.h" | ||
| 4 | #include "RelationVocabulary.h" | ||
| 5 | |||
| 6 | #include <QHash> | ||
| 7 | #include <QSet> | ||
| 8 | #include <cmath> | ||
| 9 | #include <numeric> | ||
| 10 | #include <vector> | ||
| 11 | |||
| 12 | namespace RelationGraphLayout { | ||
| 13 | |||
| 14 | namespace { | ||
| 15 | |||
| 16 |
3/4✓ Branch 2 → 3 taken 601496 times.
✓ Branch 2 → 5 taken 408 times.
✓ Branch 3 → 4 taken 601496 times.
✗ Branch 3 → 5 not taken.
|
601904 | bool isDrawn(const RelationGraph::Node &node) { return !node.family && node.moreCount == 0; } |
| 17 | |||
| 18 | 11840 | bool isSibling(const RelationGraph::Edge &edge) { | |
| 19 |
6/6✓ Branch 4 → 5 taken 2271 times.
✓ Branch 4 → 8 taken 9569 times.
✓ Branch 7 → 8 taken 1918 times.
✓ Branch 7 → 13 taken 353 times.
✓ Branch 11 → 12 taken 2146 times.
✓ Branch 11 → 13 taken 9341 times.
|
23327 | return (edge.kind == QLatin1String("relation") || edge.kind == QLatin1String("inferred")) && |
| 20 |
3/5✓ Branch 9 → 10 taken 11487 times.
✓ Branch 14 → 15 taken 11487 times.
✓ Branch 14 → 16 taken 353 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
|
23327 | RelationVocabulary::canonical(edge.type) == QLatin1String("sibling"); |
| 21 | } | ||
| 22 | |||
| 23 | 7422 | bool isStructural(const RelationGraph::Edge &edge) { | |
| 24 |
6/6✓ Branch 3 → 4 taken 5538 times.
✓ Branch 3 → 8 taken 1884 times.
✓ Branch 5 → 6 taken 4660 times.
✓ Branch 5 → 8 taken 878 times.
✓ Branch 7 → 8 taken 1172 times.
✓ Branch 7 → 9 taken 3488 times.
|
7422 | return isParentEdge(edge) || isPartnerEdge(edge) || isSibling(edge); |
| 25 | } | ||
| 26 | |||
| 27 | struct UnionFind { | ||
| 28 | std::vector<int> parent; | ||
| 29 |
1/1✓ Branch 4 → 5 taken 186 times.
|
558 | explicit UnionFind(int n) : parent(size_t(n)) { std::iota(parent.begin(), parent.end(), 0); } |
| 30 | 12088 | int find(int i) { | |
| 31 |
2/2✓ Branch 8 → 3 taken 9312 times.
✓ Branch 8 → 9 taken 12088 times.
|
21400 | while (parent[size_t(i)] != i) |
| 32 | 9312 | i = parent[size_t(i)] = parent[size_t(parent[size_t(i)])]; | |
| 33 | 12088 | return i; | |
| 34 | } | ||
| 35 | 5494 | void unite(int a, int b) { parent[size_t(find(a))] = find(b); } | |
| 36 | }; | ||
| 37 | |||
| 38 | 38316 | QPointF onCurve(QPointF a, QPointF control, QPointF b, double t) { | |
| 39 | 38316 | return (1 - t) * (1 - t) * a + 2 * (1 - t) * t * control + t * t * b; | |
| 40 | } | ||
| 41 | |||
| 42 | // The people (avatar and name below it) a line through `points` touches, ends excluded. | ||
| 43 | 3008 | int collisions(const RelationGraph::Graph &graph, const QList<QPointF> &positions, const QList<QPointF> &points, | |
| 44 | int a, int b) { | ||
| 45 | 3008 | QSet<int> hit; | |
| 46 | 3008 | double left = points.first().x(), right = left, top = points.first().y(), bottom = top; | |
| 47 |
2/2✓ Branch 20 → 9 taken 39114 times.
✓ Branch 20 → 21 taken 3008 times.
|
42122 | for (const QPointF &p : points) { |
| 48 | 39114 | left = std::min(left, p.x()); | |
| 49 | 39114 | right = std::max(right, p.x()); | |
| 50 | 39114 | top = std::min(top, p.y()); | |
| 51 | 39114 | bottom = std::max(bottom, p.y()); | |
| 52 | } | ||
| 53 |
2/2✓ Branch 78 → 22 taken 337671 times.
✓ Branch 78 → 79 taken 3008 times.
|
340679 | for (int i = 0; i < graph.nodes.size(); ++i) { |
| 54 |
1/1✓ Branch 22 → 23 taken 337671 times.
|
337671 | const QPointF centre = positions.value(i); |
| 55 |
8/8✓ Branch 24 → 25 taken 331655 times.
✓ Branch 24 → 36 taken 3008 times.
✓ Branch 27 → 28 taken 331307 times.
✓ Branch 27 → 36 taken 348 times.
✓ Branch 29 → 30 taken 233226 times.
✓ Branch 29 → 36 taken 98081 times.
✓ Branch 31 → 32 taken 113175 times.
✓ Branch 31 → 36 taken 120051 times.
|
334663 | if (i == a || i == b || !isDrawn(graph.nodes.at(i)) || centre.x() < left - 50 || centre.x() > right + 50 || |
| 56 |
8/8✓ Branch 23 → 24 taken 334663 times.
✓ Branch 23 → 36 taken 3008 times.
✓ Branch 33 → 34 taken 82141 times.
✓ Branch 33 → 36 taken 31034 times.
✓ Branch 35 → 36 taken 34675 times.
✓ Branch 35 → 37 taken 47466 times.
✓ Branch 38 → 39 taken 290205 times.
✓ Branch 38 → 40 taken 47466 times.
|
672334 | centre.y() < top - 46 || centre.y() > bottom + 22) |
| 57 | 290205 | continue; | |
| 58 |
2/2✓ Branch 74 → 41 taken 761828 times.
✓ Branch 74 → 75 taken 47466 times.
|
809294 | for (int k = 0; k + 1 < points.size(); ++k) { |
| 59 | // Samples every 12 px along the segment. | ||
| 60 | 761828 | const QPointF from = points.at(k), to = points.at(k + 1); | |
| 61 | 761828 | const int steps = std::max(1, int(std::hypot(to.x() - from.x(), to.y() - from.y()) / 12)); | |
| 62 |
6/6✓ Branch 66 → 67 taken 10156777 times.
✓ Branch 66 → 70 taken 719352 times.
✓ Branch 68 → 69 taken 10114301 times.
✓ Branch 68 → 70 taken 42476 times.
✓ Branch 71 → 49 taken 10114301 times.
✓ Branch 71 → 72 taken 761828 times.
|
10876129 | for (int s = 0; s <= steps && !hit.contains(i); ++s) { |
| 63 | 10114301 | const QPointF d = from + (to - from) * (double(s) / steps) - centre; | |
| 64 |
8/8✓ Branch 55 → 56 taken 535031 times.
✓ Branch 55 → 61 taken 9579270 times.
✓ Branch 57 → 58 taken 271790 times.
✓ Branch 57 → 61 taken 263241 times.
✓ Branch 59 → 60 taken 5130 times.
✓ Branch 59 → 61 taken 266660 times.
✓ Branch 62 → 63 taken 5130 times.
✓ Branch 62 → 65 taken 10109171 times.
|
10114301 | if (std::abs(d.x()) < 50 && d.y() > -22 && d.y() < 46) |
| 65 |
1/1✓ Branch 63 → 64 taken 5130 times.
|
5130 | hit.insert(i); |
| 66 | } | ||
| 67 | } | ||
| 68 | } | ||
| 69 | 6016 | return int(hit.size()); | |
| 70 | 3008 | } | |
| 71 | |||
| 72 | 2138 | Route straightOrBent(const RelationGraph::Graph &graph, const QList<QPointF> &positions, int a, int b) { | |
| 73 |
2/2✓ Branch 2 → 3 taken 2138 times.
✓ Branch 3 → 4 taken 2138 times.
|
2138 | const QPointF pa = positions.value(a), pb = positions.value(b); |
| 74 |
1/3✓ Branch 7 → 8 taken 2138 times.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
|
4276 | Route best{QStringLiteral("line"), {pa, pb}}; |
| 75 | // Large overviews keep straight lines (each bend costs a collision test). | ||
| 76 |
2/2✓ Branch 10 → 11 taken 872 times.
✓ Branch 10 → 12 taken 1266 times.
|
2138 | if (graph.nodes.size() > 400) |
| 77 | 872 | return best; | |
| 78 |
1/1✓ Branch 12 → 13 taken 1266 times.
|
1266 | int bestHits = collisions(graph, positions, best.points, a, b); |
| 79 | 1266 | const QPointF d = pb - pa; | |
| 80 | 1266 | const double length = std::hypot(d.x(), d.y()); | |
| 81 |
3/4✓ Branch 16 → 17 taken 584 times.
✓ Branch 16 → 18 taken 682 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 584 times.
|
1266 | if (bestHits == 0 || length < 1) |
| 82 | 682 | return best; | |
| 83 | 584 | const QPointF normal(-d.y() / length, d.x() / length); | |
| 84 |
2/2✓ Branch 47 → 24 taken 1742 times.
✓ Branch 47 → 48 taken 318 times.
|
2060 | for (const double bend : {0.25, -0.25, 0.5, -0.5}) { |
| 85 |
1/3✓ Branch 31 → 32 taken 1742 times.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 64 not taken.
|
3484 | const Route curve{QStringLiteral("curve"), {pa, (pa + pb) / 2 + normal * (bend * length), pb}}; |
| 86 |
2/2✓ Branch 33 → 34 taken 1742 times.
✓ Branch 34 → 35 taken 1742 times.
|
1742 | const int hits = collisions(graph, positions, flatten(curve), a, b); |
| 87 |
2/2✓ Branch 36 → 37 taken 487 times.
✓ Branch 36 → 39 taken 1255 times.
|
1742 | if (hits < bestHits) { |
| 88 | 487 | best = curve; | |
| 89 | 487 | bestHits = hits; | |
| 90 | } | ||
| 91 |
2/2✓ Branch 39 → 40 taken 266 times.
✓ Branch 39 → 41 taken 1476 times.
|
1742 | if (bestHits == 0) |
| 92 | 266 | break; | |
| 93 | 1742 | } | |
| 94 | 584 | return best; | |
| 95 | ✗ | } | |
| 96 | |||
| 97 | } // namespace | ||
| 98 | |||
| 99 | 160 | Route busRoute(QPointF from, QPointF to, double busY, double spineX) { | |
| 100 |
1/1✓ Branch 7 → 8 taken 160 times.
|
160 | QList<QPointF> points{from, {from.x(), busY}, {spineX, busY}, {spineX, to.y()}, to}; |
| 101 | // Drop repeated corners (a person on the bus itself, a spine through the start). | ||
| 102 | 160 | QList<QPointF> simple; | |
| 103 |
4/4✓ Branch 8 → 9 taken 160 times.
✓ Branch 9 → 10 taken 160 times.
✓ Branch 27 → 11 taken 800 times.
✓ Branch 27 → 28 taken 160 times.
|
960 | for (const QPointF &p : points) |
| 104 |
6/8✓ Branch 13 → 14 taken 640 times.
✓ Branch 13 → 21 taken 160 times.
✓ Branch 15 → 16 taken 640 times.
✓ Branch 18 → 19 taken 640 times.
✓ Branch 20 → 21 taken 640 times.
✗ Branch 20 → 22 not taken.
✓ Branch 23 → 24 taken 800 times.
✗ Branch 23 → 25 not taken.
|
800 | if (simple.isEmpty() || std::hypot(p.x() - simple.last().x(), p.y() - simple.last().y()) > 0.5) |
| 105 |
1/1✓ Branch 24 → 25 taken 800 times.
|
800 | simple.append(p); |
| 106 |
2/4✓ Branch 38 → 39 taken 160 times.
✗ Branch 38 → 40 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 42 taken 160 times.
|
320 | return {simple.size() == 2 ? QStringLiteral("line") : QStringLiteral("elbow"), simple}; |
| 107 | 480 | } | |
| 108 | |||
| 109 | 8141 | QList<QPointF> flatten(const Route &route) { | |
| 110 |
5/6✓ Branch 4 → 5 taken 33 times.
✓ Branch 4 → 8 taken 8108 times.
✓ Branch 6 → 7 taken 33 times.
✗ Branch 6 → 8 not taken.
✓ Branch 9 → 10 taken 33 times.
✓ Branch 9 → 26 taken 8108 times.
|
8141 | if (route.shape == QLatin1String("bundle") && route.points.size() == 6) { |
| 111 | 33 | const QList<QPointF> &p = route.points; | |
| 112 | ✗ | QList<QPointF> out; // the way into the trunk (0…10), then the way out (11…21) | |
| 113 |
2/2✓ Branch 22 → 11 taken 726 times.
✓ Branch 22 → 23 taken 33 times.
|
759 | for (int s = 0; s <= 21; ++s) |
| 114 |
3/3✓ Branch 11 → 12 taken 363 times.
✓ Branch 11 → 16 taken 363 times.
✓ Branch 20 → 21 taken 726 times.
|
726 | out.append(s <= 10 ? onCurve(p.at(0), p.at(1), p.at(2), s / 10.0) : onCurve(p.at(3), p.at(4), p.at(5), (s - 11) / 10.0)); |
| 115 |
1/2✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 33 times.
|
33 | return out; |
| 116 | ✗ | } | |
| 117 |
5/6✓ Branch 28 → 29 taken 1790 times.
✓ Branch 28 → 31 taken 6318 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 1790 times.
✓ Branch 33 → 34 taken 6318 times.
✓ Branch 33 → 36 taken 1790 times.
|
8108 | if (route.shape != QLatin1String("curve") || route.points.size() != 3) |
| 118 | 6318 | return route.points; | |
| 119 | 1790 | QList<QPointF> out; | |
| 120 |
2/2✓ Branch 43 → 37 taken 37590 times.
✓ Branch 43 → 44 taken 1790 times.
|
39380 | for (int s = 0; s <= 20; ++s) |
| 121 |
1/1✓ Branch 41 → 42 taken 37590 times.
|
37590 | out.append(onCurve(route.points.at(0), route.points.at(1), route.points.at(2), s / 20.0)); |
| 122 | 1790 | return out; | |
| 123 | 1790 | } | |
| 124 | |||
| 125 | 93 | QList<Route> routes(const RelationGraph::Graph &graph, const QList<QPointF> &positions) { | |
| 126 | 93 | const int n = int(graph.nodes.size()); | |
| 127 | // Parents and partners as drawn: the parent is the one higher up. | ||
| 128 | 93 | QHash<int, QSet<int>> parentsOf, partnersOf; | |
| 129 |
2/2✓ Branch 34 → 5 taken 4237 times.
✓ Branch 34 → 35 taken 93 times.
|
4330 | for (const RelationGraph::Edge &e : graph.edges) { |
| 130 |
3/6✓ Branch 6 → 7 taken 4237 times.
✗ Branch 6 → 9 not taken.
✓ Branch 7 → 8 taken 4237 times.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 4237 times.
|
4237 | if (e.from < 0 || e.to < 0 || e.from == e.to) |
| 131 | ✗ | continue; | |
| 132 |
3/3✓ Branch 10 → 11 taken 4237 times.
✓ Branch 11 → 12 taken 790 times.
✓ Branch 11 → 25 taken 3447 times.
|
4237 | if (isParentEdge(e)) { |
| 133 |
2/2✓ Branch 12 → 13 taken 790 times.
✓ Branch 14 → 15 taken 790 times.
|
790 | const bool fromAbove = positions.value(e.from).y() < positions.value(e.to).y(); |
| 134 |
6/6✓ Branch 16 → 17 taken 38 times.
✓ Branch 16 → 18 taken 752 times.
✓ Branch 19 → 20 taken 790 times.
✓ Branch 20 → 21 taken 38 times.
✓ Branch 20 → 22 taken 752 times.
✓ Branch 23 → 24 taken 790 times.
|
790 | parentsOf[fromAbove ? e.to : e.from].insert(fromAbove ? e.from : e.to); |
| 135 |
3/3✓ Branch 25 → 26 taken 3447 times.
✓ Branch 26 → 27 taken 439 times.
✓ Branch 26 → 32 taken 3008 times.
|
3447 | } else if (isPartnerEdge(e)) { |
| 136 |
2/2✓ Branch 27 → 28 taken 439 times.
✓ Branch 28 → 29 taken 439 times.
|
439 | partnersOf[e.from].insert(e.to); |
| 137 |
2/2✓ Branch 29 → 30 taken 439 times.
✓ Branch 30 → 31 taken 439 times.
|
439 | partnersOf[e.to].insert(e.from); |
| 138 | } | ||
| 139 | } | ||
| 140 | // Who is connected by drawn lines without the relationships that only follow from others. | ||
| 141 |
2/2✓ Branch 35 → 36 taken 93 times.
✓ Branch 36 → 37 taken 93 times.
|
93 | UnionFind connected(n), tree(n); |
| 142 |
2/2✓ Branch 65 → 39 taken 4237 times.
✓ Branch 65 → 66 taken 93 times.
|
4330 | for (const RelationGraph::Edge &e : graph.edges) { |
| 143 |
4/8✓ Branch 40 → 41 taken 4237 times.
✗ Branch 40 → 44 not taken.
✓ Branch 41 → 42 taken 4237 times.
✗ Branch 41 → 44 not taken.
✓ Branch 42 → 43 taken 4237 times.
✗ Branch 42 → 44 not taken.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 4237 times.
|
4237 | if (e.from < 0 || e.to < 0 || e.from >= n || e.to >= n) |
| 144 | ✗ | continue; | |
| 145 |
4/4✓ Branch 47 → 48 taken 4202 times.
✓ Branch 47 → 57 taken 35 times.
✓ Branch 50 → 51 taken 4195 times.
✓ Branch 50 → 57 taken 7 times.
|
8432 | if (e.kind != QLatin1String("member") && e.kind != QLatin1String("suggestion") && |
| 146 |
7/7✓ Branch 53 → 54 taken 668 times.
✓ Branch 53 → 56 taken 3527 times.
✓ Branch 54 → 55 taken 668 times.
✓ Branch 55 → 56 taken 185 times.
✓ Branch 55 → 57 taken 483 times.
✓ Branch 58 → 59 taken 3712 times.
✓ Branch 58 → 60 taken 525 times.
|
8432 | (e.kind != QLatin1String("inferred") || isStructural(e))) |
| 147 | 3712 | connected.unite(e.from, e.to); | |
| 148 |
3/3✓ Branch 60 → 61 taken 4237 times.
✓ Branch 61 → 62 taken 1782 times.
✓ Branch 61 → 63 taken 2455 times.
|
4237 | if (isStructural(e)) // the family tree's own lines: parents, partners, siblings |
| 149 | 1782 | tree.unite(e.from, e.to); | |
| 150 | } | ||
| 151 | 93 | QList<Route> out; | |
| 152 |
2/2✓ Branch 295 → 68 taken 4237 times.
✓ Branch 295 → 296 taken 93 times.
|
4330 | for (const RelationGraph::Edge &e : graph.edges) { |
| 153 | 8474 | const Route none{QStringLiteral("none"), {}}; | |
| 154 |
6/10✓ Branch 74 → 75 taken 4237 times.
✗ Branch 74 → 87 not taken.
✓ Branch 75 → 76 taken 4237 times.
✗ Branch 75 → 87 not taken.
✓ Branch 76 → 77 taken 4237 times.
✗ Branch 76 → 87 not taken.
✓ Branch 77 → 78 taken 4237 times.
✗ Branch 77 → 87 not taken.
✓ Branch 80 → 81 taken 4202 times.
✓ Branch 80 → 87 taken 35 times.
|
4237 | if (e.from < 0 || e.to < 0 || e.from >= n || e.to >= n || e.from == e.to || e.kind == QLatin1String("member") || |
| 155 |
5/8✓ Branch 73 → 74 taken 4237 times.
✗ Branch 73 → 87 not taken.
✓ Branch 83 → 84 taken 4202 times.
✗ Branch 83 → 87 not taken.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 88 taken 4202 times.
✓ Branch 89 → 90 taken 35 times.
✓ Branch 89 → 92 taken 4202 times.
|
8474 | !isDrawn(graph.nodes.at(e.from)) || !isDrawn(graph.nodes.at(e.to))) { |
| 156 |
1/1✓ Branch 90 → 91 taken 35 times.
|
35 | out.append(none); |
| 157 | 35 | continue; | |
| 158 | } | ||
| 159 |
8/9✓ Branch 94 → 95 taken 668 times.
✓ Branch 94 → 101 taken 3534 times.
✓ Branch 95 → 96 taken 668 times.
✓ Branch 96 → 97 taken 483 times.
✓ Branch 96 → 101 taken 185 times.
✓ Branch 99 → 100 taken 483 times.
✗ Branch 99 → 101 not taken.
✓ Branch 102 → 103 taken 483 times.
✓ Branch 102 → 105 taken 3719 times.
|
4202 | if (e.kind == QLatin1String("inferred") && !isStructural(e) && connected.find(e.from) == connected.find(e.to)) { |
| 160 |
1/1✓ Branch 103 → 104 taken 483 times.
|
483 | out.append(none); |
| 161 | 483 | continue; | |
| 162 | } | ||
| 163 | // Wider family (aunt, in-law, cousin, grandparent, …), stored or inferred: the tree | ||
| 164 | // already joins the two, so the line would only cross it; the person's | ||
| 165 | // role, the tooltip and the list still say it. | ||
| 166 |
4/5✓ Branch 108 → 109 taken 1849 times.
✓ Branch 109 → 110 taken 67 times.
✓ Branch 109 → 120 taken 1782 times.
✗ Branch 112 → 113 not taken.
✓ Branch 112 → 116 taken 67 times.
|
5635 | if (e.category == QLatin1String("family") && !isStructural(e) && |
| 167 |
6/8✓ Branch 107 → 108 taken 1849 times.
✓ Branch 107 → 120 taken 1870 times.
✗ Branch 115 → 116 not taken.
✗ Branch 115 → 120 not taken.
✓ Branch 118 → 119 taken 63 times.
✓ Branch 118 → 120 taken 4 times.
✓ Branch 121 → 122 taken 63 times.
✓ Branch 121 → 124 taken 3656 times.
|
5635 | (e.kind == QLatin1String("relation") || e.kind == QLatin1String("inferred")) && |
| 168 | 67 | tree.find(e.from) == tree.find(e.to)) { | |
| 169 |
1/1✓ Branch 122 → 123 taken 63 times.
|
63 | out.append(none); |
| 170 | 63 | continue; | |
| 171 | } | ||
| 172 |
12/16✓ Branch 124 → 125 taken 3656 times.
✓ Branch 125 → 126 taken 553 times.
✓ Branch 125 → 131 taken 3103 times.
✓ Branch 128 → 129 taken 553 times.
✓ Branch 129 → 130 taken 132 times.
✓ Branch 129 → 131 taken 421 times.
✓ Branch 132 → 133 taken 553 times.
✓ Branch 132 → 134 taken 3103 times.
✓ Branch 134 → 135 taken 553 times.
✓ Branch 134 → 136 taken 3103 times.
✓ Branch 136 → 137 taken 132 times.
✓ Branch 136 → 139 taken 3524 times.
✗ Branch 316 → 317 not taken.
✗ Branch 316 → 318 not taken.
✗ Branch 320 → 321 not taken.
✗ Branch 320 → 322 not taken.
|
3656 | if (isSibling(e) && parentsOf.value(e.from).intersects(parentsOf.value(e.to))) { |
| 173 |
1/1✓ Branch 137 → 138 taken 132 times.
|
132 | out.append(none); // the tree shows them as children of one parent |
| 174 | 132 | continue; | |
| 175 | } | ||
| 176 |
2/2✓ Branch 139 → 140 taken 3524 times.
✓ Branch 140 → 141 taken 3524 times.
|
3524 | const QPointF pa = positions.value(e.from), pb = positions.value(e.to); |
| 177 |
7/7✓ Branch 141 → 142 taken 3524 times.
✓ Branch 142 → 143 taken 421 times.
✓ Branch 142 → 148 taken 3103 times.
✓ Branch 146 → 147 taken 404 times.
✓ Branch 146 → 148 taken 17 times.
✓ Branch 149 → 150 taken 404 times.
✓ Branch 149 → 163 taken 3120 times.
|
3524 | if (isSibling(e) && std::abs(pa.y() - pb.y()) < 1) { |
| 178 | // Siblings without a shown parent hang from one bar above the row, as | ||
| 179 | // children hang from their parents' line; it passes above the avatars | ||
| 180 | // in between and never through a name. | ||
| 181 | 404 | const double barY = pa.y() - SiblingBarHeight; | |
| 182 | 404 | out.append({QStringLiteral("elbow"), {pa, {pa.x(), barY}, {pb.x(), barY}, pb}}); | |
| 183 | 404 | continue; | |
| 184 | 404 | } | |
| 185 |
7/7✓ Branch 163 → 164 taken 3120 times.
✓ Branch 164 → 165 taken 790 times.
✓ Branch 164 → 171 taken 2330 times.
✓ Branch 169 → 170 taken 777 times.
✓ Branch 169 → 171 taken 13 times.
✓ Branch 172 → 173 taken 777 times.
✓ Branch 172 → 236 taken 2343 times.
|
3120 | if (isParentEdge(e) && std::abs(std::abs(pa.y() - pb.y()) - TreeRowHeight) < 1) { |
| 186 |
2/2✓ Branch 175 → 176 taken 34 times.
✓ Branch 175 → 177 taken 743 times.
|
777 | const int parent = pa.y() < pb.y() ? e.from : e.to; |
| 187 |
2/2✓ Branch 178 → 179 taken 34 times.
✓ Branch 178 → 180 taken 743 times.
|
777 | const int child = parent == e.from ? e.to : e.from; |
| 188 |
1/1✓ Branch 181 → 182 taken 777 times.
|
777 | QPointF start = positions.value(parent); |
| 189 |
4/4✓ Branch 183 → 184 taken 777 times.
✓ Branch 184 → 185 taken 777 times.
✓ Branch 206 → 186 taken 448 times.
✓ Branch 206 → 207 taken 491 times.
|
939 | for (int partner : partnersOf.value(parent)) // a couple's children hang from the partner line |
| 190 |
7/11✓ Branch 189 → 190 taken 286 times.
✓ Branch 189 → 196 taken 162 times.
✓ Branch 190 → 191 taken 286 times.
✓ Branch 194 → 195 taken 286 times.
✗ Branch 194 → 196 not taken.
✓ Branch 197 → 198 taken 448 times.
✗ Branch 197 → 199 not taken.
✓ Branch 199 → 200 taken 286 times.
✓ Branch 199 → 204 taken 162 times.
✗ Branch 338 → 339 not taken.
✗ Branch 338 → 340 not taken.
|
448 | if (parentsOf.value(child).contains(partner) && std::abs(positions.value(partner).y() - start.y()) < 1) { |
| 191 |
1/1✓ Branch 200 → 201 taken 286 times.
|
286 | start = (start + positions.value(partner)) / 2; |
| 192 | 286 | break; | |
| 193 | 777 | } | |
| 194 |
1/1✓ Branch 208 → 209 taken 777 times.
|
777 | const QPointF end = positions.value(child); |
| 195 | 777 | const double busY = end.y() - DescentBarHeight; | |
| 196 |
1/1✓ Branch 228 → 229 taken 777 times.
|
1554 | out.append(std::abs(start.x() - end.x()) < 0.5 |
| 197 |
3/13✓ Branch 213 → 214 taken 318 times.
✓ Branch 213 → 219 taken 459 times.
✓ Branch 217 → 218 taken 318 times.
✗ Branch 362 → 363 not taken.
✗ Branch 362 → 365 not taken.
✗ Branch 363 → 364 not taken.
✗ Branch 363 → 365 not taken.
✗ Branch 367 → 368 not taken.
✗ Branch 367 → 370 not taken.
✗ Branch 368 → 369 not taken.
✗ Branch 368 → 370 not taken.
✗ Branch 371 → 372 not taken.
✗ Branch 371 → 373 not taken.
|
2190 | ? Route{QStringLiteral("line"), {start, end}} |
| 198 |
5/15✓ Branch 226 → 227 taken 459 times.
✓ Branch 230 → 231 taken 459 times.
✓ Branch 230 → 232 taken 318 times.
✓ Branch 232 → 233 taken 318 times.
✓ Branch 232 → 234 taken 459 times.
✗ Branch 349 → 350 not taken.
✗ Branch 349 → 352 not taken.
✗ Branch 350 → 351 not taken.
✗ Branch 350 → 352 not taken.
✗ Branch 354 → 355 not taken.
✗ Branch 354 → 357 not taken.
✗ Branch 355 → 356 not taken.
✗ Branch 355 → 357 not taken.
✗ Branch 358 → 359 not taken.
✗ Branch 358 → 360 not taken.
|
1695 | : Route{QStringLiteral("elbow"), {start, {start.x(), busY}, {end.x(), busY}, end}}); |
| 199 | 777 | continue; | |
| 200 | 777 | } | |
| 201 |
2/2✓ Branch 239 → 240 taken 750 times.
✓ Branch 239 → 284 taken 1593 times.
|
2343 | if (std::abs(pa.y() - pb.y()) < 1) { |
| 202 | // Same row: an arc over anyone standing between the two. | ||
| 203 | 750 | bool between = false; | |
| 204 |
4/4✓ Branch 266 → 267 taken 263318 times.
✓ Branch 266 → 268 taken 545 times.
✓ Branch 267 → 241 taken 263113 times.
✓ Branch 267 → 268 taken 205 times.
|
263863 | for (int i = 0; i < n && !between; ++i) |
| 205 |
6/6✓ Branch 242 → 243 taken 261845 times.
✓ Branch 242 → 264 taken 662 times.
✓ Branch 245 → 246 taken 261785 times.
✓ Branch 245 → 264 taken 60 times.
✓ Branch 250 → 251 taken 7484 times.
✓ Branch 250 → 264 taken 254301 times.
|
524292 | between = i != e.from && i != e.to && isDrawn(graph.nodes.at(i)) && |
| 206 |
1/1✓ Branch 246 → 247 taken 261785 times.
|
261785 | std::abs(positions.value(i).y() - pa.y()) < 1 && |
| 207 |
8/8✓ Branch 241 → 242 taken 262507 times.
✓ Branch 241 → 264 taken 606 times.
✓ Branch 251 → 252 taken 7484 times.
✓ Branch 256 → 257 taken 3903 times.
✓ Branch 256 → 264 taken 3581 times.
✓ Branch 257 → 258 taken 3903 times.
✓ Branch 262 → 263 taken 205 times.
✓ Branch 262 → 264 taken 3698 times.
|
525620 | positions.value(i).x() > std::min(pa.x(), pb.x()) && positions.value(i).x() < std::max(pa.x(), pb.x()); |
| 208 |
2/2✓ Branch 268 → 269 taken 205 times.
✓ Branch 268 → 284 taken 545 times.
|
750 | if (between) { |
| 209 | 205 | const double lift = 44 + 0.12 * std::abs(pb.x() - pa.x()); | |
| 210 | 410 | out.append({QStringLiteral("curve"), {pa, QPointF((pa.x() + pb.x()) / 2, pa.y() - 2 * lift), pb}}); | |
| 211 | 205 | continue; | |
| 212 | 205 | } | |
| 213 | } | ||
| 214 |
2/2✓ Branch 284 → 285 taken 2138 times.
✓ Branch 285 → 286 taken 2138 times.
|
2138 | out.append(straightOrBent(graph, positions, e.from, e.to)); |
| 215 | 4237 | } | |
| 216 | 93 | return out; | |
| 217 | 2125 | } | |
| 218 | |||
| 219 | } // namespace RelationGraphLayout | ||
| 220 |