Settings for thumbnails details

This commit is contained in:
Arkadiusz Fal 2021-11-05 00:25:51 +01:00
parent dc9cbd34d0
commit bf8093c587
7 changed files with 120 additions and 18 deletions

View File

@ -192,6 +192,9 @@
376BE50727347B57009AD608 /* SettingsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50627347B57009AD608 /* SettingsHeader.swift */; }; 376BE50727347B57009AD608 /* SettingsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50627347B57009AD608 /* SettingsHeader.swift */; };
376BE50827347B57009AD608 /* SettingsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50627347B57009AD608 /* SettingsHeader.swift */; }; 376BE50827347B57009AD608 /* SettingsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50627347B57009AD608 /* SettingsHeader.swift */; };
376BE50927347B5F009AD608 /* SettingsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50627347B57009AD608 /* SettingsHeader.swift */; }; 376BE50927347B5F009AD608 /* SettingsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50627347B57009AD608 /* SettingsHeader.swift */; };
376BE50B27349108009AD608 /* BrowsingSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50A27349108009AD608 /* BrowsingSettings.swift */; };
376BE50C27349108009AD608 /* BrowsingSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50A27349108009AD608 /* BrowsingSettings.swift */; };
376BE50D27349108009AD608 /* BrowsingSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376BE50A27349108009AD608 /* BrowsingSettings.swift */; };
376CD21626FBE18D001E1AC1 /* Instance+Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */; }; 376CD21626FBE18D001E1AC1 /* Instance+Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */; };
376CD21726FBE18D001E1AC1 /* Instance+Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */; }; 376CD21726FBE18D001E1AC1 /* Instance+Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */; };
376CD21826FBE18D001E1AC1 /* Instance+Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */; }; 376CD21826FBE18D001E1AC1 /* Instance+Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */; };
@ -571,6 +574,7 @@
376A33E32720CB35000C1D6B /* Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = "<group>"; }; 376A33E32720CB35000C1D6B /* Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = "<group>"; };
376B2E0626F920D600B1D64D /* SignInRequiredView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInRequiredView.swift; sourceTree = "<group>"; }; 376B2E0626F920D600B1D64D /* SignInRequiredView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInRequiredView.swift; sourceTree = "<group>"; };
376BE50627347B57009AD608 /* SettingsHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsHeader.swift; sourceTree = "<group>"; }; 376BE50627347B57009AD608 /* SettingsHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsHeader.swift; sourceTree = "<group>"; };
376BE50A27349108009AD608 /* BrowsingSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsingSettings.swift; sourceTree = "<group>"; };
376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Instance+Fixtures.swift"; sourceTree = "<group>"; }; 376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Instance+Fixtures.swift"; sourceTree = "<group>"; };
37732FEF2703A26300F04329 /* AccountValidationStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountValidationStatus.swift; sourceTree = "<group>"; }; 37732FEF2703A26300F04329 /* AccountValidationStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountValidationStatus.swift; sourceTree = "<group>"; };
37732FF32703D32400F04329 /* Sidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sidebar.swift; sourceTree = "<group>"; }; 37732FF32703D32400F04329 /* Sidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sidebar.swift; sourceTree = "<group>"; };
@ -914,6 +918,7 @@
37484C2826FC83FF00287258 /* AccountForm.swift */, 37484C2826FC83FF00287258 /* AccountForm.swift */,
37484C2C26FC844700287258 /* AccountsSettings.swift */, 37484C2C26FC844700287258 /* AccountsSettings.swift */,
37732FEF2703A26300F04329 /* AccountValidationStatus.swift */, 37732FEF2703A26300F04329 /* AccountValidationStatus.swift */,
376BE50A27349108009AD608 /* BrowsingSettings.swift */,
37484C2426FC83E000287258 /* InstanceForm.swift */, 37484C2426FC83E000287258 /* InstanceForm.swift */,
37484C1C26FC83A400287258 /* InstancesSettings.swift */, 37484C1C26FC83A400287258 /* InstancesSettings.swift */,
37484C1826FC837400287258 /* PlaybackSettings.swift */, 37484C1826FC837400287258 /* PlaybackSettings.swift */,
@ -1752,6 +1757,7 @@
373CFACB26966264003CB2C6 /* SearchQuery.swift in Sources */, 373CFACB26966264003CB2C6 /* SearchQuery.swift in Sources */,
37141673267A8E10006CA35D /* Country.swift in Sources */, 37141673267A8E10006CA35D /* Country.swift in Sources */,
3748186E26A769D60084E870 /* DetailBadge.swift in Sources */, 3748186E26A769D60084E870 /* DetailBadge.swift in Sources */,
376BE50B27349108009AD608 /* BrowsingSettings.swift in Sources */,
37AAF2A026741C97007FC770 /* SubscriptionsView.swift in Sources */, 37AAF2A026741C97007FC770 /* SubscriptionsView.swift in Sources */,
37599F30272B42810087F250 /* FavoriteItem.swift in Sources */, 37599F30272B42810087F250 /* FavoriteItem.swift in Sources */,
373197D92732015300EF734F /* RelatedView.swift in Sources */, 373197D92732015300EF734F /* RelatedView.swift in Sources */,
@ -1882,6 +1888,7 @@
37BA794C26DC30EC002A0235 /* AppSidebarPlaylists.swift in Sources */, 37BA794C26DC30EC002A0235 /* AppSidebarPlaylists.swift in Sources */,
37CC3F46270CE30600608308 /* PlayerQueueItem.swift in Sources */, 37CC3F46270CE30600608308 /* PlayerQueueItem.swift in Sources */,
3700155C271B0D4D0049C794 /* PipedAPI.swift in Sources */, 3700155C271B0D4D0049C794 /* PipedAPI.swift in Sources */,
376BE50C27349108009AD608 /* BrowsingSettings.swift in Sources */,
37D4B19826717E1500C925CA /* Video.swift in Sources */, 37D4B19826717E1500C925CA /* Video.swift in Sources */,
37599F31272B42810087F250 /* FavoriteItem.swift in Sources */, 37599F31272B42810087F250 /* FavoriteItem.swift in Sources */,
3730F75A2733481E00F385FC /* RelatedView.swift in Sources */, 3730F75A2733481E00F385FC /* RelatedView.swift in Sources */,
@ -1956,6 +1963,7 @@
3788AC2926F6840700F6BAA9 /* FavoriteItemView.swift in Sources */, 3788AC2926F6840700F6BAA9 /* FavoriteItemView.swift in Sources */,
37319F0727103F94004ECCD0 /* PlayerQueue.swift in Sources */, 37319F0727103F94004ECCD0 /* PlayerQueue.swift in Sources */,
37E70925271CD43000D34DDE /* WelcomeScreen.swift in Sources */, 37E70925271CD43000D34DDE /* WelcomeScreen.swift in Sources */,
376BE50D27349108009AD608 /* BrowsingSettings.swift in Sources */,
37DD87C9271C9CFE0027CBF9 /* PlayerStreams.swift in Sources */, 37DD87C9271C9CFE0027CBF9 /* PlayerStreams.swift in Sources */,
37FFC442272734C3009FFD26 /* Throttle.swift in Sources */, 37FFC442272734C3009FFD26 /* Throttle.swift in Sources */,
375168D82700FDB9008F96A6 /* Debounce.swift in Sources */, 375168D82700FDB9008F96A6 /* Debounce.swift in Sources */,

