Flow Arrows - Updated column assignment to allow columns to be reused

when the addresses don't overlap
This commit is contained in:
dragonmacher
2025-12-02 15:41:12 -05:00
parent a0acfb8f91
commit 96ff3117a3

View File

@@ -301,9 +301,6 @@ class FlowArrowMarginProvider implements ListingMarginProvider {
private List<ArrowGroup> groupArrowsBySharedEndpoints() {
// not sure this is still needed; keeping for posterity
Collections.sort(flowArrows, (a1, a2) -> (a1).end.compareTo((a2).end));
Map<Address, List<FlowArrow>> arrowsByStart = new HashMap<>();
Map<Address, List<FlowArrow>> arrowsByEnd = new HashMap<>();
mapArrowsByEndpoints(arrowsByStart, arrowsByEnd);
@@ -354,16 +351,24 @@ class FlowArrowMarginProvider implements ListingMarginProvider {
*/
private void assignArrowColumns() {
Collections.sort(flowArrows, (a1, a2) -> (a1).end.compareTo((a2).end));
// assign groups and then assign columns to the groups
int count = 0;
List<ArrowGroup> groups = groupArrowsBySharedEndpoints();
Map<Integer, ArrowGroup> groupsByColumn = new HashMap<>();
for (ArrowGroup group : groups) {
// assignGroupColumn(group, groups);
int column = Math.min(MAX_DEPTH, count++);
group.setColumn(column);
maxColumn = column;
for (int nextCol = 0; nextCol < groups.size(); nextCol++) {
ArrowGroup existingGroup = groupsByColumn.get(nextCol);
if (existingGroup == null || !existingGroup.overlaps(group)) {
int column = Math.min(MAX_DEPTH, nextCol);
group.setColumn(column);
groupsByColumn.put(column, group);
maxColumn = Math.max(maxColumn, column);
break;
}
}
}
}
@@ -399,7 +404,11 @@ class FlowArrowMarginProvider implements ListingMarginProvider {
}
}
return new ArrayList<>(results);
// not sure this is still needed; keeping for posterity
ArrayList<FlowArrow> newArrows = new ArrayList<>(results);
Collections.sort(newArrows, (a1, a2) -> (a1).end.compareTo((a2).end));
return newArrows;
}
private void createFlowArrow(Set<FlowArrow> results, OffscreenArrowsFlow offscreenArrows,
@@ -656,6 +665,10 @@ class FlowArrowMarginProvider implements ListingMarginProvider {
arrows.add(f);
addrs.add(f.addresses);
}
boolean overlaps(ArrowGroup other) {
return addrs.intersects(other.addrs);
}
}
/**