Files
wgenerator/docs/pages/presentation-monitor.md
T
2026-05-15 11:03:02 +02:00

83 lines
4.5 KiB
Markdown

# Seite: Präsentationsmonitor
## Route
`/presentation/monitor`
Die Route öffnet die Vollbildausgabe für Beamer oder Display. Sie wird typischerweise über den Button `Präsentation starten` auf `/presentation/remote` geöffnet.
## Zweck
Der Monitor rendert den aktuellen Präsentationszustand der aktiven Show. Er zeigt Titelfolie, leere Fläche, freien Text oder Liedabschnitte und ergänzt bei Liedern die rechtlichen Angaben.
## Datenfluss
Die `MonitorComponent` liest `global/static.currentShow` über `GlobalSettingsService.get$`. Aus dieser ID lädt sie die Show über `ShowService.read$(showId)` und übernimmt daraus die Live-Felder für Anzeigezustand, Datum, Veranstaltungstyp, Zoom, Hintergrund und freien Text.
Für Song-Inhalte beobachtet der Monitor `presentationSongId`. Bei `title`, `dynamicText` oder fehlender Song-ID wird kein Song gesetzt. Bei anderen Werten lädt er den passenden Show-Song über `ShowSongService.read$(showId, presentationSongId)`.
Konfigurationsdaten für rechtliche Hinweise kommen aus `ConfigService.get$()`. Die Komponente `app-legal` nutzt diese Daten unter anderem für die CCLI-Lizenznummer.
## UI-Anzeige
Beim Initialisieren ruft der Monitor `openFullscreen()` auf. Die Anzeige liegt als fixierte Vollbildfläche über der Anwendung und blendet den Mauszeiger aus.
Der Monitor kennt folgende Zustände:
- `title`: zeigt den übersetzten Veranstaltungstyp und das Datum.
- `empty`: zeigt die leere Präsentationsfläche mit Logo beziehungsweise Hintergrund.
- `dynamicText`: zeigt `presentationDynamicCaption` und `presentationDynamicText`.
- Show-Song-ID: rendert `app-song-text` mit Songtitel, Liedtext und aktivem Abschnitt.
Bei Songs werden Akkorde ausgeblendet (`chordMode="hide"`), Kommentare nicht angezeigt und die interne Abschnittsnavigation des Song-Text-Widgets deaktiviert. Der aktive Abschnitt kommt aus `presentationSection`.
## Zusammenspiel von Remote und Monitor
Der Monitor ist ein reiner Live-Reader. Alle Bedienhandlungen erfolgen in der Remote-Steuerung; der Monitor reagiert auf die Felder, die dort auf der aktiven Show gespeichert werden.
Wenn die Remote `presentationSongId`, `presentationSection`, `presentationZoom`, `presentationBackground`, `presentationDynamicCaption` oder `presentationDynamicText` ändert, aktualisiert der Monitor seine Darstellung über die abonnierten Datenströme. Beim Wechsel der aktiven Show über `/presentation/select` liest der Monitor die neue `currentShow` aus den globalen Settings und richtet die Ausgabe darauf aus.
## Live-Felder auf der Show
Der Monitor wertet folgende Felder aus:
- `presentationSongId`: entscheidet über Titelfolie, Leerseite, freien Text oder Songanzeige.
- `presentationSection`: bestimmt den aktiven Abschnitt im Songtext.
- `presentationDynamicCaption`: Überschrift für den freien Text.
- `presentationDynamicText`: Inhalt für den freien Text; Zeilenumbrüche bleiben durch die Monitor-Styles erhalten.
- `presentationZoom`: wird als Pixelwert auf die Vollbildfläche gesetzt.
- `presentationBackground`: schaltet die Hintergrundgrafik.
Zusätzlich nutzt er `showType` und `date` für die Titelfolie.
## Hintergründe
`presentationBackground` unterstützt diese Werte:
- `none`: schwarzer Hintergrund ohne Bild.
- `blue`: `assets/bg-dark-blue.jpg`
- `green`: `assets/bg-dark-green.jpg`
- `leder`: `assets/bg-leder.jpg`
- `praise`: `assets/bg-praise.jpg`
- `bible`: `assets/bg-bible.jpg`
Die Bildhintergründe werden vollflächig gerendert, weich eingeblendet und je nach Motiv mit Blur und reduzierter Deckkraft versehen. Bei aktivem Bildhintergrund wird das Logo in Songzuständen vollständig ausgeblendet.
## Rechtliche Angaben
Bei Songanzeige rendert `app-legal` die verfügbaren Metadaten des Songs:
- Künstler
- Label
- Nutzungsbedingungen
- Herkunft
- Liednummer beziehungsweise CCLI-Liednummer
Wenn `song.legalOwner` den Wert `CCLI` hat und Konfiguration geladen ist, wird zusätzlich die CCLI-Lizenznummer aus `ConfigService` angezeigt.
## Technische Besonderheiten
Songwechsel werden um 600 ms verzögert. Vor dem Umschalten setzt die Komponente intern `songId` auf `empty`, damit die `songSwitch`-Animation sauber zwischen den Zuständen wechseln kann. Ein laufender Timeout wird beim nächsten Wechsel oder beim Zerstören der Komponente abgebrochen.
Die Show-Daten werden mit `shareReplay(1)` geteilt, damit die separaten Streams für allgemeine Präsentationsdaten und Song-Ladevorgänge dieselbe Show-Quelle verwenden. Subscriptions werden über `destroy$` beendet.