View File

@ -51,6 +51,9 @@ extension Defaults.Keys {
.init(section: .trending("US", nil)) .init(section: .trending("US", nil))
]) ])
static let channelOnThumbnail = Key<Bool>("channelOnThumbnail", default: true)
static let timeOnThumbnail = Key<Bool>("timeOnThumbnail", default: true)
static let quality = Key<Stream.ResolutionSetting>("quality", default: .hd720pFirstThenBest) static let quality = Key<Stream.ResolutionSetting>("quality", default: .hd720pFirstThenBest)
static let playerSidebar = Key<PlayerSidebarSetting>("playerSidebar", default: PlayerSidebarSetting.defaultValue) static let playerSidebar = Key<PlayerSidebarSetting>("playerSidebar", default: PlayerSidebarSetting.defaultValue)
static let playerInstanceID = Key<Instance.ID?>("playerInstance") static let playerInstanceID = Key<Instance.ID?>("playerInstance")

View File

@ -0,0 +1,26 @@
import Defaults
import SwiftUI
struct BrowsingSettings: View {
@Default(.channelOnThumbnail) private var channelOnThumbnail
@Default(.timeOnThumbnail) private var timeOnThumbnail
var body: some View {
Section(header: SettingsHeader(text: "Thumbnails")) {
Toggle("Display channel names on thumbnails", isOn: $channelOnThumbnail)
Toggle("Display video length on thumbnails", isOn: $timeOnThumbnail)
}
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
#if os(macOS)
Spacer()
#endif
}
}
struct BrowsingSettings_Previews: PreviewProvider {
static var previews: some View {
BrowsingSettings()
.injectFixtureEnvironmentObjects()
}
}

