2021-11-05 04:55:51 +05:30
|
|
|
import Defaults
|
|
|
|
import SwiftUI
|
|
|
|
|
|
|
|
struct BrowsingSettings: View {
|
2022-01-03 01:04:50 +05:30
|
|
|
#if !os(tvOS)
|
|
|
|
@Default(.accountPickerDisplaysUsername) private var accountPickerDisplaysUsername
|
2022-01-06 20:26:59 +05:30
|
|
|
@Default(.roundedThumbnails) private var roundedThumbnails
|
2022-01-03 01:04:50 +05:30
|
|
|
#endif
|
2022-08-26 05:06:46 +05:30
|
|
|
@Default(.accountPickerDisplaysAnonymousAccounts) private var accountPickerDisplaysAnonymousAccounts
|
2023-03-01 01:47:12 +05:30
|
|
|
@Default(.showUnwatchedFeedBadges) private var showUnwatchedFeedBadges
|
2023-05-27 02:08:32 +05:30
|
|
|
@Default(.keepChannelsWithUnwatchedFeedOnTop) private var keepChannelsWithUnwatchedFeedOnTop
|
2022-01-03 01:11:04 +05:30
|
|
|
#if os(iOS)
|
2024-09-01 16:12:31 +05:30
|
|
|
@Default(.enterFullscreenInLandscape) private var enterFullscreenInLandscape
|
2022-01-03 01:11:04 +05:30
|
|
|
@Default(.lockPortraitWhenBrowsing) private var lockPortraitWhenBrowsing
|
2022-11-19 05:08:32 +05:30
|
|
|
@Default(.showDocuments) private var showDocuments
|
2022-01-03 01:11:04 +05:30
|
|
|
#endif
|
2022-06-26 17:55:54 +05:30
|
|
|
@Default(.thumbnailsQuality) private var thumbnailsQuality
|
2021-11-05 04:55:51 +05:30
|
|
|
@Default(.channelOnThumbnail) private var channelOnThumbnail
|
|
|
|
@Default(.timeOnThumbnail) private var timeOnThumbnail
|
2022-11-12 01:58:40 +05:30
|
|
|
@Default(.showOpenActionsToolbarItem) private var showOpenActionsToolbarItem
|
2021-12-01 16:52:19 +05:30
|
|
|
@Default(.visibleSections) private var visibleSections
|
2023-05-25 20:31:53 +05:30
|
|
|
@Default(.startupSection) private var startupSection
|
2024-09-09 19:35:24 +05:30
|
|
|
@Default(.showSearchSuggestions) private var showSearchSuggestions
|
2022-12-18 00:05:07 +05:30
|
|
|
@Default(.playerButtonSingleTapGesture) private var playerButtonSingleTapGesture
|
|
|
|
@Default(.playerButtonDoubleTapGesture) private var playerButtonDoubleTapGesture
|
|
|
|
@Default(.playerButtonShowsControlButtonsWhenMinimized) private var playerButtonShowsControlButtonsWhenMinimized
|
2022-12-19 06:07:09 +05:30
|
|
|
@Default(.playerButtonIsExpanded) private var playerButtonIsExpanded
|
|
|
|
@Default(.playerBarMaxWidth) private var playerBarMaxWidth
|
|
|
|
@Default(.expandChannelDescription) private var expandChannelDescription
|
2023-07-22 22:32:59 +05:30
|
|
|
@Default(.showChannelAvatarInChannelsLists) private var showChannelAvatarInChannelsLists
|
|
|
|
@Default(.showChannelAvatarInVideosListing) private var showChannelAvatarInVideosListing
|
2021-11-05 04:55:51 +05:30
|
|
|
|
2022-11-25 02:06:05 +05:30
|
|
|
@ObservedObject private var accounts = AccountsModel.shared
|
2022-11-12 01:58:40 +05:30
|
|
|
|
2022-11-19 04:09:52 +05:30
|
|
|
#if os(iOS)
|
|
|
|
@State private var homeRecentDocumentsItemsText = ""
|
|
|
|
#endif
|
2022-11-12 06:17:31 +05:30
|
|
|
#if os(macOS)
|
2023-05-25 17:58:29 +05:30
|
|
|
@State private var presentingHomeSettingsSheet = false
|
2022-11-12 06:17:31 +05:30
|
|
|
#endif
|
2022-11-12 01:58:40 +05:30
|
|
|
|
2021-11-05 04:55:51 +05:30
|
|
|
var body: some View {
|
2021-12-01 16:52:19 +05:30
|
|
|
Group {
|
2022-01-06 20:26:59 +05:30
|
|
|
#if os(macOS)
|
2022-11-12 01:58:40 +05:30
|
|
|
VStack(alignment: .leading) {
|
|
|
|
sections
|
|
|
|
Spacer()
|
|
|
|
}
|
2022-01-06 20:26:59 +05:30
|
|
|
#else
|
|
|
|
List {
|
|
|
|
sections
|
|
|
|
}
|
2022-01-03 01:11:04 +05:30
|
|
|
#if os(iOS)
|
2022-01-06 20:26:59 +05:30
|
|
|
.listStyle(.insetGrouped)
|
2022-01-03 01:11:04 +05:30
|
|
|
#endif
|
2022-01-06 20:26:59 +05:30
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#if os(tvOS)
|
2023-05-25 20:31:53 +05:30
|
|
|
.frame(maxWidth: 1200)
|
2022-01-06 20:26:59 +05:30
|
|
|
#else
|
|
|
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
|
|
|
|
#endif
|
|
|
|
.navigationTitle("Browsing")
|
|
|
|
}
|
|
|
|
|
|
|
|
private var sections: some View {
|
|
|
|
Group {
|
2022-11-12 01:58:40 +05:30
|
|
|
homeSettings
|
2023-05-25 20:31:53 +05:30
|
|
|
if !accounts.isEmpty {
|
|
|
|
startupSectionPicker
|
2024-09-09 19:35:24 +05:30
|
|
|
showSearchSuggestionsToggle
|
2023-05-25 20:31:53 +05:30
|
|
|
visibleSectionsSettings
|
|
|
|
}
|
2022-11-19 05:08:32 +05:30
|
|
|
let interface = interfaceSettings
|
|
|
|
#if os(tvOS)
|
|
|
|
if !accounts.isEmpty {
|
|
|
|
interface
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
interface
|
2023-05-25 20:31:53 +05:30
|
|
|
playerBarSettings
|
2022-11-19 05:08:32 +05:30
|
|
|
#endif
|
2022-11-12 01:58:40 +05:30
|
|
|
if !accounts.isEmpty {
|
|
|
|
thumbnailsSettings
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-25 17:58:29 +05:30
|
|
|
@ViewBuilder private var homeSettings: some View {
|
|
|
|
if !accounts.isEmpty {
|
2023-05-25 20:31:53 +05:30
|
|
|
Section {
|
2023-05-25 17:58:29 +05:30
|
|
|
#if os(macOS)
|
|
|
|
Button {
|
|
|
|
presentingHomeSettingsSheet = true
|
|
|
|
} label: {
|
|
|
|
Text("Home Settings")
|
|
|
|
}
|
|
|
|
.sheet(isPresented: $presentingHomeSettingsSheet) {
|
|
|
|
VStack(alignment: .leading) {
|
|
|
|
Button("Done") {
|
|
|
|
presentingHomeSettingsSheet = false
|
|
|
|
}
|
|
|
|
.padding()
|
|
|
|
.keyboardShortcut(.cancelAction)
|
2022-11-13 04:31:04 +05:30
|
|
|
|
2023-05-25 17:58:29 +05:30
|
|
|
HomeSettings()
|
2022-11-19 05:08:32 +05:30
|
|
|
}
|
2023-05-25 17:58:29 +05:30
|
|
|
.frame(width: 500, height: 800)
|
2022-11-19 17:24:37 +05:30
|
|
|
}
|
2023-05-25 17:58:29 +05:30
|
|
|
#else
|
|
|
|
NavigationLink(destination: LazyView(HomeSettings())) {
|
|
|
|
Text("Home Settings")
|
2022-11-19 17:24:37 +05:30
|
|
|
}
|
2023-05-25 17:58:29 +05:30
|
|
|
#endif
|
2022-11-12 06:17:31 +05:30
|
|
|
}
|
2022-01-06 20:26:59 +05:30
|
|
|
}
|
|
|
|
}
|
2021-11-08 02:21:22 +05:30
|
|
|
|
2022-12-18 00:05:07 +05:30
|
|
|
#if !os(tvOS)
|
|
|
|
private var playerBarSettings: some View {
|
|
|
|
Section(header: SettingsHeader(text: "Player Bar".localized()), footer: playerBarFooter) {
|
2022-12-19 06:07:09 +05:30
|
|
|
Toggle("Open expanded", isOn: $playerButtonIsExpanded)
|
2022-12-18 00:05:07 +05:30
|
|
|
Toggle("Always show controls buttons", isOn: $playerButtonShowsControlButtonsWhenMinimized)
|
2023-04-23 02:40:05 +05:30
|
|
|
playerBarGesturePicker("Single tap gesture".localized(), selection: $playerButtonSingleTapGesture)
|
|
|
|
playerBarGesturePicker("Double tap gesture".localized(), selection: $playerButtonDoubleTapGesture)
|
2022-12-19 06:07:09 +05:30
|
|
|
HStack {
|
|
|
|
Text("Maximum width expanded")
|
|
|
|
Spacer()
|
|
|
|
TextField("Maximum width expanded", text: $playerBarMaxWidth)
|
|
|
|
.frame(maxWidth: 100, alignment: .trailing)
|
|
|
|
.multilineTextAlignment(.trailing)
|
|
|
|
.labelsHidden()
|
|
|
|
#if !os(macOS)
|
|
|
|
.keyboardType(.numberPad)
|
|
|
|
#endif
|
|
|
|
}
|
2022-12-18 00:05:07 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func playerBarGesturePicker(_ label: String, selection: Binding<PlayerTapGestureAction>) -> some View {
|
|
|
|
Picker(label, selection: selection) {
|
|
|
|
ForEach(PlayerTapGestureAction.allCases, id: \.rawValue) { action in
|
2023-04-23 02:40:05 +05:30
|
|
|
Text(action.label.localized()).tag(action)
|
2022-12-18 00:05:07 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var playerBarFooter: some View {
|
|
|
|
#if os(iOS)
|
|
|
|
Text("Tap and hold channel thumbnail to open context menu with more actions")
|
|
|
|
#elseif os(macOS)
|
|
|
|
Text("Right click channel thumbnail to open context menu with more actions")
|
2022-12-19 18:05:37 +05:30
|
|
|
.foregroundColor(.secondary)
|
|
|
|
.padding(.bottom, 10)
|
2022-12-18 00:05:07 +05:30
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-01-06 20:26:59 +05:30
|
|
|
private var interfaceSettings: some View {
|
2022-09-04 20:58:30 +05:30
|
|
|
Section(header: SettingsHeader(text: "Interface".localized())) {
|
2022-11-12 07:09:44 +05:30
|
|
|
#if !os(tvOS)
|
|
|
|
Toggle("Show Open Videos toolbar button", isOn: $showOpenActionsToolbarItem)
|
|
|
|
#endif
|
2022-01-06 20:26:59 +05:30
|
|
|
#if os(iOS)
|
2022-11-13 04:31:04 +05:30
|
|
|
Toggle("Show Documents", isOn: $showDocuments)
|
|
|
|
|
2024-09-01 16:12:31 +05:30
|
|
|
if Constants.isIPad {
|
|
|
|
Toggle("Lock portrait mode", isOn: $lockPortraitWhenBrowsing)
|
|
|
|
.onChange(of: lockPortraitWhenBrowsing) { lock in
|
|
|
|
if lock {
|
|
|
|
enterFullscreenInLandscape = true
|
|
|
|
Orientation.lockOrientation(.portrait, andRotateTo: .portrait)
|
|
|
|
} else {
|
|
|
|
enterFullscreenInLandscape = false
|
2024-09-06 20:17:03 +05:30
|
|
|
Orientation.lockOrientation(.all)
|
2024-09-01 16:12:31 +05:30
|
|
|
}
|
2021-12-01 16:52:19 +05:30
|
|
|
}
|
2024-09-01 16:12:31 +05:30
|
|
|
}
|
2022-01-06 20:26:59 +05:30
|
|
|
#endif
|
2021-12-03 00:52:55 +05:30
|
|
|
|
2022-11-12 01:58:40 +05:30
|
|
|
if !accounts.isEmpty {
|
|
|
|
#if !os(tvOS)
|
|
|
|
Toggle("Show account username", isOn: $accountPickerDisplaysUsername)
|
|
|
|
#endif
|
2022-08-26 05:06:46 +05:30
|
|
|
|
2022-11-12 01:58:40 +05:30
|
|
|
Toggle("Show anonymous accounts", isOn: $accountPickerDisplaysAnonymousAccounts)
|
2023-03-01 01:47:12 +05:30
|
|
|
Toggle("Show unwatched feed badges", isOn: $showUnwatchedFeedBadges)
|
|
|
|
.onChange(of: showUnwatchedFeedBadges) { newValue in
|
|
|
|
if newValue {
|
|
|
|
FeedModel.shared.calculateUnwatchedFeed()
|
|
|
|
}
|
|
|
|
}
|
2023-05-27 02:08:32 +05:30
|
|
|
|
|
|
|
Toggle("Open channels with description expanded", isOn: $expandChannelDescription)
|
2022-11-12 01:58:40 +05:30
|
|
|
}
|
2022-12-19 06:07:09 +05:30
|
|
|
|
2023-05-27 02:08:32 +05:30
|
|
|
Toggle("Keep channels with unwatched videos on top of subscriptions list", isOn: $keepChannelsWithUnwatchedFeedOnTop)
|
2023-07-22 22:32:59 +05:30
|
|
|
|
|
|
|
Toggle("Show channel avatars in channels lists", isOn: $showChannelAvatarInChannelsLists)
|
|
|
|
Toggle("Show channel avatars in videos lists", isOn: $showChannelAvatarInVideosListing)
|
2022-01-06 20:26:59 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private var thumbnailsSettings: some View {
|
2022-09-04 20:58:30 +05:30
|
|
|
Section(header: SettingsHeader(text: "Thumbnails".localized())) {
|
2022-06-26 17:55:54 +05:30
|
|
|
thumbnailsQualityPicker
|
2022-01-06 20:26:59 +05:30
|
|
|
#if !os(tvOS)
|
|
|
|
Toggle("Round corners", isOn: $roundedThumbnails)
|
|
|
|
#endif
|
|
|
|
Toggle("Show channel name", isOn: $channelOnThumbnail)
|
|
|
|
Toggle("Show video length", isOn: $timeOnThumbnail)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-26 17:55:54 +05:30
|
|
|
private var thumbnailsQualityPicker: some View {
|
|
|
|
Picker("Quality", selection: $thumbnailsQuality) {
|
|
|
|
ForEach(ThumbnailsQuality.allCases, id: \.self) { quality in
|
2022-09-04 20:58:30 +05:30
|
|
|
Text(quality.description)
|
2022-06-26 17:55:54 +05:30
|
|
|
}
|
|
|
|
}
|
2022-08-06 19:58:05 +05:30
|
|
|
.modifier(SettingsPickerModifier())
|
2022-06-26 17:55:54 +05:30
|
|
|
}
|
|
|
|
|
2022-01-06 20:26:59 +05:30
|
|
|
private var visibleSectionsSettings: some View {
|
2022-09-04 20:58:30 +05:30
|
|
|
Section(header: SettingsHeader(text: "Sections".localized())) {
|
2023-05-25 20:31:53 +05:30
|
|
|
ForEach(VisibleSection.allCases, id: \.self) { section in
|
|
|
|
MultiselectRow(
|
|
|
|
title: section.title,
|
|
|
|
selected: visibleSections.contains(section)
|
|
|
|
) { value in
|
|
|
|
toggleSection(section, value: value)
|
2022-01-06 20:26:59 +05:30
|
|
|
}
|
2023-05-25 20:31:53 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 20:26:59 +05:30
|
|
|
|
2023-05-25 20:31:53 +05:30
|
|
|
private var startupSectionPicker: some View {
|
|
|
|
Group {
|
|
|
|
#if os(tvOS)
|
|
|
|
SettingsHeader(text: "Startup section".localized())
|
2022-01-06 20:26:59 +05:30
|
|
|
#endif
|
2023-05-25 20:31:53 +05:30
|
|
|
Picker("Startup section", selection: $startupSection) {
|
|
|
|
ForEach(StartupSection.allCases, id: \.rawValue) { section in
|
|
|
|
Text(section.label).tag(section)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.modifier(SettingsPickerModifier())
|
2021-11-05 04:55:51 +05:30
|
|
|
}
|
|
|
|
}
|
2021-11-08 02:21:22 +05:30
|
|
|
|
2024-09-09 19:35:24 +05:30
|
|
|
private var showSearchSuggestionsToggle: some View {
|
|
|
|
Toggle("Show search suggestions", isOn: $showSearchSuggestions)
|
|
|
|
}
|
|
|
|
|
2022-01-06 20:26:59 +05:30
|
|
|
private func toggleSection(_ section: VisibleSection, value: Bool) {
|
2021-12-01 16:52:19 +05:30
|
|
|
if value {
|
|
|
|
visibleSections.insert(section)
|
|
|
|
} else {
|
|
|
|
visibleSections.remove(section)
|
|
|
|
}
|
2021-11-08 02:21:22 +05:30
|
|
|
}
|
2021-11-05 04:55:51 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
struct BrowsingSettings_Previews: PreviewProvider {
|
|
|
|
static var previews: some View {
|
2022-11-12 00:23:52 +05:30
|
|
|
VStack {
|
|
|
|
BrowsingSettings()
|
|
|
|
}
|
|
|
|
.injectFixtureEnvironmentObjects()
|
2021-11-05 04:55:51 +05:30
|
|
|
}
|
|
|
|
}
|