Graph: Kommentar bzw. Group Fit/Selection #95

Closed
opened 2026-09-16 11:27:13 +02:00 by admin · 1 comment

Kommentar- bzw. Group Nodes im Graph:

  • Wenn ich auf "Fit" klicke werden diese ignoriert
  • Auch beim Selection Rect werden diese ignoriert
Kommentar- bzw. Group Nodes im Graph: - Wenn ich auf "Fit" klicke werden diese ignoriert - Auch beim Selection Rect werden diese ignoriert
admin added this to the Development project 2026-09-16 11:27:13 +02:00
admin moved this to Next in Development on 2026-09-16 11:31:57 +02:00
Owner

Beides gebaut, gepusht als 36ccc76.

Fit

fitView() maß nur nodeBoxes(). Jetzt rechnet es Gruppen und Kommentare mit ein — inklusive des Falls, den das vorher gar nicht kannte: ein Graph, der nur einen Kommentar enthält, rahmte bisher den leeren Ursprung, weil die Abbruchbedingung nodes.length === 0 hieß.

Eine Grenze, die bleibt und die ich im Wiki vermerkt habe: der Zoom hört bei 0.25 auf. Eine Box weit genug draußen liegt danach immer noch außerhalb — kein Fit kann das lösen.

Selection Rect

Das Band fängt Boxen jetzt mit, und zwar in dieselbe Auswahl wie die Nodes: die Node-Selektion trägt zusätzlich annotationIds. Ein Zug bewegt alles, ein Delete löscht alles, ein Undo nimmt alles zurück.

Zwei Entscheidungen, die im Issue nicht standen:

  1. Eine Box zählt nur, wenn das Band sie ganz umschließt — ein Node zählt weiterhin bei Berührung. Das ist keine Geschmacksfrage: eine Gruppe umschließt die Nodes, die sie hält, überlappt also jedes Band, das einen davon fängt. Und weil eine Gruppe ihre Nodes beim Ziehen mitnimmt, wäre das versehentliche Mitfangen sofort spürbar.
  2. Gemischte Auswahl statt Rückfall. Das kostete Mitzieharbeit an Delete, Drag, Inspector, Undo-Bereinigung und dem Selektionsvergleich — aber alles andere hätte bedeutet, dass man Node und Box nie zusammen anfassen kann.

Die Falle dabei: ein Node innerhalb einer selektierten Gruppe gehört zu beiden. Ein naiver Aufbau versetzt ihn doppelt. travellers() sammelt deshalb, was eine Geste trägt, und lässt jedes Ding darin genau einmal vorkommen.

Belegt

npm run check                    → 89 Files, 1138 Tests, grün (vorher 1124)
npm run build                    → ok
GM_STEPS=36 node tools/e2e.mjs   → ALL PASSED – 18 checks (vorher 13)

14 neue Unit-Tests (tests/editor/graph-band-selection.test.ts) und fünf neue e2e-Checks in Schritt 36, darunter der, auf den es ankommt: nach einem Band über den ganzen Graphen wird ein Node gezogen, und Notiz, Gruppe und alle Nodes bewegen sich um exakt denselben Betrag — {"far":{"x":244,"y":175},"start":{"x":244,"y":175},"group":{"x":244,"y":175},"note":{"x":244,"y":175}}. Ein doppelter Versatz stünde da als 488.

Zwei Dinge, die der Umbau aufgedeckt hat: die Kurzform, die die Testhooks für eine Selektion übergeben, konnte nodeIds ohne annotationIds liefern und ließ validateSelection() auflaufen — beide Listen werden jetzt an einer Stelle aufgefüllt. Und der Rechtsklick auf eine Box warf vorher die übrige Auswahl weg, bevor man sie ziehen konnte.

Zahl

Die Gesamtzahl im Wiki steht jetzt auf 958 = 953 (gemessen in CI-56 auf be8f233) + 5. Bestätigt ist sie erst, wenn der Container sie liefert; fällt der Lauf anders aus, mache ich das Issue wieder auf.

Wiki: 426dbe7 (Behaviors.md, Keyboard.md, Development.md).

**Beides gebaut, gepusht als `36ccc76`.** ## Fit `fitView()` maß nur `nodeBoxes()`. Jetzt rechnet es Gruppen und Kommentare mit ein — inklusive des Falls, den das vorher gar nicht kannte: ein Graph, der *nur* einen Kommentar enthält, rahmte bisher den leeren Ursprung, weil die Abbruchbedingung `nodes.length === 0` hieß. Eine Grenze, die bleibt und die ich im Wiki vermerkt habe: der Zoom hört bei 0.25 auf. Eine Box weit genug draußen liegt danach immer noch außerhalb — kein Fit kann das lösen. ## Selection Rect Das Band fängt Boxen jetzt mit, und zwar in **dieselbe** Auswahl wie die Nodes: die Node-Selektion trägt zusätzlich `annotationIds`. Ein Zug bewegt alles, ein `Delete` löscht alles, ein Undo nimmt alles zurück. Zwei Entscheidungen, die im Issue nicht standen: 1. **Eine Box zählt nur, wenn das Band sie ganz umschließt** — ein Node zählt weiterhin bei Berührung. Das ist keine Geschmacksfrage: eine Gruppe umschließt die Nodes, die sie hält, überlappt also jedes Band, das einen davon fängt. Und weil eine Gruppe ihre Nodes beim Ziehen mitnimmt, wäre das versehentliche Mitfangen sofort spürbar. 2. **Gemischte Auswahl statt Rückfall.** Das kostete Mitzieharbeit an Delete, Drag, Inspector, Undo-Bereinigung und dem Selektionsvergleich — aber alles andere hätte bedeutet, dass man Node und Box nie zusammen anfassen kann. Die Falle dabei: ein Node *innerhalb* einer selektierten Gruppe gehört zu beiden. Ein naiver Aufbau versetzt ihn doppelt. `travellers()` sammelt deshalb, was eine Geste trägt, und lässt jedes Ding darin genau einmal vorkommen. ## Belegt ``` npm run check → 89 Files, 1138 Tests, grün (vorher 1124) npm run build → ok GM_STEPS=36 node tools/e2e.mjs → ALL PASSED – 18 checks (vorher 13) ``` 14 neue Unit-Tests (`tests/editor/graph-band-selection.test.ts`) und fünf neue e2e-Checks in Schritt 36, darunter der, auf den es ankommt: nach einem Band über den ganzen Graphen wird **ein** Node gezogen, und Notiz, Gruppe und alle Nodes bewegen sich um exakt denselben Betrag — `{"far":{"x":244,"y":175},"start":{"x":244,"y":175},"group":{"x":244,"y":175},"note":{"x":244,"y":175}}`. Ein doppelter Versatz stünde da als 488. Zwei Dinge, die der Umbau aufgedeckt hat: die Kurzform, die die Testhooks für eine Selektion übergeben, konnte `nodeIds` ohne `annotationIds` liefern und ließ `validateSelection()` auflaufen — beide Listen werden jetzt an einer Stelle aufgefüllt. Und der Rechtsklick auf eine Box warf vorher die übrige Auswahl weg, bevor man sie ziehen konnte. ## Zahl Die Gesamtzahl im Wiki steht jetzt auf **958** = 953 (gemessen in CI-56 auf `be8f233`) + 5. Bestätigt ist sie erst, wenn der Container sie liefert; fällt der Lauf anders aus, mache ich das Issue wieder auf. Wiki: `426dbe7` (`Behaviors.md`, `Keyboard.md`, `Development.md`).
admin moved this to Done in Development on 2026-09-16 14:38:54 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#95