View File

@ -5,7 +5,7 @@ import SwiftUI
struct SettingsView: View { struct SettingsView: View {
#if os(macOS) #if os(macOS)
private enum Tabs: Hashable { private enum Tabs: Hashable {
case instances, playback, services case instances, browsing, playback, services
} }
#endif #endif
@ -24,6 +24,14 @@ struct SettingsView: View {
} }
.tag(Tabs.instances) .tag(Tabs.instances)
Form {
BrowsingSettings()
}
.tabItem {
Label("Browsing", systemImage: "list.and.film")
}
.tag(Tabs.browsing)
Form { Form {
PlaybackSettings() PlaybackSettings()
} }
@ -49,6 +57,7 @@ struct SettingsView: View {
AccountSelectionView() AccountSelectionView()
#endif #endif
InstancesSettings() InstancesSettings()
BrowsingSettings()
PlaybackSettings() PlaybackSettings()
ServicesSettings() ServicesSettings()
} }
@ -69,7 +78,7 @@ struct SettingsView: View {
#endif #endif
} }
#if os(tvOS) #if os(tvOS)
.background(.thickMaterial) .background(.black)
#endif #endif
#endif #endif
} }

View File

@ -30,7 +30,7 @@ struct HorizontalCells: View {
#if os(tvOS) #if os(tvOS)
.frame(height: 560) .frame(height: 560)
#else #else
.frame(height: 250) .frame(height: 290)
#endif #endif
.edgesIgnoringSafeArea(.horizontal) .edgesIgnoringSafeArea(.horizontal)

View File

@ -88,7 +88,7 @@ struct VideoBanner: View {
private var thumbnailWidth: Double { private var thumbnailWidth: Double {
#if os(tvOS) #if os(tvOS)
230 250
#else #else
100 100
#endif #endif

View File

@ -16,6 +16,9 @@ struct VideoCell: View {
@EnvironmentObject<PlayerModel> private var player @EnvironmentObject<PlayerModel> private var player
@EnvironmentObject<ThumbnailsModel> private var thumbnails @EnvironmentObject<ThumbnailsModel> private var thumbnails
@Default(.channelOnThumbnail) private var channelOnThumbnail
@Default(.timeOnThumbnail) private var timeOnThumbnail
var body: some View { var body: some View {
Group { Group {
Button(action: { Button(action: {
@ -73,15 +76,20 @@ struct VideoCell: View {
videoDetail(video.title, lineLimit: 5) videoDetail(video.title, lineLimit: 5)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
videoDetail(video.author) if !channelOnThumbnail {
Text(video.channel.name)
.fontWeight(.semibold)
.foregroundColor(.secondary)
}
if additionalDetailsAvailable { if additionalDetailsAvailable {
Spacer() Spacer()
HStack { HStack(spacing: 15) {
if let date = video.publishedDate { if let date = video.publishedDate {
VStack { VStack {
Image(systemName: "calendar") Image(systemName: "calendar")
.frame(height: 15)
Text(date) Text(date)
} }
} }
@ -89,9 +97,18 @@ struct VideoCell: View {
if video.views > 0 { if video.views > 0 {
VStack { VStack {
Image(systemName: "eye") Image(systemName: "eye")
.frame(height: 15)
Text(video.viewsCount!) Text(video.viewsCount!)
} }
} }
if !timeOnThumbnail, let time = video.length.formattedAsPlaybackTime() {
VStack {
Image(systemName: "clock")
.frame(height: 15)
Text(time)
}
}
} }
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
@ -133,27 +150,60 @@ struct VideoCell: View {
thumbnail thumbnail
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
videoDetail(video.title, lineLimit: additionalDetailsAvailable ? 2 : 3) Group {
VStack(alignment: .leading, spacing: 0) {
videoDetail(video.title, lineLimit: channelOnThumbnail ? 3 : 2)
#if os(tvOS)
.frame(minHeight: 60, alignment: .top)
#elseif os(macOS)
.frame(minHeight: 32, alignment: .top)
#else
.frame(minHeight: 40, alignment: .top)
#endif
if !channelOnThumbnail {
Text(video.channel.name)
.fontWeight(.semibold)
.foregroundColor(.secondary)
.padding(.top, 4)
.padding(.bottom, 6)
}
}
}
#if os(tvOS) #if os(tvOS)
.frame(minHeight: additionalDetailsAvailable ? 80 : 120, alignment: .top) .frame(minHeight: channelOnThumbnail ? 80 : 120, alignment: .top)
#elseif os(macOS) #elseif os(macOS)
.frame(minHeight: 30, alignment: .top) .frame(minHeight: 60, alignment: .top)
#else #else
.frame(minHeight: 50, alignment: .top) .frame(minHeight: 80, alignment: .top)
#endif #endif
.padding(.bottom, 4) .padding(.bottom, 4)
HStack(spacing: 8) { HStack(spacing: 8) {
if let date = video.publishedDate { if let date = video.publishedDate {
Image(systemName: "calendar") HStack(spacing: 2) {
Text(date) Image(systemName: "calendar")
Text(date)
.allowsTightening(true)
}
} }
if video.views > 0 { if video.views > 0 {
Image(systemName: "eye") HStack(spacing: 2) {
Text(video.viewsCount!) Image(systemName: "eye")
Text(video.viewsCount!)
}
}
if let time = video.length.formattedAsPlaybackTime(), !timeOnThumbnail {
Spacer()
HStack(spacing: 2) {
Image(systemName: "clock")
Text(time)
}
} }
} }
.lineLimit(1)
.foregroundColor(.secondary) .foregroundColor(.secondary)
.frame(minHeight: 30, alignment: .top) .frame(minHeight: 30, alignment: .top)
#if os(tvOS) #if os(tvOS)
@ -169,7 +219,7 @@ struct VideoCell: View {
} }
var additionalDetailsAvailable: Bool { var additionalDetailsAvailable: Bool {
video.publishedDate != nil || video.views != 0 video.publishedDate != nil || video.views != 0 || (!timeOnThumbnail && !video.length.formattedAsPlaybackTime().isNil)
} }
var thumbnail: some View { var thumbnail: some View {
@ -186,7 +236,9 @@ struct VideoCell: View {
Spacer() Spacer()
DetailBadge(text: video.author, style: .prominent) if channelOnThumbnail {
DetailBadge(text: video.author, style: .prominent)
}
} }
.padding(10) .padding(10)
@ -195,7 +247,7 @@ struct VideoCell: View {
HStack(alignment: .top) { HStack(alignment: .top) {
Spacer() Spacer()
if let time = video.length.formattedAsPlaybackTime() { if timeOnThumbnail, let time = video.length.formattedAsPlaybackTime() {
DetailBadge(text: time, style: .prominent) DetailBadge(text: time, style: .prominent)
} }
} }
@ -268,7 +320,11 @@ struct VideoCell_Preview: PreviewProvider {
Group { Group {
VideoCell(video: Video.fixture) VideoCell(video: Video.fixture)
} }
.frame(maxWidth: 300, maxHeight: 200) #if os(macOS)
.frame(maxWidth: 600, maxHeight: 400)
#elseif os(iOS)
.frame(maxWidth: 300, maxHeight: 200)
#endif
.injectFixtureEnvironmentObjects() .injectFixtureEnvironmentObjects()
} }
} }