The port editor gets 'From variable' next to '+ Field': pick a struct variable of the behavior and its fields land as ports. It only adds - a field the node already declares stays as it is, because it may carry an edge - and the entry is disabled once there is nothing left to add. A list of structs counts too: it declares the shape of every item, which is exactly the bundle a Pack builds for it. A color field arrives as a number port; the graph has no color type. AddPortsCommand is new underneath: adding five ports had to be one undo step, and it checks every key before it appends a single one, so a collision does not leave half the list behind. AddPortCommand is a three-line subclass of it, which leaves its sixteen call sites untouched.
1.4 KiB
beim expand und pack node habe ich mir eigentlich auch vorgestellt, dass man sich eine struct variable auswählt und automatisch die felder erzeugt werden. wir können das so lassen wie es ist (eigene felder definieren), aber eine helfer auswahl von structs das die felder erstellt wäre gut.
Umgesetzt (2026-09-10). From variable ▾ steht in der Kopfzeile des Port-Editors neben
+ Field ▾; das Menü listet die Struct-Variablen des Behaviors und legt deren Felder als Ports an.
Drei Entscheidungen, die die Notiz offen ließ:
- Es ergänzt nur, es schreibt nichts um. Ein Feld, das der Node schon deklariert, bleibt stehen – es könnte eine Kante tragen. Ist nichts mehr zu ergänzen, ist der Eintrag deaktiviert.
- Eine Liste aus Structs zählt mit (
shapes (item)): sie deklariert die Form jedes Items, also genau das Bündel, das einPackfür sie baut. - Ein Color-Feld wird ein Zahlport.
FIELD_KINDSist keine Teilmenge vonDECLARED_PORT_KINDS– der Graph kennt keine Farbe, im Wertemodell ist sie eine Zahl.
Zwei Fallen unterwegs, beide gemessen: AddPortCommand legt genau einen Port an, „alle Felder auf
einmal" wäre sonst in fünf Undo-Schritte zerfallen – daher AddPortsCommand, das alle Schlüssel
prüft, bevor es einen anhängt (sonst bliebe nach einer Kollision die halbe Liste stehen).
Und ein Struct-Feld darf exec heißen, ein Port nicht; die Fehlermeldung sagt jetzt auch warum.