4.5 KiB
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: zeigtpresentationDynamicCaptionundpresentationDynamicText.- Show-Song-ID: rendert
app-song-textmit 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.jpggreen:assets/bg-dark-green.jpgleder:assets/bg-leder.jpgpraise:assets/bg-praise.jpgbible: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.