OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet commits / 7d55fd0

Fix graph: all algo types work + label overlap prevention
All 6 extractors now produce results (creator, activity, size were returning 0 due to admin role check). Added overlap prevention pass that pushes apart nodes closer than 50px. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7d55fd0dbfc8814581f1e22807019be21abde940
by plankatron <fleeky@gmail.com> · 2026-02-23T03:36:07.000Z

Changed files (1) +29 -0

scripts/graph_canvas.gd +29 -0
……@@ -88,6 +88,7 @@ func set_graph_data(nodes: Array, edges: Array, clusters: Array, cluster_labels:
8888 _init_cluster_positions(clusters)
8989 for i: int in LAYOUT_ITERATIONS:
9090 _layout_step()
91 _spread_overlapping()
9192 _rescale_to_fit()
9293 queue_redraw()
9394
……@@ -240,6 +241,34 @@ func _layout_step() -> void:
240241 _positions[nid] += velocities[nid]
241242
242243
244func _spread_overlapping() -> void:
245 ## Push apart nodes that are too close, so labels don't overlap.
246 ## Minimum distance = enough for a label (~80px at zoom 1.0).
247 var min_dist: float = 50.0
248 var node_ids: Array = _positions.keys()
249 # Run a few passes to resolve cascading overlaps
250 for _pass: int in 5:
251 var moved: bool = false
252 for i: int in node_ids.size():
253 for j: int in range(i + 1, node_ids.size()):
254 var a: String = node_ids[i]
255 var b: String = node_ids[j]
256 var delta: Vector2 = _positions[a] - _positions[b]
257 var dist: float = delta.length()
258 if dist < min_dist and dist > 0.01:
259 var push: Vector2 = delta.normalized() * (min_dist - dist) * 0.5
260 _positions[a] += push
261 _positions[b] -= push
262 moved = true
263 elif dist < 0.01:
264 # Exactly overlapping — nudge apart
265 _positions[a] += Vector2(min_dist * 0.5, 0)
266 _positions[b] -= Vector2(min_dist * 0.5, 0)
267 moved = true
268 if not moved:
269 break
270
271
243272func _rescale_to_fit() -> void:
244273 ## After layout, rescale all positions to fit within the viewport with padding.
245274 if _positions.is_empty():