enhancement
major
defect
major
minor
=== Beschreibung Beim Generieren der Baumstruktur kommt es zu einem Layout-Fehler, wenn eine Substruktur (z. B. von Knoten 1.2) kleiner wird. Die Layout-Generik nimmt fälschlicherweise an, dass zwischen zwei bestehenden Knoten (hier 1.1.1 und 1.1.2) ausreichend Platz vorhanden ist. Dadurch wird der Knoten dazwischen gezeichnet und überlagert/übermalt die Verbindungskanten anderer Knoten.
=== Schritte zur Reproduktion
- Erstelle eine Baumstruktur mit mehreren Ebenen (wie im linken Beispielbild).
- Reduziere die Anzahl der Kindknoten in einer tieferen Ebene (z. B. Entfernen von Knoten 1.2.2, sodass nur noch 1.2.1 unter 1.2 existiert).
- Rendere das Diagramm neu.
=== Erwartetes Verhalten Das Layout sollte auch bei kleineren Substrukturen die Hierarchie-Ebenen sauber trennen und Knoten nicht in Bereiche verschieben, in denen sie andere Kanten oder Knoten überlagern (analog zur korrekten Darstellung im linken Bild). Tatsächliches Verhalten (siehe rechtes Beispielbild): Knoten 1.2 und dessen Substruktur 1.2.1 werden vertikal nach oben zwischen 1.1.1 und 1.1.2 verschoben. Die von 1.1 ausgehende Kante zu 1.1.2 wird dabei von der Box des Knotens 1.2 übermalt.
=== Vermutete Ursache • Der Algorithmus zur Platzberechnung (Layout-Generik) scheint die tatsächliche vertikale Ausdehnung benachbarter Teilbäume nicht korrekt zu prüfen, sobald eine Substruktur kompakter wird. • Ist die Substruktur größer (wie links mit 1.2.1 und 1.2.2), greift die Abstandsprüfung korrekt und der Baum wird wie gewünscht nach unten erweitert.
Lösung
Das kompakte Baum-Layout (TreeRenderInfo, compact=true) schiebt einen Geschwister-Teilbaum nach oben in freien Platz neben einem vorangehenden Teilbaum, solange keine seiner Boxen und Verbindungslinien mit bereits platzierten kollidiert. Die vertikalen Verbindungsbusse gehen dabei als Hindernisse der Breite 0 in die Prüfung ein. Da alle Geschwister-Teilbäume ihre Busse einer Tiefe auf derselben X-Position haben, galten zwei solche Busse bei der X-Überlappungsprüfung (halboffene Intervalle) als disjunkt und kollidierten nie. Ein kleiner Teilbaum (1.2 mit nur 1.2.1) passte damit zwischen 1.1.1 und 1.1.2, und sein Bus lag auf dem Bus von 1.1. Ein größerer Teilbaum blieb nur deshalb unten, weil seine Kind-Boxen mit 1.1.x kollidierten.
Die X-Überlappung wird jetzt durch eine gemeinsame Prüfung bestimmt, bei der eine Linie der Breite 0 auch dann überlappt, wenn sie den X-Bereich des anderen Hindernisses einschließlich seiner Ränder berührt. Behoben in beiden Kopien des Layouts (com.top_logic.react.flow.common und com.top_logic.graphic.blocks), mit Regressionstest in beiden TestTreeLayout.