Der Simulator läuft wieder. Ich habe alles durchgeklickt, was ich dir in den letzten beiden Runden ungeprüft gegeben habe. Es war nicht in Ordnung. **Zwei Navigationsleisten übereinander.** Auf dem iPhone hat die Leiste unten fünf Plätze; alles darüber schiebt das System in ein „Mehr"-Verzeichnis — und dessen Einträge bekamen zwei Zurück-Pfeile, einen vom System und einen von uns. Statt das zu flicken, gibt es jetzt die **Bibliothek**, die du ohnehin wolltest: auf dem iPhone ein Eintrag, hinter dem alle Mediatheken stehen, auf dem iPad weiter jede einzeln in der Seitenleiste. Damit bleibt die Leiste bei fünf Einträgen, und das „Mehr" entfällt. **Kacheln in der Mediathek öffneten nichts.** Kein Fehler, keine Meldung — Antippen führte einfach ins Leere. Der Grund: in einem Stapel dürfen nicht beide Arten von Verknüpfung nebeneinander vorkommen. Sobald ein Bildschirm über eine **Ansichts**-Verknüpfung geschoben wurde, fanden die **Wert**-Verknüpfungen darin ihr Ziel nicht mehr. Jetzt ist alles wertbasiert, und das Ziel für Detailseiten steht **einmal je Stapel** an dessen Wurzel statt in jedem Bildschirm einzeln. **Der Lupenknopf in der Kopfzeile zeigte auf ein Ziel, das es nie gab.** Kein Bildschirm hat je ein `SearchRoute`-Ziel angemeldet — der Knopf tat seit jeher nichts. Er ist weg; die Suche hat ihren eigenen Platz in der Leiste. **Der Download-Dialog zeigte Schlüssel statt Namen** — „quality.hd" statt „720p". Die drei Übersetzungen fehlten schlicht. **Die Kontokarte wuchs aus dem Bild heraus.** Die Leiste unten in der Seitenleiste hat eine feste Höhe; meine aufklappende Karte schob die Zeile mit dem Namen nach unten hinaus. Jetzt hängt sie als Popover darüber — die Zeile bleibt stehen, wie bei JellyTV. Verkleinerte Downloads bei Jellyfin laufen: Stufen erscheinen, die Adresse stimmt, die Datei kommt an. Dass die Attrappe nur 28 kB liefert und die App das als „keine Videodatei" zurückweist, ist richtig so — die Prüfung tut, was sie soll. Zwei Gruben in der Attrappe nebenbei gestopft: sie kannte `/stream.mp4` nicht und meldete ihr Testbild als 360p, womit es gar keine kleineren Stufen geben konnte. 263 Tests grün. Diesmal alles angesehen: iPhone und iPad, Einstellungen, Bibliothek, Detailseite, Download-Dialog, Kontokarte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
61 lines
2.2 KiB
Swift
61 lines
2.2 KiB
Swift
import SwiftUI
|
|
import FlixyDesign
|
|
import MediaKit
|
|
|
|
/// Alle Mediatheken auf einem Bildschirm.
|
|
///
|
|
/// Auf dem iPad hat die Seitenleiste Platz für jede Mediathek einzeln. Auf dem
|
|
/// iPhone hat die Leiste unten fünf Plätze — und sobald es mehr Ziele gibt,
|
|
/// schiebt das System den Rest in ein „Mehr"-Verzeichnis. Das sah nicht nur
|
|
/// gedrängt aus, es war kaputt: die Einträge dort bekamen **zwei**
|
|
/// Navigationsleisten übereinander, eine vom System und eine von uns.
|
|
///
|
|
/// Dieser Bildschirm fasst sie zu einem Ziel zusammen. Damit bleibt die Leiste
|
|
/// unter fünf Einträgen, und die Mediatheken stehen trotzdem alle da — mit
|
|
/// mehr Platz für ihre Namen, als eine Leiste je hätte.
|
|
struct LibraryHubView: View {
|
|
@Environment(FlixySession.self) private var session
|
|
@Environment(\.flixyAccent) private var accent
|
|
|
|
var body: some View {
|
|
List {
|
|
if session.libraries.isEmpty {
|
|
Text("libraryHub.empty")
|
|
.foregroundStyle(Color.flixyTextSecondary)
|
|
.listRowBackground(Color.flixySurface)
|
|
} else {
|
|
Section("sidebar.libraries") {
|
|
ForEach(session.libraries) { library in
|
|
NavigationLink(value: LibraryRoute(id: library.id)) {
|
|
Label(library.title, systemImage: symbol(for: library.kind))
|
|
}
|
|
.listRowBackground(Color.flixySurface)
|
|
}
|
|
}
|
|
}
|
|
|
|
if session.supportsLiveTV {
|
|
Section {
|
|
NavigationLink(value: LiveTVRoute()) {
|
|
Label("sidebar.liveTV", systemImage: "dot.radiowaves.left.and.right")
|
|
}
|
|
.listRowBackground(Color.flixySurface)
|
|
}
|
|
}
|
|
}
|
|
.tint(accent)
|
|
.scrollContentBackground(.hidden)
|
|
.background(Color.flixyCanvas)
|
|
.navigationTitle(Text("sidebar.library"))
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
}
|
|
|
|
private func symbol(for kind: MediaLibrary.Kind) -> String {
|
|
switch kind {
|
|
case .movie: "film"
|
|
case .show: "tv"
|
|
default: "rectangle.stack"
|
|
}
|
|
}
|
|
}
|