Graph: Eingangs- und Ausgangstext einer Zeile überdecken sich #306

Closed
opened 2026-10-03 17:56:50 +02:00 by meleki · 2 comments
Owner

Aus #233 (Abschluss vom 2026-10-01, „Finding, not fixed … No issue is filed for it yet“), gefunden in Durchgang 4 von #156.

Befund

  • Am Node Animation playing überdeckt der Name der gewählten Animation die Beschriftung des Ausgangs progress in derselben Zeile. Gesehen in #233 in der verkleinerten Fit-Ansicht.
  • Die Ursache liegt nicht an diesem Node, sondern in NodeView.rebuildTexts (src/editor/graph/NodeView.ts:434). Eingang und Ausgang einer Zeile werden unabhängig voneinander gekürzt:
    • Der Eingangstext beginnt bei x = 15 und darf 108 px breit werden (NODE_WIDTH / 2 + 20), reicht also bis x = 123.
    • Der Ausgangstext endet bei x = 161 und darf 78 px breit werden (NODE_WIDTH / 2 - 10), beginnt also frühestens bei x = 83.
    • Zwischen x = 83 und 123 können sich beide überlagern, bis zu 40 px.
  • Der Eingangstext ist bei einer Inline-Auswahl Name Wert (inputText, Zeile 350). Ein längerer Wert schiebt ihn bis an seine Grenze. Betroffen ist also jeder Node mit einem Inline-Feld und einem Ausgang in derselben Zeile, nicht nur Animation playing.
  • Gemessen im Bild habe ich das nicht. Die Zahlen oben stammen aus dem Code.

Zu bauen (Vorschlag)

  • Eingang und Ausgang einer Zeile teilen sich den Platz: Der Ausgang behält seine Beschriftung, der Eingang wird bis 6 px davor gekürzt (…), wie der Titel heute schon.
  • Die Regel als reine Funktion (Breite des Nodes, Breite der Ausgangsbeschriftung → höchstens erlaubte Breite des Eingangs), damit sie ohne Browser prüfbar ist.
  • Der Wert, den ein laufendes Spiel neben dem Ausgang einblendet (valueSlots), bekommt dieselbe Grenze. Heute kann dort left > right herauskommen.

Beweis beim Schließen

  • Unit für die Regel: kurzer Eingang bleibt ungekürzt, langer wird vor dem Ausgang gekürzt, eine Zeile ohne Ausgang behält die volle Breite.
  • e2e im Graph-Modul: Animation playing mit einer Animation, deren Name lang ist. Die Kästen von Eingangs- und Ausgangstext in Zeile 2 überschneiden sich nicht (Test-Hook liefert die Kästen). Dazu ein Screenshot des Nodes, angesehen.
  • Gegenprobe: Ohne die Regel überschneiden sich die Kästen.

Offen (mit Vorschlag)

  1. Wer gibt nach, Eingang oder Ausgang? Vorschlag: der Eingang. Die Beschriftung eines Ausgangs ist kurz und nötig, um die richtige Kante zu ziehen. Der volle Wert steht ohnehin im Inspector des Nodes.
  2. Breiterer Node statt Kürzen? Vorschlag: nein. NODE_WIDTH ist fest, und GraphCanvas rechnet an mehreren Stellen damit (GraphCanvas.ts:436, :724, :971, :1104).
