CUE-SZENENLISTE PRO LAYER + macOS-SUPPORT (35/35 E2E, 123 Checks gesamt)
1) Cue-/Szenenliste JE Layer (35/35 E2E): - Cue sichern = Snapshot (Quelle, Alpha, Position, Groesse, Z-Order, FX1/FX2 + Intensitaeten); Name + fade_ms + follow_ms pro Cue - GO vor/zurueck (steps), Goto (Index), Wrap-around am Listenende - FADE: Quellwechsel = dip-to-black (Phase1 runter, Wechsel bei 0, Phase2 hoch; E2E: alpha 0.49 -> 0.32 -> Ziel 0.8), sonst sanfter Tween von Alpha + FX-Intensitaeten; laufende Fades abbrechbar - AUTO-FOLLOW: follow_ms schaltet nach Ablauf automatisch weiter (E2E: Cue mit 600ms -> Wrap zum naechsten) - DMX CUE-GO: cue_go_channel (Settings + UI), steigende Flanke >=128 = GO auf allen Layern; ohne Flanke kein GO (E2E: 0->1, 1==1 bei High-Halten, neue Flanke 1->0); Sequenzfilter aktiv - Cue-Entfernen mit Indexkorrektur; Cues in Projekten speicher-/ladbar (3 Cues nach Projekt-Load erhalten) - UI: Cue-Bereich je Layer (Cue sichern / GO / Zurueck / Goto / Loeschen, aktiver Cue markiert, Fade+Follow-Anzeige) - Fehlerfaelle: unbekannter Layer 400, fehlendes Medium 400, unbekannter Generator 400 2) macOS (Apple Silicon + Intel) mit Skript: - setup_macos.sh: Homebrew installiert python@3.12, python-tk, GStreamer + alle Plugin-Sets + PyGObject; Apple-Silicon-PATH- Hinweis (/opt/homebrew); Erklaerung warum Homebrew statt gstreamer-.pkg (keine PyGObject-Bindings in .pkg) - Bootstrap (--bootstrap): darwin-Zweig mit brew-Installationspfad - run.py --generate-setup erzeugt jetzt 3 Skripte (Windows .ps1 / Linux .sh / macOS .sh); Bash-Syntax geprueft 3) Gefundene + behobene FEHLER: - WEB-UI-ABSTURZ (echter JS-Ternary-Klammerfehler in loadServers, seit Verteilungs-Commit unentdeckt, weil API-Tests den Browser- Code nie parsen): Klammerstruktur korrigiert + JS-Syntax nun per node --check verifizierbar (Syntax OK) + Remote-Buttons robust per data-Attribute (kein Quote-Escaping mehr) - update_layer blockierte Quellwechsel Video->Generator (Cues brauchen beides): Name entscheidet jetzt den Typ, Wechsel in beide Richtungen - Cue-E2E-Timing: dip-to-black hat 2 Phasen (Pruefung 0.2s/0.6s), Auto-Follow-Index-Fix, Art-Net-Sequenznummern im Test inkrementierend (Sequenzfilter verwirft Duplikate korrekt) E2E-Bilanz: Cue 35/35 + Regressionen Projekte 25/25, Verteilung 33/33, App 14/14, FX 16/16 = 123 Checks gruen
This commit is contained in:
@@ -106,6 +106,13 @@ class EngineServer:
|
||||
self._json(engine.fx_catalog())
|
||||
elif path == "/api/generators":
|
||||
self._json({"items": engine.generators()})
|
||||
elif path == "/api/layers/cues":
|
||||
lid = int((query.get("id") or [-1])[0])
|
||||
data = engine.layer_cues(lid)
|
||||
if data is None:
|
||||
self._send_error_json(404, engine.last_error)
|
||||
else:
|
||||
self._json(data)
|
||||
elif path == "/api/servers":
|
||||
out = []
|
||||
for s_ in settings.get("servers", []):
|
||||
@@ -153,6 +160,38 @@ class EngineServer:
|
||||
self._send_error_json(400, engine.last_error or "?" )
|
||||
else:
|
||||
self._json({"layer": layer})
|
||||
elif path == "/api/layers/cues/add":
|
||||
body = self._read_json()
|
||||
cue = engine.add_cue(int(body.get("id", -1)), body)
|
||||
if cue is None:
|
||||
self._send_error_json(400, engine.last_error or "?")
|
||||
else:
|
||||
self._json({"cue": cue})
|
||||
elif path == "/api/layers/cues/remove":
|
||||
body = self._read_json()
|
||||
ok = engine.remove_cue(int(body.get("id", -1)),
|
||||
int(body.get("cue_id", -1)))
|
||||
if not ok:
|
||||
self._send_error_json(
|
||||
404, "Cue/Layer nicht gefunden")
|
||||
else:
|
||||
self._json({"removed": True})
|
||||
elif path == "/api/layers/cues/go":
|
||||
body = self._read_json()
|
||||
r = engine.cue_go(int(body.get("id", -1)),
|
||||
int(body.get("steps", 1)))
|
||||
if r is None:
|
||||
self._send_error_json(400, engine.last_error or "?")
|
||||
else:
|
||||
self._json(r)
|
||||
elif path == "/api/layers/cues/goto":
|
||||
body = self._read_json()
|
||||
r = engine.cue_goto(int(body.get("id", -1)),
|
||||
int(body.get("index", -1)))
|
||||
if r is None:
|
||||
self._send_error_json(400, engine.last_error or "?")
|
||||
else:
|
||||
self._json(r)
|
||||
elif path == "/api/layers/add-generator":
|
||||
body = self._read_json()
|
||||
layer = engine.add_generator(
|
||||
|
||||
Reference in New Issue
Block a user