diff --git a/Shared/Defaults.swift b/Shared/Defaults.swift index 4878b2bd..7cb4c317 100644 --- a/Shared/Defaults.swift +++ b/Shared/Defaults.swift @@ -41,12 +41,13 @@ extension Defaults.Keys { #endif static let channelOnThumbnail = Key("channelOnThumbnail", default: true) static let timeOnThumbnail = Key("timeOnThumbnail", default: true) - static let showHistoryInPlayer = Key("showHistoryInPlayer", default: false) + static let roundedThumbnails = Key("roundedThumbnails", default: true) static let quality = Key("quality", default: .best) static let playerSidebar = Key("playerSidebar", default: PlayerSidebarSetting.defaultValue) static let playerInstanceID = Key("playerInstance") static let showKeywords = Key("showKeywords", default: false) + static let showHistoryInPlayer = Key("showHistoryInPlayer", default: false) static let showChannelSubscribers = Key("showChannelSubscribers", default: true) static let commentsInstanceID = Key("commentsInstance", default: kavinPipedInstanceID) #if !os(tvOS) @@ -104,7 +105,7 @@ enum ResolutionSetting: String, CaseIterable, Defaults.Serializable { var description: String { switch self { case .best: - return "Best available" + return "Best available quality" default: return value.name } diff --git a/Shared/Settings/BrowsingSettings.swift b/Shared/Settings/BrowsingSettings.swift index 413b4623..3586a924 100644 --- a/Shared/Settings/BrowsingSettings.swift +++ b/Shared/Settings/BrowsingSettings.swift @@ -4,6 +4,7 @@ import SwiftUI struct BrowsingSettings: View { #if !os(tvOS) @Default(.accountPickerDisplaysUsername) private var accountPickerDisplaysUsername + @Default(.roundedThumbnails) private var roundedThumbnails #endif #if os(iOS) @Default(.lockPortraitWhenBrowsing) private var lockPortraitWhenBrowsing @@ -14,61 +15,101 @@ struct BrowsingSettings: View { var body: some View { Group { - Section(header: SettingsHeader(text: "Browsing")) { - #if !os(tvOS) - Toggle("Show username in the account picker button", isOn: $accountPickerDisplaysUsername) - #endif + #if os(macOS) + sections + #else + List { + sections + } #if os(iOS) - Toggle("Lock portrait mode", isOn: $lockPortraitWhenBrowsing) - .onChange(of: lockPortraitWhenBrowsing) { lock in - if lock { - Orientation.lockOrientation(.portrait, andRotateTo: .portrait) - } else { - Orientation.lockOrientation(.allButUpsideDown) - } - } + .listStyle(.insetGrouped) #endif - Toggle("Show channel name on thumbnail", isOn: $channelOnThumbnail) - Toggle("Show video length on thumbnail", isOn: $timeOnThumbnail) - } - Section(header: SettingsHeader(text: "Sections")) { - #if os(macOS) - let list = ForEach(VisibleSection.allCases, id: \.self) { section in - VisibleSectionSelectionRow( - title: section.title, - selected: visibleSections.contains(section) - ) { value in - toggleSection(section, value: value) - } - } - - Group { - if #available(macOS 12.0, *) { - list - .listStyle(.inset(alternatesRowBackgrounds: true)) - } else { - list - .listStyle(.inset) - } - - Spacer() - } - #else - ForEach(VisibleSection.allCases, id: \.self) { section in - VisibleSectionSelectionRow( - title: section.title, - selected: visibleSections.contains(section) - ) { value in - toggleSection(section, value: value) - } - } - #endif - } + #endif } + #if os(tvOS) + .frame(maxWidth: 1000) + #else .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) + #endif + .navigationTitle("Browsing") } - func toggleSection(_ section: VisibleSection, value: Bool) { + private var sections: some View { + Group { + #if !os(tvOS) + interfaceSettings + #endif + thumbnailsSettings + visibleSectionsSettings + } + } + + private var interfaceSettings: some View { + Section(header: SettingsHeader(text: "Interface")) { + #if os(iOS) + Toggle("Lock portrait mode", isOn: $lockPortraitWhenBrowsing) + .onChange(of: lockPortraitWhenBrowsing) { lock in + if lock { + Orientation.lockOrientation(.portrait, andRotateTo: .portrait) + } else { + Orientation.lockOrientation(.allButUpsideDown) + } + } + #endif + + #if !os(tvOS) + Toggle("Show account username", isOn: $accountPickerDisplaysUsername) + #endif + } + } + + private var thumbnailsSettings: some View { + Section(header: SettingsHeader(text: "Thumbnails")) { + #if !os(tvOS) + Toggle("Round corners", isOn: $roundedThumbnails) + #endif + Toggle("Show channel name", isOn: $channelOnThumbnail) + Toggle("Show video length", isOn: $timeOnThumbnail) + } + } + + private var visibleSectionsSettings: some View { + Section(header: SettingsHeader(text: "Sections")) { + #if os(macOS) + let list = ForEach(VisibleSection.allCases, id: \.self) { section in + VisibleSectionSelectionRow( + title: section.title, + selected: visibleSections.contains(section) + ) { value in + toggleSection(section, value: value) + } + } + + Group { + if #available(macOS 12.0, *) { + list + .listStyle(.inset(alternatesRowBackgrounds: true)) + } else { + list + .listStyle(.inset) + } + + Spacer() + } + #else + ForEach(VisibleSection.allCases, id: \.self) { section in + VisibleSectionSelectionRow( + title: section.title, + selected: visibleSections.contains(section) + ) { value in + toggleSection(section, value: value) + } + } + #endif + } + } + + private func toggleSection(_ section: VisibleSection, value: Bool) { if value { visibleSections.insert(section) } else { diff --git a/Shared/Videos/VideoCell.swift b/Shared/Videos/VideoCell.swift index 00264faf..214c3131 100644 --- a/Shared/Videos/VideoCell.swift +++ b/Shared/Videos/VideoCell.swift @@ -18,6 +18,7 @@ struct VideoCell: View { @Default(.channelOnThumbnail) private var channelOnThumbnail @Default(.timeOnThumbnail) private var timeOnThumbnail + @Default(.roundedThumbnails) private var roundedThumbnails @Default(.saveHistory) private var saveHistory @Default(.showWatchingProgress) private var showWatchingProgress @Default(.watchedVideoStyle) private var watchedVideoStyle @@ -39,7 +40,7 @@ struct VideoCell: View { } .opacity(contentOpacity) .buttonStyle(.plain) - .contentShape(RoundedRectangle(cornerRadius: 12)) + .contentShape(RoundedRectangle(cornerRadius: thumbnailRoundingCornerRadius)) .contextMenu { VideoContextMenuView( video: video, @@ -49,6 +50,14 @@ struct VideoCell: View { } } + private var thumbnailRoundingCornerRadius: Double { + #if os(tvOS) + return Double(12) + #else + return Double(roundedThumbnails ? 12 : 0) + #endif + } + private func playAction() { if watchingNow { if !player.playingInPictureInPicture { @@ -389,7 +398,7 @@ struct VideoCell: View { .font(.system(size: 30)) } } - .mask(RoundedRectangle(cornerRadius: 12)) + .mask(RoundedRectangle(cornerRadius: thumbnailRoundingCornerRadius)) .modifier(AspectRatioModifier()) }