Aus #233 (Abschluss vom 2026-10-01, „Finding, not fixed … No issue is filed for it yet“), gefunden in Durchgang 4 von #156. ## Befund - Am Node `Animation playing` überdeckt der Name der gewählten Animation die Beschriftung des Ausgangs `progress` in derselben Zeile. Gesehen in #233 in der verkleinerten *Fit*-Ansicht. - Die Ursache liegt nicht an diesem Node, sondern in `NodeView.rebuildTexts` (`src/editor/graph/NodeView.ts:434`). Eingang und Ausgang einer Zeile werden unabhängig voneinander gekürzt: - Der Eingangstext beginnt bei x = 15 und darf 108 px breit werden (`NODE_WIDTH / 2 + 20`), reicht also bis x = 123. - Der Ausgangstext endet bei x = 161 und darf 78 px breit werden (`NODE_WIDTH / 2 - 10`), beginnt also frühestens bei x = 83. - Zwischen x = 83 und 123 können sich beide überlagern, bis zu 40 px. - Der Eingangstext ist bei einer Inline-Auswahl `Name Wert` (`inputText`, Zeile 350). Ein längerer Wert schiebt ihn bis an seine Grenze. Betroffen ist also jeder Node mit einem Inline-Feld und einem Ausgang in derselben Zeile, nicht nur `Animation playing`. - Gemessen im Bild habe ich das nicht. Die Zahlen oben stammen aus dem Code. ## Zu bauen (Vorschlag) - Eingang und Ausgang einer Zeile teilen sich den Platz: Der Ausgang behält seine Beschriftung, der Eingang wird bis 6 px davor gekürzt (`…`), wie der Titel heute schon. - Die Regel als reine Funktion (Breite des Nodes, Breite der Ausgangsbeschriftung → höchstens erlaubte Breite des Eingangs), damit sie ohne Browser prüfbar ist. - Der Wert, den ein laufendes Spiel neben dem Ausgang einblendet (`valueSlots`), bekommt dieselbe Grenze. Heute kann dort `left > right` herauskommen. ## Beweis beim Schließen - Unit für die Regel: kurzer Eingang bleibt ungekürzt, langer wird vor dem Ausgang gekürzt, eine Zeile ohne Ausgang behält die volle Breite. - e2e im Graph-Modul: `Animation playing` mit einer Animation, deren Name lang ist. Die Kästen von Eingangs- und Ausgangstext in Zeile 2 überschneiden sich nicht (Test-Hook liefert die Kästen). Dazu ein Screenshot des Nodes, angesehen. - Gegenprobe: Ohne die Regel überschneiden sich die Kästen. ## Offen (mit Vorschlag) 1. **Wer gibt nach, Eingang oder Ausgang?** Vorschlag: der Eingang. Die Beschriftung eines Ausgangs ist kurz und nötig, um die richtige Kante zu ziehen. Der volle Wert steht ohnehin im Inspector des Nodes. 2. **Breiterer Node statt Kürzen?** Vorschlag: nein. `NODE_WIDTH` ist fest, und `GraphCanvas` rechnet an mehreren Stellen damit (`GraphCanvas.ts:436`, `:724`, `:971`, `:1104`).
meleki added the new label 2026-10-03 17:56:50 +02:00
  1. vorschlag passt, eingang gibt nach
  2. vorschlag passt, so lassen
1. vorschlag passt, eingang gibt nach 2. vorschlag passt, so lassen
admin removed the new label 2026-10-03 18:07:30 +02:00
admin added this to the Development project 2026-10-03 18:07:32 +02:00
admin moved this to Next in Development on 2026-10-03 18:07:34 +02:00
admin moved this to Done in Development on 2026-10-03 18:29:21 +02:00
Author
Owner

Erledigt mit 2aa635f und b895ae9.

Was geändert ist

  • Der Eingang gibt nach (offener Punkt 1, wie entschieden): NodeView.rebuildTexts setzt zuerst die Beschriftung des Ausgangs. Danach wird der Eingangstext bis 6 px davor mit … gekürzt.
  • Die Regel ist eine reine Funktion in src/editor/graph/portRow.ts: inputTextRoom(inputX, ownMax, outputLeft). In einer Zeile ohne Ausgang bleibt die bisherige Grenze von 108 px.
  • Der Wert, den ein laufendes Spiel neben dem Ausgang einblendet, nutzt dieselbe Regel (valueSpan). Seine linke Kante kann nicht mehr rechts von der rechten liegen.
  • Neuer Test-Hook __gm.graph.rowSpans(nodeId): Er liefert je Zeile den gekürzten Eingangs- und Ausgangstext samt linker und rechter Kante, in Node-Einheiten.
  • NODE_WIDTH bleibt (offener Punkt 2, wie entschieden).
  • Wiki: Behaviors beschreibt die Regel (wer gibt nach, voller Wert im Inspector). Architecture nennt portRow, die Summe auf Development ist 1729 (Wiki-Commit 30c94a3).

Beweis (auf melektaus-atx)

  • Unit (tests/editor/port-row.test.ts, 6 Tests):
    • Ein kurzer Eingang behält seine Grenze, ein langer wird 6 px vor dem Ausgang gekürzt.
    • Eine Zeile ohne Ausgang behält die volle Breite, und es gibt nie eine negative Breite.
    • Der Laufwert liegt zwischen Eingang und Ausgang, left ist nie größer als right.
  • e2e 6: Animation playing mit der Animation „Swing with a name far too long for its row“. ALL PASSED – 149 checks (148 + 1).
    PASS-Zeile: {"input":{"text":"animation Swi…","left":15,"right":107.77},"output":{"text":"progress","left":114.08,"right":161}}, die Lücke ist also 6,3 px.
  • Screenshot angesehen (28b-animation-playing-long-name, Fit-Ansicht): „animation Swi…“ endet sichtbar vor „progress“, und „progress“ steht vollständig da.
  • Gegenprobe greift: Ist die Regel abgeschaltet, reicht der Eingang als „animation Swing…“ bis x = 121,4, also 7,3 px unter „progress“ (ab x = 114,1). Der neue Check fällt dann.
  • Gate: 230 Files, 3520 Tests, CHECK EXIT 0 (+6 aus port-row.test.ts).

