From 278c4cad69d7a8cb967f8fdb261917ad9495c772 Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Sun, 7 Nov 2021 21:51:22 +0100 Subject: [PATCH] Setting for app tab navigation section --- Shared/Defaults.swift | 10 +++ Shared/Favorites/FavoriteItemView.swift | 83 ++++++++++++++---------- Shared/Navigation/AppTabNavigation.swift | 62 ++++++++++++------ Shared/Navigation/ContentView.swift | 1 + Shared/Player/PlayerViewController.swift | 16 +++-- Shared/Playlists/PlaylistFormView.swift | 6 +- Shared/Playlists/PlaylistsView.swift | 4 ++ Shared/Settings/BrowsingSettings.swift | 26 +++++++- tvOS/EditFavorites.swift | 8 ++- 9 files changed, 150 insertions(+), 66 deletions(-) diff --git a/Shared/Defaults.swift b/Shared/Defaults.swift index c84b5621..39162c4f 100644 --- a/Shared/Defaults.swift +++ b/Shared/Defaults.swift @@ -57,6 +57,10 @@ extension Defaults.Keys { static let trendingCategory = Key("trendingCategory", default: .default) static let trendingCountry = Key("trendingCountry", default: .us) + + #if os(iOS) + static let tabNavigationSection = Key("tabNavigationSection", default: .trending) + #endif } enum ResolutionSetting: String, CaseIterable, Defaults.Serializable { @@ -92,3 +96,9 @@ enum PlayerSidebarSetting: String, CaseIterable, Defaults.Serializable { #endif } } + +#if os(iOS) + enum TabNavigationSectionSetting: String, Defaults.Serializable { + case trending, popular + } +#endif diff --git a/Shared/Favorites/FavoriteItemView.swift b/Shared/Favorites/FavoriteItemView.swift index 78c8475b..683bcede 100644 --- a/Shared/Favorites/FavoriteItemView.swift +++ b/Shared/Favorites/FavoriteItemView.swift @@ -25,43 +25,58 @@ struct FavoriteItemView: View { } var body: some View { - VStack(alignment: .leading, spacing: 2) { - Text(label) - .font(.title3.bold()) - .foregroundColor(.secondary) - .contextMenu { - Button { - favoritesModel.remove(item) - } label: { - Label("Remove from Favorites", systemImage: "trash") - } + Group { + if isVisible { + VStack(alignment: .leading, spacing: 2) { + Text(label) + .font(.title3.bold()) + .foregroundColor(.secondary) + .contextMenu { + Button { + favoritesModel.remove(item) + } label: { + Label("Remove from Favorites", systemImage: "trash") + } + } + .contentShape(Rectangle()) + #if os(tvOS) + .padding(.leading, 40) + #else + .padding(.leading, 15) + #endif + + HorizontalCells(items: store.contentItems) } + .contentShape(Rectangle()) - #if os(tvOS) - .padding(.leading, 40) - #else - .padding(.leading, 15) - #endif - - HorizontalCells(items: store.contentItems) - } - - .contentShape(Rectangle()) - .opacity(dragging?.id == item.id ? 0.5 : 1) - .onAppear { - resource?.addObserver(store) - resource?.loadIfNeeded() - } - #if !os(tvOS) - .onDrag { - dragging = item - return NSItemProvider(object: item.id as NSString) + .opacity(dragging?.id == item.id ? 0.5 : 1) + .onAppear { + resource?.addObserver(store) + resource?.loadIfNeeded() + } + #if !os(tvOS) + .onDrag { + dragging = item + return NSItemProvider(object: item.id as NSString) + } + .onDrop( + of: [UTType.text], + delegate: DropFavorite(item: item, favorites: $favorites, current: $dragging) + ) + #endif } - .onDrop( - of: [UTType.text], - delegate: DropFavorite(item: item, favorites: $favorites, current: $dragging) - ) - #endif + } + } + + private var isVisible: Bool { + switch item.section { + case .subscriptions: + return accounts.app.supportsSubscriptions + case .popular: + return accounts.app.supportsPopular + default: + return true + } } private var resource: Resource? { diff --git a/Shared/Navigation/AppTabNavigation.swift b/Shared/Navigation/AppTabNavigation.swift index b169335b..1f4e571f 100644 --- a/Shared/Navigation/AppTabNavigation.swift +++ b/Shared/Navigation/AppTabNavigation.swift @@ -8,6 +8,8 @@ struct AppTabNavigation: View { @EnvironmentObject private var recents @EnvironmentObject private var search + @Default(.tabNavigationSection) private var tabNavigationSection + var body: some View { TabView(selection: navigation.tabSelectionBinding) { NavigationView { @@ -20,7 +22,7 @@ struct AppTabNavigation: View { } .tag(TabSelection.favorites) - if accounts.app.supportsSubscriptions { + if subscriptionsVisible { NavigationView { LazyView(SubscriptionsView()) .toolbar { toolbarContent } @@ -32,29 +34,21 @@ struct AppTabNavigation: View { .tag(TabSelection.subscriptions) } - // TODO: reenable with settings - if accounts.app.supportsPopular && false { - NavigationView { - LazyView(PopularView()) - .toolbar { toolbarContent } + if subscriptionsVisible { + if accounts.app.supportsPopular { + if tabNavigationSection == .popular { + popularNavigationView + } else { + trendingNavigationView + } } - .tabItem { - Label("Popular", systemImage: "chart.bar") - .accessibility(label: Text("Popular")) + } else { + if accounts.app.supportsPopular { + popularNavigationView } - .tag(TabSelection.popular) + trendingNavigationView } - NavigationView { - LazyView(TrendingView()) - .toolbar { toolbarContent } - } - .tabItem { - Label("Trending", systemImage: "chart.line.uptrend.xyaxis") - .accessibility(label: Text("Trending")) - } - .tag(TabSelection.trending) - if accounts.app.supportsUserPlaylists { NavigationView { LazyView(PlaylistsView()) @@ -125,6 +119,34 @@ struct AppTabNavigation: View { } } + private var subscriptionsVisible: Bool { + accounts.app.supportsSubscriptions && !(accounts.current?.anonymous ?? true) + } + + private var popularNavigationView: some View { + NavigationView { + LazyView(PopularView()) + .toolbar { toolbarContent } + } + .tabItem { + Label("Popular", systemImage: "chart.bar") + .accessibility(label: Text("Popular")) + } + .tag(TabSelection.popular) + } + + private var trendingNavigationView: some View { + NavigationView { + LazyView(TrendingView()) + .toolbar { toolbarContent } + } + .tabItem { + Label("Trending", systemImage: "chart.line.uptrend.xyaxis") + .accessibility(label: Text("Trending")) + } + .tag(TabSelection.trending) + } + private var playerNavigationLink: some View { NavigationLink(isActive: $player.playerNavigationLinkActive, destination: { VideoPlayerView() diff --git a/Shared/Navigation/ContentView.swift b/Shared/Navigation/ContentView.swift index a2841035..4eecf25a 100644 --- a/Shared/Navigation/ContentView.swift +++ b/Shared/Navigation/ContentView.swift @@ -85,6 +85,7 @@ struct ContentView: View { } .sheet(isPresented: $navigation.presentingPlaylistForm) { PlaylistFormView(playlist: $navigation.editedPlaylist) + .environmentObject(accounts) .environmentObject(playlists) } .sheet(isPresented: $navigation.presentingSettings, onDismiss: openWelcomeScreenIfAccountEmpty) { diff --git a/Shared/Player/PlayerViewController.swift b/Shared/Player/PlayerViewController.swift index 0ccb35a8..255ff7a1 100644 --- a/Shared/Player/PlayerViewController.swift +++ b/Shared/Player/PlayerViewController.swift @@ -8,15 +8,17 @@ final class PlayerViewController: UIViewController { var playerModel: PlayerModel! var playerViewController = AVPlayerViewController() - var aspectRatio: Double? { - let ratio = Double(playerViewController.videoBounds.width) / Double(playerViewController.videoBounds.height) + #if !os(tvOS) + var aspectRatio: Double? { + let ratio = Double(playerViewController.videoBounds.width) / Double(playerViewController.videoBounds.height) - if !ratio.isFinite { - return VideoPlayerView.defaultAspectRatio + guard ratio.isFinite else { + return VideoPlayerView.defaultAspectRatio // swiftlint:disable:this implicit_return + } + + return [ratio, 1.0].max()! } - - return [ratio, 1.0].max()! - } + #endif override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) diff --git a/Shared/Playlists/PlaylistFormView.swift b/Shared/Playlists/PlaylistFormView.swift index 51c3b269..cc1650d6 100644 --- a/Shared/Playlists/PlaylistFormView.swift +++ b/Shared/Playlists/PlaylistFormView.swift @@ -14,7 +14,7 @@ struct PlaylistFormView: View { @Environment(\.dismiss) private var dismiss - @EnvironmentObject private var api + @EnvironmentObject private var accounts @EnvironmentObject private var playlists var editing: Bool { @@ -185,7 +185,7 @@ struct PlaylistFormView: View { } var resource: Resource? { - editing ? api.playlist(playlist.id) : api.playlists + editing ? accounts.api.playlist(playlist.id) : accounts.api.playlists } var visibilityFormItem: some View { @@ -230,7 +230,7 @@ struct PlaylistFormView: View { } func deletePlaylistAndDismiss() { - api.playlist(playlist.id)?.request(.delete).onSuccess { _ in + accounts.api.playlist(playlist.id)?.request(.delete).onSuccess { _ in playlist = nil playlists.load(force: true) dismiss() diff --git a/Shared/Playlists/PlaylistsView.swift b/Shared/Playlists/PlaylistsView.swift index 1d3d9a6c..56c6844a 100644 --- a/Shared/Playlists/PlaylistsView.swift +++ b/Shared/Playlists/PlaylistsView.swift @@ -51,16 +51,20 @@ struct PlaylistsView: View { #if os(tvOS) .fullScreenCover(isPresented: $showingNewPlaylist, onDismiss: selectCreatedPlaylist) { PlaylistFormView(playlist: $createdPlaylist) + .environmentObject(accounts) } .fullScreenCover(isPresented: $showingEditPlaylist, onDismiss: selectEditedPlaylist) { PlaylistFormView(playlist: $editedPlaylist) + .environmentObject(accounts) } #else .sheet(isPresented: $showingNewPlaylist, onDismiss: selectCreatedPlaylist) { PlaylistFormView(playlist: $createdPlaylist) + .environmentObject(accounts) } .sheet(isPresented: $showingEditPlaylist, onDismiss: selectEditedPlaylist) { PlaylistFormView(playlist: $editedPlaylist) + .environmentObject(accounts) } #endif .toolbar { diff --git a/Shared/Settings/BrowsingSettings.swift b/Shared/Settings/BrowsingSettings.swift index 0312378e..7e9f75f0 100644 --- a/Shared/Settings/BrowsingSettings.swift +++ b/Shared/Settings/BrowsingSettings.swift @@ -4,11 +4,18 @@ import SwiftUI struct BrowsingSettings: View { @Default(.channelOnThumbnail) private var channelOnThumbnail @Default(.timeOnThumbnail) private var timeOnThumbnail + #if os(iOS) + @Default(.tabNavigationSection) private var tabNavigationSection + #endif var body: some View { - Section(header: SettingsHeader(text: "Thumbnails")) { + Section(header: SettingsHeader(text: "Browsing"), footer: footer) { Toggle("Display channel names on thumbnails", isOn: $channelOnThumbnail) Toggle("Display video length on thumbnails", isOn: $timeOnThumbnail) + + #if os(iOS) + preferredTabPicker + #endif } .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) @@ -16,6 +23,23 @@ struct BrowsingSettings: View { Spacer() #endif } + + var footer: some View { + #if os(iOS) + Text("This tab will be displayed when there is no space to display all tabs") + #else + EmptyView() + #endif + } + + #if os(iOS) + var preferredTabPicker: some View { + Picker("Preferred tab", selection: $tabNavigationSection) { + Text("Trending").tag(TabNavigationSectionSetting.trending) + Text("Popular").tag(TabNavigationSectionSetting.popular) + } + } + #endif } struct BrowsingSettings_Previews: PreviewProvider { diff --git a/tvOS/EditFavorites.swift b/tvOS/EditFavorites.swift index 22df6c9e..05d05aa6 100644 --- a/tvOS/EditFavorites.swift +++ b/tvOS/EditFavorites.swift @@ -44,7 +44,12 @@ struct EditFavorites: View { ForEach(model.addableItems()) { item in HStack { - Text(label(item)) + HStack { + Text(label(item)) + Spacer() + Text("only with Invidious") + .foregroundColor(.secondary) + } Spacer() @@ -52,6 +57,7 @@ struct EditFavorites: View { model.add(item) } label: { Label("Add to Favorites", systemImage: "heart") + .font(.system(size: 30)) } } }