2021-11-04 23:25:51 +00:00
|
|
|
import Defaults
|
|
|
|
import SwiftUI
|
|
|
|
|
|
|
|
struct BrowsingSettings: View {
|
2022-01-02 19:34:50 +00:00
|
|
|
#if !os(tvOS)
|
|
|
|
@Default(.accountPickerDisplaysUsername) private var accountPickerDisplaysUsername
|
2022-01-06 14:56:59 +00:00
|
|
|
@Default(.roundedThumbnails) private var roundedThumbnails
|
2022-01-02 19:34:50 +00:00
|
|
|
#endif
|
2022-01-02 19:41:04 +00:00
|
|
|
#if os(iOS)
|
|
|
|
@Default(.lockPortraitWhenBrowsing) private var lockPortraitWhenBrowsing
|
|
|
|
#endif
|
2022-06-26 12:25:54 +00:00
|
|
|
@Default(.thumbnailsQuality) private var thumbnailsQuality
|
2021-11-04 23:25:51 +00:00
|
|
|
@Default(.channelOnThumbnail) private var channelOnThumbnail
|
|
|
|
@Default(.timeOnThumbnail) private var timeOnThumbnail
|
2021-12-01 11:22:19 +00:00
|
|
|
@Default(.visibleSections) private var visibleSections
|
2021-11-04 23:25:51 +00:00
|
|
|
|
|
|
|
var body: some View {
|
2021-12-01 11:22:19 +00:00
|
|
|
Group {
|
2022-01-06 14:56:59 +00:00
|
|
|
#if os(macOS)
|
|
|
|
sections
|
|
|
|
#else
|
|
|
|
List {
|
|
|
|
sections
|
|
|
|
}
|
2022-01-02 19:41:04 +00:00
|
|
|
#if os(iOS)
|
2022-01-06 14:56:59 +00:00
|
|
|
.listStyle(.insetGrouped)
|
2022-01-02 19:41:04 +00:00
|
|
|
#endif
|
2022-01-06 14:56:59 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#if os(tvOS)
|
|
|
|
.frame(maxWidth: 1000)
|
|
|
|
#else
|
|
|
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
|
|
|
|
#endif
|
|
|
|
.navigationTitle("Browsing")
|
|
|
|
}
|
|
|
|
|
|
|
|
private var sections: some View {
|
|
|
|
Group {
|
|
|
|
#if !os(tvOS)
|
|
|
|
interfaceSettings
|
|
|
|
#endif
|
|
|
|
thumbnailsSettings
|
|
|
|
visibleSectionsSettings
|
|
|
|
}
|
|
|
|
}
|
2021-11-07 20:51:22 +00:00
|
|
|
|
2022-01-06 14:56:59 +00:00
|
|
|
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)
|
2021-12-01 11:22:19 +00:00
|
|
|
} else {
|
2022-01-06 14:56:59 +00:00
|
|
|
Orientation.lockOrientation(.allButUpsideDown)
|
2021-12-01 11:22:19 +00:00
|
|
|
}
|
2022-01-06 14:56:59 +00:00
|
|
|
}
|
|
|
|
#endif
|
2021-12-02 19:22:55 +00:00
|
|
|
|
2022-01-06 14:56:59 +00:00
|
|
|
#if !os(tvOS)
|
|
|
|
Toggle("Show account username", isOn: $accountPickerDisplaysUsername)
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private var thumbnailsSettings: some View {
|
|
|
|
Section(header: SettingsHeader(text: "Thumbnails")) {
|
2022-06-26 12:25:54 +00:00
|
|
|
thumbnailsQualityPicker
|
2022-01-06 14:56:59 +00:00
|
|
|
#if !os(tvOS)
|
|
|
|
Toggle("Round corners", isOn: $roundedThumbnails)
|
|
|
|
#endif
|
|
|
|
Toggle("Show channel name", isOn: $channelOnThumbnail)
|
|
|
|
Toggle("Show video length", isOn: $timeOnThumbnail)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-26 12:25:54 +00:00
|
|
|
private var thumbnailsQualityPicker: some View {
|
|
|
|
Picker("Quality", selection: $thumbnailsQuality) {
|
|
|
|
ForEach(ThumbnailsQuality.allCases, id: \.self) { quality in
|
|
|
|
Text(quality.rawValue.capitalized + " quality").tag(quality)
|
|
|
|
}
|
|
|
|
}
|
2022-08-06 14:28:05 +00:00
|
|
|
.modifier(SettingsPickerModifier())
|
2022-06-26 12:25:54 +00:00
|
|
|
}
|
|
|
|
|
2022-01-06 14:56:59 +00:00
|
|
|
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)
|
2021-12-01 11:22:19 +00:00
|
|
|
}
|
2022-01-06 14:56:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Group {
|
|
|
|
if #available(macOS 12.0, *) {
|
|
|
|
list
|
|
|
|
.listStyle(.inset(alternatesRowBackgrounds: true))
|
|
|
|
} else {
|
|
|
|
list
|
|
|
|
.listStyle(.inset)
|
2021-12-01 11:22:19 +00:00
|
|
|
}
|
2022-01-06 14:56:59 +00:00
|
|
|
|
|
|
|
Spacer()
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
ForEach(VisibleSection.allCases, id: \.self) { section in
|
|
|
|
VisibleSectionSelectionRow(
|
|
|
|
title: section.title,
|
|
|
|
selected: visibleSections.contains(section)
|
|
|
|
) { value in
|
|
|
|
toggleSection(section, value: value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2021-11-04 23:25:51 +00:00
|
|
|
}
|
|
|
|
}
|
2021-11-07 20:51:22 +00:00
|
|
|
|
2022-01-06 14:56:59 +00:00
|
|
|
private func toggleSection(_ section: VisibleSection, value: Bool) {
|
2021-12-01 11:22:19 +00:00
|
|
|
if value {
|
|
|
|
visibleSections.insert(section)
|
|
|
|
} else {
|
|
|
|
visibleSections.remove(section)
|
|
|
|
}
|
2021-11-07 20:51:22 +00:00
|
|
|
}
|
|
|
|
|
2021-12-01 11:22:19 +00:00
|
|
|
struct VisibleSectionSelectionRow: View {
|
|
|
|
let title: String
|
|
|
|
let selected: Bool
|
|
|
|
var action: (Bool) -> Void
|
|
|
|
|
|
|
|
@State private var toggleChecked = false
|
|
|
|
|
|
|
|
var body: some View {
|
|
|
|
Button(action: { action(!selected) }) {
|
|
|
|
HStack {
|
|
|
|
#if os(macOS)
|
|
|
|
Toggle(isOn: $toggleChecked) {
|
|
|
|
Text(self.title)
|
|
|
|
Spacer()
|
|
|
|
}
|
|
|
|
.onAppear {
|
|
|
|
toggleChecked = selected
|
|
|
|
}
|
|
|
|
.onChange(of: toggleChecked) { new in
|
|
|
|
action(new)
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
Text(self.title)
|
|
|
|
Spacer()
|
|
|
|
if selected {
|
|
|
|
Image(systemName: "checkmark")
|
|
|
|
#if os(iOS)
|
|
|
|
.foregroundColor(.accentColor)
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
.contentShape(Rectangle())
|
2021-11-07 20:51:22 +00:00
|
|
|
}
|
2021-12-01 11:22:19 +00:00
|
|
|
#if !os(tvOS)
|
|
|
|
.buttonStyle(.plain)
|
|
|
|
#endif
|
2021-11-07 20:51:22 +00:00
|
|
|
}
|
2021-12-01 11:22:19 +00:00
|
|
|
}
|
2021-11-04 23:25:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
struct BrowsingSettings_Previews: PreviewProvider {
|
|
|
|
static var previews: some View {
|
|
|
|
BrowsingSettings()
|
|
|
|
.injectFixtureEnvironmentObjects()
|
|
|
|
}
|
|
|
|
}
|