Gefunden und behoben

  • Der erste Lauf von e2e 6 war rot, wegen meines eigenen Checks: Er verlangte „Swing“ im gekürzten Text, gekürzt wird aber schon nach „Swi“. Jetzt prüft er, dass der gekürzte Text ein Anfang des vollen Texts ist.
  • Der erste Screenshot zeigte den Scene-Tab statt des Graphs, weil der Schritt nach einem play/stop lief. Der Check las die Zeile über den Hook und war davon nicht betroffen. Der Schritt schaltet jetzt vorher auf den Graph (b895ae9).

Nicht geprüft

  • Andere Nodes mit Inline-Feld und Ausgang in derselben Zeile habe ich nicht im Browser angesehen. Sie laufen über dieselbe Stelle in rebuildTexts.
  • Den Laufwert neben einem Ausgang (valueSpan) gibt es nur als Unit-Test, nicht im Browser.
Erledigt mit `2aa635f` und `b895ae9`. ## Was geändert ist - **Der Eingang gibt nach** (offener Punkt 1, wie entschieden): `NodeView.rebuildTexts` setzt zuerst die Beschriftung des Ausgangs. Danach wird der Eingangstext bis 6 px davor mit `…` gekürzt. - **Die Regel ist eine reine Funktion** in `src/editor/graph/portRow.ts`: `inputTextRoom(inputX, ownMax, outputLeft)`. In einer Zeile ohne Ausgang bleibt die bisherige Grenze von 108 px. - **Der Wert, den ein laufendes Spiel neben dem Ausgang einblendet**, nutzt dieselbe Regel (`valueSpan`). Seine linke Kante kann nicht mehr rechts von der rechten liegen. - **Neuer Test-Hook `__gm.graph.rowSpans(nodeId)`**: Er liefert je Zeile den gekürzten Eingangs- und Ausgangstext samt linker und rechter Kante, in Node-Einheiten. - **`NODE_WIDTH` bleibt** (offener Punkt 2, wie entschieden). - Wiki: *Behaviors* beschreibt die Regel (wer gibt nach, voller Wert im Inspector). *Architecture* nennt `portRow`, die Summe auf *Development* ist 1729 (Wiki-Commit `30c94a3`). ## Beweis (auf `melektaus-atx`) - **Unit** (`tests/editor/port-row.test.ts`, 6 Tests): - Ein kurzer Eingang behält seine Grenze, ein langer wird 6 px vor dem Ausgang gekürzt. - Eine Zeile ohne Ausgang behält die volle Breite, und es gibt nie eine negative Breite. - Der Laufwert liegt zwischen Eingang und Ausgang, `left` ist nie größer als `right`. - **e2e 6:** `Animation playing` mit der Animation „Swing with a name far too long for its row“. **ALL PASSED – 149 checks** (148 + 1). PASS-Zeile: `{"input":{"text":"animation Swi…","left":15,"right":107.77},"output":{"text":"progress","left":114.08,"right":161}}`, die Lücke ist also 6,3 px. - **Screenshot angesehen** (`28b-animation-playing-long-name`, *Fit*-Ansicht): „animation Swi…“ endet sichtbar vor „progress“, und „progress“ steht vollständig da. - **Gegenprobe greift:** Ist die Regel abgeschaltet, reicht der Eingang als „animation Swing…“ bis x = 121,4, also 7,3 px unter „progress“ (ab x = 114,1). Der neue Check fällt dann. - Gate: 230 Files, 3520 Tests, `CHECK EXIT 0` (+6 aus `port-row.test.ts`). ## Gefunden und behoben - Der erste Lauf von e2e 6 war rot, wegen meines eigenen Checks: Er verlangte „Swing“ im gekürzten Text, gekürzt wird aber schon nach „Swi“. Jetzt prüft er, dass der gekürzte Text ein Anfang des vollen Texts ist. - Der erste Screenshot zeigte den Scene-Tab statt des Graphs, weil der Schritt nach einem `play`/`stop` lief. Der Check las die Zeile über den Hook und war davon nicht betroffen. Der Schritt schaltet jetzt vorher auf den Graph (`b895ae9`). ## Nicht geprüft - Andere Nodes mit Inline-Feld und Ausgang in derselben Zeile habe ich nicht im Browser angesehen. Sie laufen über dieselbe Stelle in `rebuildTexts`. - Den Laufwert neben einem Ausgang (`valueSpan`) gibt es nur als Unit-Test, nicht im Browser.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#306