Files
Flaro/FlixyTV/Views/TVShell.swift
T
ScarriffleandClaude Opus 5 41719595b9 Mediatheken nach oben — und das Regal sagt endlich, was es sieht
**Die Mediatheken sind Reiter geworden.** Sie standen unten auf der
Startseite, und dorthin musste man erst scrollen — an allen Vorschlägen
vorbei, obwohl „ich will in die Filme" genau der Fall ist, in dem einem
die Vorschläge egal sind. Damit fällt die Reihe unten weg: zwei Wege zum
selben Raster sind auf einem Fernseher kein Komfort, sondern eine Frage,
welcher der richtige ist.

Die Leiste liest sich jetzt „Start · Filme · Serien · Gemischtes ·
Suchen" und wird von tvOS mittig gehalten, egal wie viele Mediatheken
dazukommen. Die Stelle der Suche bestimmt Apple, nicht diese Datei:
`role: .search` setzt sie dorthin, wo sie in jeder anderen App auch
steht, und gibt ihr die Lupe.

**Und eine Statuszeile fürs Regal.** Bleibt es leer, gibt es genau drei
Möglichkeiten: die App-Gruppe fehlt, die Datei ist nicht da, oder sie ist
da und das System fragt trotzdem nicht. Von aussen sehen alle drei gleich
aus — nämlich nach dem grossen Plakat aus dem Asset-Katalog. Nach zwei
Runden Vermuten steht unten links jetzt, welcher Fall es ist: „3 Reihen,
9 Einträge, zuletzt 21:55" oder eben „Keine App-Gruppe".

Nur im Entwicklerbau (`#if DEBUG`) und als Überlagerung, nicht als letzte
Zeile der Liste: dorthin müsste man erst an allen Reihen vorbeiscrollen,
und wer nachsieht, warum das Regal leer ist, soll es sofort sehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-29 21:56:31 +02:00

66 lines
2.3 KiB
Swift

import SwiftUI
import FlixyDesign
import MediaKit
/// Start, die Mediatheken und die Suche nebeneinander.
///
/// **Die Mediatheken als Reiter, nicht als Reihe.** Sie standen unten auf der
/// Startseite, und dorthin musste man erst scrollen — an allen Vorschlägen
/// vorbei, obwohl „ich will in die Filme" genau der Fall ist, in dem einem
/// die Vorschläge egal sind. Oben sind sie einen Wisch entfernt.
///
/// Damit fällt die Reihe unten weg: zwei Wege zum selben Raster sind auf
/// einem Fernseher kein Komfort, sondern eine Frage, welcher der richtige ist.
struct TVShell: View {
@Binding var deepLinkTarget: MediaRoute?
@Environment(FlixySession.self) private var session
/// Welcher Reiter offen ist.
///
/// Ausdrücklich gehalten, nicht dem System überlassen: ein Link aus dem
/// Regal über der App führt immer zur Startseite, und stünde gerade die
/// Suche offen, passierte sichtbar nichts.
@State private var reiter = Reiter.start
private enum Reiter: Hashable {
case start
case mediathek(String)
case suche
}
var body: some View {
TabView(selection: $reiter) {
Tab(value: Reiter.start) {
TVHomeView(deepLinkTarget: $deepLinkTarget)
} label: {
Text("sidebar.home")
}
ForEach(session.libraries, id: \.id) { mediathek in
Tab(value: Reiter.mediathek(mediathek.id)) {
// Jeder Reiter bekommt seinen eigenen Stapel. Ein
// gemeinsamer hiesse, dass ein Wechsel des Reiters die
// Detailseite des vorigen mitnimmt.
NavigationStack {
TVLibraryView(libraryID: mediathek.id)
}
} label: {
Text(mediathek.title)
}
}
// **`role: .search` und nicht ein gewöhnlicher Reiter.** tvOS
// setzt ihn dadurch dorthin, wo er in jeder anderen App auch
// steht, und gibt ihm die Lupe. Die Stelle bestimmt also Apple,
// nicht diese Datei.
Tab(value: Reiter.suche, role: .search) {
TVSearchView()
}
}
.onChange(of: deepLinkTarget) { _, neu in
if neu != nil { reiter = .start }
}
}
}