Aus #84 („Die elegantere Möglichkeit … ist nicht gebaut: … der Wechsel von ‚Tab = Werkzeug‘ zu ‚Tab = offenes Dokument‘ … Wenn du das willst, gehört es in ein eigenes Issue“). Dort steht auch als Grenze: Der Tab-Wechsel per Tastatur erreicht Tabs im »-Menü nicht.
Befund
Die Tab-Leiste hat feste Werkzeug-Tabs (Scene, Game, Texture, Animation, Shader, …). Mit jedem neuen Asset-Typ kommt ein Tab dazu, das »-Überlaufmenü aus #84 fängt das nur ab.
Ein Tab zeigt immer das zuletzt gewählte Asset seiner Art; zwei Texturen gleichzeitig offen geht nicht.
Zu bauen (Vorschlag)
Scene und Game bleiben feste Tabs. Alle anderen werden offene Dokumente: Doppelklick auf ein Asset öffnet es als eigenen Tab mit ×, wie in einer IDE.
Mehrere Assets derselben Art gleichzeitig offen; offene Tabs werden pro Projekt gemerkt.
Der Tastatur-Wechsel erreicht alle offenen Tabs.
Offen (mit Vorschlag)
Aufwand: größter Umbau der Oberfläche, ändert gewohntes Verhalten. Vorschlag: erst ein Konzept-Kommentar hier (was mit Plugin-Tabs aus #121 passiert), dann bauen.
Aus #84 („Die elegantere Möglichkeit … ist nicht gebaut: … der Wechsel von ‚Tab = Werkzeug‘ zu ‚Tab = offenes Dokument‘ … Wenn du das willst, gehört es in ein eigenes Issue“). Dort steht auch als Grenze: Der Tab-Wechsel per Tastatur erreicht Tabs im `»`-Menü nicht.
## Befund
- Die Tab-Leiste hat feste Werkzeug-Tabs (Scene, Game, Texture, Animation, Shader, …). Mit jedem neuen Asset-Typ kommt ein Tab dazu, das `»`-Überlaufmenü aus #84 fängt das nur ab.
- Ein Tab zeigt immer das zuletzt gewählte Asset seiner Art; zwei Texturen gleichzeitig offen geht nicht.
## Zu bauen (Vorschlag)
- Scene und Game bleiben feste Tabs. Alle anderen werden **offene Dokumente**: Doppelklick auf ein Asset öffnet es als eigenen Tab mit ×, wie in einer IDE.
- Mehrere Assets derselben Art gleichzeitig offen; offene Tabs werden pro Projekt gemerkt.
- Der Tastatur-Wechsel erreicht alle offenen Tabs.
## Offen (mit Vorschlag)
1. **Aufwand:** größter Umbau der Oberfläche, ändert gewohntes Verhalten. Vorschlag: erst ein Konzept-Kommentar hier (was mit Plugin-Tabs aus #121 passiert), dann bauen.
meleki
added the new label 2026-09-19 11:41:52 +02:00
Noch nichts gebaut. Erst der Befund aus dem Code, dann der Entwurf, dann die Fragen, die du entscheiden musst.
Wie es heute gebaut ist (die Stellen, an denen der Umbau hängt)
12 feste Tabs (TAB_ORDER in src/editor/Editor.ts): Scene, Game, Behavior, State machine, Shader, Particles, Texture, Animation, Tile, Container, List, Plugins. Dazu hängen Plugins eigene Tabs hinten an (api.tabs.add).
Neun davon sind ein einziges Editor-Exemplar pro Art (AssetTabEditor), das der globalen Auswahl folgt: Wählt man irgendwo ein Behavior aus, springt der Behavior-Tab still auf dieses Behavior, auch wenn man ihn gerade nicht ansieht. Im Kopf jedes Tabs steht ein Picker, mit dem man innerhalb des Tabs das Asset wechselt.
Öffnen ist heute Auswahl plus Tabwechsel (openAsset → Ereignis open → showTab). Wählt man einen Node, ein Frame oder ein Objekt in einem Container aus, schaltet der Editor ebenfalls auf den passenden Tab.
Jeder Canvas setzt beim Asset-Wechsel seine Ansicht zurück (Fit, Zoom, Scroll, beim Tile die Zeit). Mit Dokument-Tabs wäre das bei jedem Tabwechsel zu sehen.
Der List-Tab zeigt kein Asset, sondern eine Liste in einer Variablen (ListSlot, an einem Objekt oder Asset). Der Plugins-Tab ist Verwaltung, auch kein Asset.
Plugin-Tabs (#117) werden beim Einschalten sofort gebaut (create()), ihre Id darf mit keiner eingebauten kollidieren (hasTab).
Undo und Inspector sind global und bleiben es.
Einstellungen „wie du arbeitest“ liegen im localStorage des Browsers (settings.ts), nie in der Projektdatei.
Entwurf
1. Die Leiste.[Scene] [Game] [Plugin-Tabs…] | [offene Dokumente…] [»]. Scene und Game sind fest und nicht schließbar. Das »-Menü aus #84 bleibt und nimmt auf, was nicht passt. Der aktive Tab ist weiter immer sichtbar.
2. Ein Dokument ist ein Asset oder eine Liste. Behavior, State machine, Shader, Particles, Texture, Animation, Tile und Container öffnen sich als Dokument, dazu eine Liste über ihren Knopf an der Variablen. Szenen bleiben, wie sie sind: Der Scene-Tab zeigt die aktive Szene, gewechselt wird über die Toolbar.
3. Öffnen. Doppelklick oder Enter im Asset-Panel, ein neu angelegtes Asset und der Listen-Knopf öffnen ein Dokument. Ist es schon offen, wird sein Tab aktiv, sonst kommt ein neuer Tab rechts neben dem aktiven dazu. Ein einfacher Klick im Asset-Panel zeigt wie heute nur den Inspector.
4. Ein Dokument-Tab zeigt immer sein Asset. Er folgt nicht mehr der Auswahl, der Picker im Tab-Kopf entfällt (der Name steht ja im Tab). Wählt man einen Node, ein Frame oder ein Container-Objekt aus, wird der Tab seines Dokuments aktiv.
5. Schließen mit dem x am Tab oder per Mittelklick. Dabei geht nichts verloren, jede Änderung steckt schon im Modell und wird automatisch gespeichert. Schließt man den aktiven Tab, wird der linke Nachbar aktiv, sonst Scene. Wird ein Asset gelöscht, geht sein Tab mit zu.
6. Ansicht pro Dokument. Zoom, Scroll und Fit merkt sich jeder Tab für die Sitzung. Wer zwischen zwei Texturen hin- und herschaltet, findet beide so wieder, wie er sie verlassen hat.
7. Technisch: ein Editor pro Art, der beim Tabwechsel umgehängt wird, nicht ein Editor pro Tab. Jeder Editor hängt an den State-Ereignissen und baut eigene Pixi-Container, 20 offene Tabs wären sonst 20 Graph-Canvases, die bei jeder Änderung mitlaufen. AssetTabEditor wird damit vom „Folger der Auswahl“ zum „Anzeiger eines Dokuments“, dazu kommt ein kleiner Ansichtsspeicher pro Dokument. Die Regel, welcher Tab wohin kommt und welcher nach dem Schließen aktiv wird, kommt als reine Funktion neben tabRowLayout, damit sie ohne Browser testbar ist.
8. Merken pro Projekt. Offene Dokumente, ihre Reihenfolge und der aktive Tab kommen in den localStorage, pro Projekt-Id, nicht in die Projektdatei (gleiche Begründung wie settings.ts: Das ist deine Arbeitsweise, nicht dein Spiel). Beim Laden fehlt ein inzwischen gelöschtes Asset still.
9. Tastatur. Eine Tastenkombination wechselt reihum durch alle offenen Tabs, auch durch die im »-Menü. Ein so erreichter Tab kommt in die Leiste. Damit ist die Grenze aus #84 weg. Der Browser hält einige Kombinationen fest (Ctrl+Tab, Ctrl+W, Ctrl+PageUp/PageDown bekommt eine Seite in Chrome nicht). Welche Kombination geht, messe ich vor dem Bau in Chrome und Firefox.
10. Plugins (#117, #121). Ein Plugin-Tab ist ein Werkzeug, kein Dokument: Er bleibt fest in der Leiste, solange das Plugin an ist, genau wie heute. api.tabs.add ändert sich nicht, PLUGIN_API_VERSION bleibt bei 1, #121 ist davon unberührt. Die eingebauten Ids bleiben für hasTab reserviert, damit ein altes Plugin nicht plötzlich eine Id belegt, die es vorher nicht bekam. Der Plugins-Verwaltungstab wird ein Dokument ohne Asset: Man öffnet ihn über das Projektmenü, und er lässt sich schließen. Dokument-Tabs für Plugins (api.tabs.open) wären ein eigenes Issue, falls je gewünscht.
Was sich für dich ändert
Nach dem Laden stehen nur Scene, Game und die gemerkten Tabs da. „Texture anklicken und die zuletzt gewählte sehen“ gibt es nicht mehr, dafür Doppelklick im Asset-Panel.
Die Leiste wächst mit deiner Arbeit, nicht mit der Zahl der Asset-Arten.
Aufwand und Tests
Groß:Editor.ts, AssetTabEditor und die neun Editoren darauf, TabStrip (x-Knopf, Mittelklick), die Öffnen-Wege im State, der Test-Hook.
e2e: 25 von 44 Modulen schalten heute über __gm.showTab('texture') und Co. Der Hook bleibt als Kompatibilitätsweg („zeig das Dokument dieser Art, das zur Auswahl passt“), damit nicht 25 Module auf einmal umgeschrieben werden. Neue Checks bekommen ein neues Modul: Öffnen, Schließen, Ansicht behalten, Merken nach Neuladen, Tastatur, Überlauf.
Wiki: Concepts (die Tab-Leiste), Scene editing, Keyboard, Plugins, Architecture.
Offene Fragen (jeweils mit Vorschlag)
Vorschau-Tab wie in VS Code (ein einfacher Klick öffnet einen vorläufigen Tab, der vom nächsten Klick ersetzt wird)? Vorschlag: nein. Ein Klick zeigt wie heute nur den Inspector.
Dasselbe Asset zweimal offen (zum Beispiel nebeneinander)? Vorschlag: nein, ein Tab pro Dokument, kein geteiltes Fenster.
Beschriftung. Im selben Projekt heißen oft mehrere Assets gleich (Sprite, Behavior und Animation „Player“). Vorschlag: Name plus die Art in gedämpfter Schrift davor („Behavior · Player“). Alternative: die Art nur bei Namensgleichheit.
Doppelklick auf einen Call-Node: Heute wechselt der Behavior-Tab das Behavior und die Brotkrumen-Leiste merkt sich den Weg. Vorschlag: gleich lassen, also im selben Tab weiter, mit Brotkrumen. Alternative: ein neuer Tab pro Behavior, dann entfällt die Brotkrumen-Leiste.
Szenen als Dokumente (mehrere Szenen gleichzeitig offen)? Vorschlag: nein, Scene bleibt fester Tab mit der Szenenwahl in der Toolbar. Das wäre ein eigenes Issue.
Plugin-Tabs fest oder schließbar?Vorschlag: fest, solange das Plugin an ist (siehe Punkt 10).
Plugins-Verwaltung über das Projektmenü als schließbarer Tab? Vorschlag: ja.
Tab-Wechsel per Tastatur.Vorschlag: eine Kombination, die ich vorher in Chrome und Firefox messe. Hast du schon eine Vorliebe?
Wiederherstellen beim Laden: die gemerkten Tabs öffnen oder immer nur Scene? Vorschlag: wiederherstellen, so steht es im Issue.
Ansicht (Zoom, Scroll) nur für die Sitzung oder mit den Tabs zusammen merken?Vorschlag: nur Sitzung, nach dem Neuladen wird gefittet wie heute.
Tabs per Ziehen umsortieren?Vorschlag: nicht in diesem Issue.
Grenze für offene Tabs?Vorschlag: keine, das »-Menü fängt den Rest.
Schnitt.Vorschlag: ein Issue, zwei Commits. Erst Dokumente, Leiste, Schließen und Ansicht pro Dokument, dann Merken pro Projekt und die Tastatur.
Wenn du die Fragen beantwortet hast (auch pauschal „alle Vorschläge passen“), lege ich los.
## Konzept: Tab = offenes Dokument
Noch nichts gebaut. Erst der Befund aus dem Code, dann der Entwurf, dann die Fragen, die du entscheiden musst.
### Wie es heute gebaut ist (die Stellen, an denen der Umbau hängt)
- **12 feste Tabs** (`TAB_ORDER` in `src/editor/Editor.ts`): Scene, Game, Behavior, State machine, Shader, Particles, Texture, Animation, Tile, Container, List, Plugins. Dazu hängen Plugins eigene Tabs hinten an (`api.tabs.add`).
- **Neun davon sind ein einziges Editor-Exemplar pro Art** (`AssetTabEditor`), das der **globalen Auswahl folgt**: Wählt man irgendwo ein Behavior aus, springt der Behavior-Tab still auf dieses Behavior, auch wenn man ihn gerade nicht ansieht. Im Kopf jedes Tabs steht ein Picker, mit dem man innerhalb des Tabs das Asset wechselt.
- **Öffnen** ist heute Auswahl plus Tabwechsel (`openAsset` → Ereignis `open` → `showTab`). Wählt man einen Node, ein Frame oder ein Objekt in einem Container aus, schaltet der Editor ebenfalls auf den passenden Tab.
- **Jeder Canvas setzt beim Asset-Wechsel seine Ansicht zurück** (Fit, Zoom, Scroll, beim Tile die Zeit). Mit Dokument-Tabs wäre das bei jedem Tabwechsel zu sehen.
- **Der List-Tab zeigt kein Asset**, sondern eine Liste in einer Variablen (`ListSlot`, an einem Objekt oder Asset). **Der Plugins-Tab ist Verwaltung**, auch kein Asset.
- **Plugin-Tabs** (#117) werden beim Einschalten sofort gebaut (`create()`), ihre Id darf mit keiner eingebauten kollidieren (`hasTab`).
- Undo und Inspector sind global und bleiben es.
- Einstellungen „wie du arbeitest“ liegen im `localStorage` des Browsers (`settings.ts`), nie in der Projektdatei.
### Entwurf
**1. Die Leiste.** `[Scene] [Game] [Plugin-Tabs…] | [offene Dokumente…] [»]`. Scene und Game sind fest und nicht schließbar. Das `»`-Menü aus #84 bleibt und nimmt auf, was nicht passt. Der aktive Tab ist weiter immer sichtbar.
**2. Ein Dokument ist ein Asset oder eine Liste.** Behavior, State machine, Shader, Particles, Texture, Animation, Tile und Container öffnen sich als Dokument, dazu eine Liste über ihren Knopf an der Variablen. Szenen bleiben, wie sie sind: Der Scene-Tab zeigt die aktive Szene, gewechselt wird über die Toolbar.
**3. Öffnen.** Doppelklick oder Enter im Asset-Panel, ein neu angelegtes Asset und der Listen-Knopf öffnen ein Dokument. Ist es schon offen, wird sein Tab aktiv, sonst kommt ein neuer Tab **rechts neben dem aktiven** dazu. Ein einfacher Klick im Asset-Panel zeigt wie heute nur den Inspector.
**4. Ein Dokument-Tab zeigt immer sein Asset.** Er folgt nicht mehr der Auswahl, der Picker im Tab-Kopf entfällt (der Name steht ja im Tab). Wählt man einen Node, ein Frame oder ein Container-Objekt aus, wird der Tab seines Dokuments aktiv.
**5. Schließen** mit dem x am Tab oder per Mittelklick. Dabei geht nichts verloren, jede Änderung steckt schon im Modell und wird automatisch gespeichert. Schließt man den aktiven Tab, wird der linke Nachbar aktiv, sonst Scene. Wird ein Asset gelöscht, geht sein Tab mit zu.
**6. Ansicht pro Dokument.** Zoom, Scroll und Fit merkt sich jeder Tab für die Sitzung. Wer zwischen zwei Texturen hin- und herschaltet, findet beide so wieder, wie er sie verlassen hat.
**7. Technisch: ein Editor pro Art, der beim Tabwechsel umgehängt wird**, nicht ein Editor pro Tab. Jeder Editor hängt an den State-Ereignissen und baut eigene Pixi-Container, 20 offene Tabs wären sonst 20 Graph-Canvases, die bei jeder Änderung mitlaufen. `AssetTabEditor` wird damit vom „Folger der Auswahl“ zum „Anzeiger eines Dokuments“, dazu kommt ein kleiner Ansichtsspeicher pro Dokument. Die Regel, welcher Tab wohin kommt und welcher nach dem Schließen aktiv wird, kommt als reine Funktion neben `tabRowLayout`, damit sie ohne Browser testbar ist.
**8. Merken pro Projekt.** Offene Dokumente, ihre Reihenfolge und der aktive Tab kommen in den `localStorage`, pro Projekt-Id, **nicht** in die Projektdatei (gleiche Begründung wie `settings.ts`: Das ist deine Arbeitsweise, nicht dein Spiel). Beim Laden fehlt ein inzwischen gelöschtes Asset still.
**9. Tastatur.** Eine Tastenkombination wechselt reihum durch **alle** offenen Tabs, auch durch die im `»`-Menü. Ein so erreichter Tab kommt in die Leiste. Damit ist die Grenze aus #84 weg. Der Browser hält einige Kombinationen fest (`Ctrl+Tab`, `Ctrl+W`, `Ctrl+PageUp/PageDown` bekommt eine Seite in Chrome nicht). Welche Kombination geht, messe ich vor dem Bau in Chrome und Firefox.
**10. Plugins (#117, #121).** Ein Plugin-Tab ist ein Werkzeug, kein Dokument: Er bleibt fest in der Leiste, solange das Plugin an ist, genau wie heute. `api.tabs.add` ändert sich nicht, `PLUGIN_API_VERSION` bleibt bei 1, #121 ist davon unberührt. Die eingebauten Ids bleiben für `hasTab` reserviert, damit ein altes Plugin nicht plötzlich eine Id belegt, die es vorher nicht bekam. Der **Plugins-Verwaltungstab** wird ein Dokument ohne Asset: Man öffnet ihn über das Projektmenü, und er lässt sich schließen. Dokument-Tabs für Plugins (`api.tabs.open`) wären ein eigenes Issue, falls je gewünscht.
### Was sich für dich ändert
- Nach dem Laden stehen nur Scene, Game und die gemerkten Tabs da. „Texture anklicken und die zuletzt gewählte sehen“ gibt es nicht mehr, dafür Doppelklick im Asset-Panel.
- Die Leiste wächst mit deiner Arbeit, nicht mit der Zahl der Asset-Arten.
### Aufwand und Tests
- **Groß:** `Editor.ts`, `AssetTabEditor` und die neun Editoren darauf, `TabStrip` (x-Knopf, Mittelklick), die Öffnen-Wege im State, der Test-Hook.
- **e2e:** 25 von 44 Modulen schalten heute über `__gm.showTab('texture')` und Co. Der Hook bleibt als Kompatibilitätsweg („zeig das Dokument dieser Art, das zur Auswahl passt“), damit nicht 25 Module auf einmal umgeschrieben werden. Neue Checks bekommen ein neues Modul: Öffnen, Schließen, Ansicht behalten, Merken nach Neuladen, Tastatur, Überlauf.
- **Wiki:** Concepts (die Tab-Leiste), Scene editing, Keyboard, Plugins, Architecture.
### Offene Fragen (jeweils mit Vorschlag)
1. **Vorschau-Tab wie in VS Code** (ein einfacher Klick öffnet einen vorläufigen Tab, der vom nächsten Klick ersetzt wird)? **Vorschlag: nein.** Ein Klick zeigt wie heute nur den Inspector.
2. **Dasselbe Asset zweimal offen** (zum Beispiel nebeneinander)? **Vorschlag: nein**, ein Tab pro Dokument, kein geteiltes Fenster.
3. **Beschriftung.** Im selben Projekt heißen oft mehrere Assets gleich (Sprite, Behavior und Animation „Player“). **Vorschlag:** Name plus die Art in gedämpfter Schrift davor („Behavior · Player“). Alternative: die Art nur bei Namensgleichheit.
4. **Doppelklick auf einen Call-Node:** Heute wechselt der Behavior-Tab das Behavior und die Brotkrumen-Leiste merkt sich den Weg. **Vorschlag:** gleich lassen, also im selben Tab weiter, mit Brotkrumen. Alternative: ein neuer Tab pro Behavior, dann entfällt die Brotkrumen-Leiste.
5. **Szenen als Dokumente** (mehrere Szenen gleichzeitig offen)? **Vorschlag: nein**, Scene bleibt fester Tab mit der Szenenwahl in der Toolbar. Das wäre ein eigenes Issue.
6. **Plugin-Tabs fest oder schließbar?** **Vorschlag: fest**, solange das Plugin an ist (siehe Punkt 10).
7. **Plugins-Verwaltung** über das Projektmenü als schließbarer Tab? **Vorschlag: ja.**
8. **Tab-Wechsel per Tastatur.** **Vorschlag:** eine Kombination, die ich vorher in Chrome und Firefox messe. Hast du schon eine Vorliebe?
9. **Wiederherstellen beim Laden:** die gemerkten Tabs öffnen oder immer nur Scene? **Vorschlag: wiederherstellen**, so steht es im Issue.
10. **Ansicht (Zoom, Scroll) nur für die Sitzung oder mit den Tabs zusammen merken?** **Vorschlag: nur Sitzung**, nach dem Neuladen wird gefittet wie heute.
11. **Tabs per Ziehen umsortieren?** **Vorschlag: nicht in diesem Issue.**
12. **Grenze für offene Tabs?** **Vorschlag: keine**, das `»`-Menü fängt den Rest.
13. **Schnitt.** **Vorschlag:** ein Issue, zwei Commits. Erst Dokumente, Leiste, Schließen und Ansicht pro Dokument, dann Merken pro Projekt und die Tastatur.
Wenn du die Fragen beantwortet hast (auch pauschal „alle Vorschläge passen“), lege ich los.
Deine Antworten aus dem Kommentar oben sind eingebaut. Tastenkombination und Wiederherstellen der Tabs nach dem Laden sind wie gewünscht nicht gebaut, deshalb ein Commit statt zwei.
Was sich ändert
Feste Tabs: Scene, Game und Plugins, nicht schließbar (Antwort 7). Plugin-Tabs stehen dahinter.
Dokumente: Jedes andere Asset öffnet einen eigenen Tab: Doppelklick oder Enter im Asset-Panel, beim Anlegen oder über den Listen-Knopf. Mehrere Assets derselben Art können gleichzeitig offen sein.
Beschriftung: Art gedämpft vor dem Namen (Behavior Player), bei 160 px mit … gekürzt, beim Umbenennen des Assets nachgezogen.
Auswahl: Ein Tab zeigt immer sein eigenes Dokument, der Picker im Tab-Kopf ist weg. Wird ein Node, Frame oder Container-Objekt ausgewählt, kommt der Tab des passenden Dokuments nach vorn.
Schließen: × oder Mittelklick. Wird ein Asset gelöscht, geht sein Tab mit zu.
Zoom und Scroll merkt sich jedes Dokument für die Sitzung, beim Schließen wird die Ansicht verworfen.
Call-Node: Doppelklick bleibt im selben Tab (Antwort 4), die Brotkrumen gehören zum Tab.
Technisch: ein Editor pro Art, der beim Tabwechsel auf das Dokument umgehängt wird. Die Regeln (wohin ein neuer Tab kommt, welcher nach dem Schließen aktiv wird) stehen in der reinen Funktion src/editor/documents.ts.
Abweichend vom Konzept, selbst entschieden
Schließen des ersten Tabs: Dann wird der rechte Nachbar aktiv, erst ohne offene Dokumente die Szene.
Neuer Tab bei aktivem festen Tab (Scene, Game, Plugins): kommt ans Ende der Leiste.
List bleibt ein Dokument, weil der State nur einen Listen-Slot kennt. Der Tab heißt z. B. List Listy · nums.
Der volle e2e-Lauf lief ausnahmsweise lokal, weil der Umbau betrifft, wie jeder Asset-Tab erreicht wird. Die Smokes der Beispielspiele liefen nicht lokal.
11 neue Unit-Tests für documents.ts, Gegenprobe mit 8 eingebauten Fehlern: alle gefangen.
Angepasst: Module 06, 14, 16, 19, 21, 38. Der Test-Hook __gm.showTab(...) bleibt als Kompatibilitätsweg und öffnet das Dokument zur Auswahl.
Unterwegs gefunden und behoben: Beim Folgen in einen Call stellte der Tab die Ansicht eines früheren Besuchs wieder her, der Graph rutschte unter die Brotkrumen (19j).
CI zu cc285af läuft noch, die Summe 1085 ist lokal gemessen, von CI noch nicht bestätigt.
Doku
Wiki a95b3ef: Concepts (neuer Abschnitt The tab row), Behaviors, Containers, Animations, Tiles, Plugins, Architecture, Development. Check-Summe 1085 in README und Wiki.
## Umgesetzt in `cc285af`
Deine Antworten aus dem Kommentar oben sind eingebaut. Tastenkombination und Wiederherstellen der Tabs nach dem Laden sind wie gewünscht **nicht** gebaut, deshalb ein Commit statt zwei.
### Was sich ändert
- **Feste Tabs:** Scene, Game und Plugins, nicht schließbar (Antwort 7). Plugin-Tabs stehen dahinter.
- **Dokumente:** Jedes andere Asset öffnet einen eigenen Tab: Doppelklick oder Enter im Asset-Panel, beim Anlegen oder über den Listen-Knopf. Mehrere Assets derselben Art können gleichzeitig offen sein.
- **Beschriftung:** Art gedämpft vor dem Namen (`Behavior Player`), bei 160 px mit `…` gekürzt, beim Umbenennen des Assets nachgezogen.
- **Auswahl:** Ein Tab zeigt immer sein eigenes Dokument, der Picker im Tab-Kopf ist weg. Wird ein Node, Frame oder Container-Objekt ausgewählt, kommt der Tab des passenden Dokuments nach vorn.
- **Schließen:** × oder Mittelklick. Wird ein Asset gelöscht, geht sein Tab mit zu.
- **Zoom und Scroll** merkt sich jedes Dokument für die Sitzung, beim Schließen wird die Ansicht verworfen.
- **Call-Node:** Doppelklick bleibt im selben Tab (Antwort 4), die Brotkrumen gehören zum Tab.
- **Technisch:** ein Editor pro Art, der beim Tabwechsel auf das Dokument umgehängt wird. Die Regeln (wohin ein neuer Tab kommt, welcher nach dem Schließen aktiv wird) stehen in der reinen Funktion `src/editor/documents.ts`.
### Abweichend vom Konzept, selbst entschieden
- **Schließen des ersten Tabs:** Dann wird der **rechte** Nachbar aktiv, erst ohne offene Dokumente die Szene.
- **Neuer Tab bei aktivem festen Tab** (Scene, Game, Plugins): kommt ans Ende der Leiste.
- **List** bleibt *ein* Dokument, weil der State nur einen Listen-Slot kennt. Der Tab heißt z. B. `List Listy · nums`.
### Tests
```
npm run check → 112 Files, 1607 Tests (vorher 1596), CHECK EXIT 0
node tools/e2e.mjs (alle 44 Module) → ALL PASSED – 1085 checks (vorher 1076)
```
- Der volle e2e-Lauf lief ausnahmsweise lokal, weil der Umbau betrifft, wie jeder Asset-Tab erreicht wird. Die Smokes der Beispielspiele liefen nicht lokal.
- **11 neue Unit-Tests** für `documents.ts`, Gegenprobe mit 8 eingebauten Fehlern: alle gefangen.
- **Neues e2e-Modul 44 `documents`** (11 Checks): echte Doppelklicks, Zoom bleibt beim Tabwechsel, ×, Mittelklick, Umbenennen, Löschen.
- Angepasst: Module 06, 14, 16, 19, 21, 38. Der Test-Hook `__gm.showTab(...)` bleibt als Kompatibilitätsweg und öffnet das Dokument zur Auswahl.
- Unterwegs gefunden und behoben: Beim Folgen in einen Call stellte der Tab die Ansicht eines früheren Besuchs wieder her, der Graph rutschte unter die Brotkrumen (19j).
**CI zu `cc285af` läuft noch**, die Summe 1085 ist lokal gemessen, von CI noch nicht bestätigt.
### Doku
Wiki `a95b3ef`: Concepts (neuer Abschnitt *The tab row*), Behaviors, Containers, Animations, Tiles, Plugins, Architecture, Development. Check-Summe 1085 in README und Wiki.
Suite (Task 155): ALL PASSED – 1085 checks, Smokes 24 / 19 / 21
Die Summe 1085 aus dem Abschlusskommentar ist damit bestätigt.
## Nachtrag CI zu `cc285af`
Grün, Job-Logs selbst gelesen:
- Gate (Task 154): 112 Testdateien grün, `CHECK EXIT 0`
- Suite (Task 155): `ALL PASSED – 1085 checks`, Smokes 24 / 19 / 21
Die Summe 1085 aus dem Abschlusskommentar ist damit bestätigt.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Aus #84 („Die elegantere Möglichkeit … ist nicht gebaut: … der Wechsel von ‚Tab = Werkzeug‘ zu ‚Tab = offenes Dokument‘ … Wenn du das willst, gehört es in ein eigenes Issue“). Dort steht auch als Grenze: Der Tab-Wechsel per Tastatur erreicht Tabs im
»-Menü nicht.Befund
»-Überlaufmenü aus #84 fängt das nur ab.Zu bauen (Vorschlag)
Offen (mit Vorschlag)
alles klar, dann mit Konzept und offene Fragen die sich daraus ergeben hier antworten
Konzept: Tab = offenes Dokument
Noch nichts gebaut. Erst der Befund aus dem Code, dann der Entwurf, dann die Fragen, die du entscheiden musst.
Wie es heute gebaut ist (die Stellen, an denen der Umbau hängt)
TAB_ORDERinsrc/editor/Editor.ts): Scene, Game, Behavior, State machine, Shader, Particles, Texture, Animation, Tile, Container, List, Plugins. Dazu hängen Plugins eigene Tabs hinten an (api.tabs.add).AssetTabEditor), das der globalen Auswahl folgt: Wählt man irgendwo ein Behavior aus, springt der Behavior-Tab still auf dieses Behavior, auch wenn man ihn gerade nicht ansieht. Im Kopf jedes Tabs steht ein Picker, mit dem man innerhalb des Tabs das Asset wechselt.openAsset→ Ereignisopen→showTab). Wählt man einen Node, ein Frame oder ein Objekt in einem Container aus, schaltet der Editor ebenfalls auf den passenden Tab.ListSlot, an einem Objekt oder Asset). Der Plugins-Tab ist Verwaltung, auch kein Asset.create()), ihre Id darf mit keiner eingebauten kollidieren (hasTab).localStoragedes Browsers (settings.ts), nie in der Projektdatei.Entwurf
1. Die Leiste.
[Scene] [Game] [Plugin-Tabs…] | [offene Dokumente…] [»]. Scene und Game sind fest und nicht schließbar. Das»-Menü aus #84 bleibt und nimmt auf, was nicht passt. Der aktive Tab ist weiter immer sichtbar.2. Ein Dokument ist ein Asset oder eine Liste. Behavior, State machine, Shader, Particles, Texture, Animation, Tile und Container öffnen sich als Dokument, dazu eine Liste über ihren Knopf an der Variablen. Szenen bleiben, wie sie sind: Der Scene-Tab zeigt die aktive Szene, gewechselt wird über die Toolbar.
3. Öffnen. Doppelklick oder Enter im Asset-Panel, ein neu angelegtes Asset und der Listen-Knopf öffnen ein Dokument. Ist es schon offen, wird sein Tab aktiv, sonst kommt ein neuer Tab rechts neben dem aktiven dazu. Ein einfacher Klick im Asset-Panel zeigt wie heute nur den Inspector.
4. Ein Dokument-Tab zeigt immer sein Asset. Er folgt nicht mehr der Auswahl, der Picker im Tab-Kopf entfällt (der Name steht ja im Tab). Wählt man einen Node, ein Frame oder ein Container-Objekt aus, wird der Tab seines Dokuments aktiv.
5. Schließen mit dem x am Tab oder per Mittelklick. Dabei geht nichts verloren, jede Änderung steckt schon im Modell und wird automatisch gespeichert. Schließt man den aktiven Tab, wird der linke Nachbar aktiv, sonst Scene. Wird ein Asset gelöscht, geht sein Tab mit zu.
6. Ansicht pro Dokument. Zoom, Scroll und Fit merkt sich jeder Tab für die Sitzung. Wer zwischen zwei Texturen hin- und herschaltet, findet beide so wieder, wie er sie verlassen hat.
7. Technisch: ein Editor pro Art, der beim Tabwechsel umgehängt wird, nicht ein Editor pro Tab. Jeder Editor hängt an den State-Ereignissen und baut eigene Pixi-Container, 20 offene Tabs wären sonst 20 Graph-Canvases, die bei jeder Änderung mitlaufen.
AssetTabEditorwird damit vom „Folger der Auswahl“ zum „Anzeiger eines Dokuments“, dazu kommt ein kleiner Ansichtsspeicher pro Dokument. Die Regel, welcher Tab wohin kommt und welcher nach dem Schließen aktiv wird, kommt als reine Funktion nebentabRowLayout, damit sie ohne Browser testbar ist.8. Merken pro Projekt. Offene Dokumente, ihre Reihenfolge und der aktive Tab kommen in den
localStorage, pro Projekt-Id, nicht in die Projektdatei (gleiche Begründung wiesettings.ts: Das ist deine Arbeitsweise, nicht dein Spiel). Beim Laden fehlt ein inzwischen gelöschtes Asset still.9. Tastatur. Eine Tastenkombination wechselt reihum durch alle offenen Tabs, auch durch die im
»-Menü. Ein so erreichter Tab kommt in die Leiste. Damit ist die Grenze aus #84 weg. Der Browser hält einige Kombinationen fest (Ctrl+Tab,Ctrl+W,Ctrl+PageUp/PageDownbekommt eine Seite in Chrome nicht). Welche Kombination geht, messe ich vor dem Bau in Chrome und Firefox.10. Plugins (#117, #121). Ein Plugin-Tab ist ein Werkzeug, kein Dokument: Er bleibt fest in der Leiste, solange das Plugin an ist, genau wie heute.
api.tabs.addändert sich nicht,PLUGIN_API_VERSIONbleibt bei 1, #121 ist davon unberührt. Die eingebauten Ids bleiben fürhasTabreserviert, damit ein altes Plugin nicht plötzlich eine Id belegt, die es vorher nicht bekam. Der Plugins-Verwaltungstab wird ein Dokument ohne Asset: Man öffnet ihn über das Projektmenü, und er lässt sich schließen. Dokument-Tabs für Plugins (api.tabs.open) wären ein eigenes Issue, falls je gewünscht.Was sich für dich ändert
Aufwand und Tests
Editor.ts,AssetTabEditorund die neun Editoren darauf,TabStrip(x-Knopf, Mittelklick), die Öffnen-Wege im State, der Test-Hook.__gm.showTab('texture')und Co. Der Hook bleibt als Kompatibilitätsweg („zeig das Dokument dieser Art, das zur Auswahl passt“), damit nicht 25 Module auf einmal umgeschrieben werden. Neue Checks bekommen ein neues Modul: Öffnen, Schließen, Ansicht behalten, Merken nach Neuladen, Tastatur, Überlauf.Offene Fragen (jeweils mit Vorschlag)
»-Menü fängt den Rest.Wenn du die Fragen beantwortet hast (auch pauschal „alle Vorschläge passen“), lege ich los.
sonst passen die vorschläge
Umgesetzt in
cc285afDeine Antworten aus dem Kommentar oben sind eingebaut. Tastenkombination und Wiederherstellen der Tabs nach dem Laden sind wie gewünscht nicht gebaut, deshalb ein Commit statt zwei.
Was sich ändert
Behavior Player), bei 160 px mit…gekürzt, beim Umbenennen des Assets nachgezogen.src/editor/documents.ts.Abweichend vom Konzept, selbst entschieden
List Listy · nums.Tests
documents.ts, Gegenprobe mit 8 eingebauten Fehlern: alle gefangen.documents(11 Checks): echte Doppelklicks, Zoom bleibt beim Tabwechsel, ×, Mittelklick, Umbenennen, Löschen.__gm.showTab(...)bleibt als Kompatibilitätsweg und öffnet das Dokument zur Auswahl.CI zu
cc285afläuft noch, die Summe 1085 ist lokal gemessen, von CI noch nicht bestätigt.Doku
Wiki
a95b3ef: Concepts (neuer Abschnitt The tab row), Behaviors, Containers, Animations, Tiles, Plugins, Architecture, Development. Check-Summe 1085 in README und Wiki.Nachtrag CI zu
cc285afGrün, Job-Logs selbst gelesen:
CHECK EXIT 0ALL PASSED – 1085 checks, Smokes 24 / 19 / 21Die Summe 1085 aus dem Abschlusskommentar ist damit bestätigt.