Groesse in vier Stufen, Schrift und Hintergrund als fuenf feste Paare — Weiss, Weiss auf Schwarz, Schwarz auf Weiss, Gelb, Gelb auf Schwarz. Feste Paare statt zweier Regler, weil unabhaengige Achsen unlesbare Mischungen zulassen: Schwarz auf durchsichtig ueber einer Nachtszene ist eine gueltige Einstellung und eine wertlose. Die Uebersetzung nach AVFoundation ist eine Tabelle aus Schluesseln, bei der jeder Fehler lautlos ist — ein falscher Schluessel laesst den Initialisierer `nil` zurueckgeben, und dann gibt es gar keine Regel. Auf dem Bildschirm sieht „keine Regel\" genauso aus wie „Regel ohne Wirkung\". Zehn Tests decken das ab, darunter die drei Fallen: Alpha zuerst in der Farbe, Prozentwert statt Punktgroesse, und der Hintergrund auch fuer „durchsichtig\" ausdruecklich gesetzt statt weggelassen — weggelassen gilt sonst, was Jellyfins WebVTT selbst mitbringt, und das ist oft ein schwarzer Kasten. Als Protokollmethode, nicht als Feld an `PlaybackSource`: die wird einmal beim Oeffnen gelesen, und eine Einstellung, die erst beim naechsten Film wirkt, haelt jeder fuer kaputt. Angewandt wird an zwei Stellen — am laufenden Gegenstand und am frisch angelegten. Nur das erste zu tun hiesse, dass die naechste Folge wieder in der Vorgabe erscheint. VLC erbt die leere Vorgabe. Die Einstellungsseite sagt beides: dass es fuer den Standardplayer gilt, und dass eingebrannte Bilduntertitel von Blu-rays sich nicht gestalten lassen, weil es dort keinen Text gibt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
70 lines
2.4 KiB
Swift
70 lines
2.4 KiB
Swift
import SwiftUI
|
|
import FlixyDesign
|
|
|
|
/// Das farbige Symbol vor einer Einstellungszeile.
|
|
///
|
|
/// Nicht Zierde: in einer Liste aus zehn gleich aussehenden Zeilen findet das
|
|
/// Auge nichts wieder. Eine Farbe je Bereich macht „das mit dem blauen Zahnrad"
|
|
/// zu einer brauchbaren Beschreibung — und genau so sucht man Einstellungen,
|
|
/// die man schon einmal gesehen hat.
|
|
///
|
|
/// Die Farben sind fest und **nicht** die Akzentfarbe: wenn alles die gleiche
|
|
/// Farbe trägt, unterscheidet sie nichts mehr.
|
|
struct SettingsIcon: View {
|
|
let symbol: String
|
|
let colour: Color
|
|
|
|
var body: some View {
|
|
Image(systemName: symbol)
|
|
.font(.caption.weight(.semibold))
|
|
.foregroundStyle(.white)
|
|
.frame(width: 28, height: 28)
|
|
.background(colour.gradient, in: .rect(cornerRadius: 7))
|
|
}
|
|
}
|
|
|
|
/// Die Kopfkarte eines Einstellungsbildschirms.
|
|
///
|
|
/// Sagt in einem Satz, worum es hier geht. Das klingt nach Zierde, ist aber
|
|
/// der Unterschied zwischen „Wiedergabe" und „hier stelle ich ein, wie weit
|
|
/// der Doppeltipp springt" — und erspart das Durchprobieren aller Schalter.
|
|
struct SettingsHeader: View {
|
|
let symbol: String
|
|
let colour: Color
|
|
let title: LocalizedStringKey
|
|
let explanation: LocalizedStringKey
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: FlixySpacing.regular) {
|
|
Image(systemName: symbol)
|
|
.font(.title2.weight(.semibold))
|
|
.foregroundStyle(.white)
|
|
.frame(width: 52, height: 52)
|
|
.background(colour.gradient, in: .rect(cornerRadius: 13))
|
|
|
|
Text(title)
|
|
.font(.flixyTitle)
|
|
.foregroundStyle(Color.flixyTextPrimary)
|
|
|
|
Text(explanation)
|
|
.font(.flixyCaption)
|
|
.foregroundStyle(Color.flixyTextSecondary)
|
|
}
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding(.vertical, FlixySpacing.snug)
|
|
.listRowBackground(Color.flixySurface)
|
|
}
|
|
}
|
|
|
|
/// Die Farben der Bereiche, an einer Stelle.
|
|
enum SettingsPalette {
|
|
static let server = Color.gray
|
|
static let appearance = Color.blue
|
|
static let home = Color.green
|
|
static let playback = Color.pink
|
|
static let languages = Color.teal
|
|
static let subtitles = Color.yellow
|
|
static let downloads = Color.indigo
|
|
static let diagnostics = Color.orange
|
|
}
|