# U-Studio – Projektstand

## Ziel
Gambas3-GUI zum Konfigurieren eines Ulanzi D200X Stream Decks. Schreibt eine strikte TOML-Konfiguration nach `~/.config/ulanzi-niri/config.toml`, startet/stoppt `ulanzi-niri run` + erkennt Tastendrücke live.

## Status (28.06.2026)
- **Funktionsfähig** – App kompiliert, Buttons 0..14 werden als 3×5-Raster angezeigt
- **Live-Erkennung:** `ulanziread` liest von `/dev/hidraw5` (parallel zu `ulanzi-niri run`) und schreibt Tastencode nach `/tmp/ulanzi-buttons`; Timer pollt alle 200ms und selektiert den Button im GUI
- **Config:** `SaveConfig()`/`LoadConfig()` schreiben/lesen `[device]`, `[label]`, `[[page]]` mit name + 15 `[[page.button]]` inkl. pos, label, icon, on_press (alle cmdTypes)
- **Seitenverwaltung:** ComboBox + Add/Rename/Delete-Buttons in FMain; `CPage`-Klasse für Seite+Buttons
- **Button-Editor:** Rechtes Panel in FMain (Label, Bild, Befehl, Vorschau, Übernehmen/Sichern). Funktions-Typ-Buttons (2×5-Raster) statt ComboBox – exec, url, niri, media, keys, screenshot, page, brightness, small_window, noop
- **Seitenauswahl bei "page":** Eigenständiges modales Formular `FPageSelect` mit ListBox + OK/Abbrechen
- **FConfig:** Dialog für Device/Label-Einstellungen, speichert direkt per `FMain.SaveConfig`
- **FMainConfig:** Nicht mehr verwendet – Editor ist komplett in FMain integriert
- **Deck-Start:** `deckstart.sh` killt alte Prozesse, startet `ulanzi-niri run` + `ulanziread /dev/hidraw5`
- **Controls:** Alle Controls sind **statisch im Form** platziert – keine Code-Positionierung mehr

## Bekannte Probleme
- Keine

## Nächste Schritte
- Tests/Wunsch des Users abwarten

## Wichtige Dateien
- `.src/FMain.class` – Hauptlogik (Pages, Grid, Timer, Config, Ulanzi-Prozess, Editor-Panel, Funktions-Buttons)
- `.src/FMain.form` – Form mit CboPage, Add/Del/Ren, Btn0–14, Funktions-Buttons, Editor-Controls, LblTitle, ConfigBtn, LblInfo
- `.src/FMainConfig.class` + `.form` – obsolet, wird nicht mehr verwendet
- `.src/FPageSelect.class` + `.form` – modale Seitenauswahl (ListBox) für "page"-Aktionstyp
- `.src/FConfig.class` + `.form` – Device/Label-Dialog
- `.src/CButtonConfig.class` – Datenklasse (pos, label, icon, cmd[], cmdType)
- `.src/CPage.class` – Datenklasse (name + CButtonConfig[15])
- `ulanziread.c` – C-Binär, liest HID-Report von `/dev/hidraw5`
- `deckstart.sh` – Startet Daemon + Monitor
- `config.toml` – Ziel: `~/.config/ulanzi-niri/config.toml`

## Gambas-Hinweise
- `q = Chr(34)` + `UnquoteStr()` für Anführungszeichen
- `Dialog.OpenFile()` akzeptiert max. 2 Argumente; `gb.form.dialog` nötig
- Bildprüfung auf exakt 196×196 Pixel
- `Format(Now, "nn")` = Minute, `mm` = Monat
- Für dynamische Controls `Dim x As New Type(Parent) As "Prefix"` für Event-Routing verwenden (nicht `Object.Attach`)
- `Choose()` in Gambas ist NICHT der Auswahldialog, sondern `Choose(index, item1, item2, ...)`
