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 } } } }