Add tvOS setting for video click behavior

This commit is contained in:
Arkadiusz Fal
2026-04-16 04:26:48 +02:00
parent fb2db35fe8
commit 9b55ee7127
5 changed files with 78 additions and 1 deletions

View File

@@ -506,6 +506,26 @@ extension SettingsManager {
}
#endif
// MARK: - Video Tap Action (tvOS only)
#if os(tvOS)
/// Action to perform when clicking a video cell on tvOS. Default is openInfo.
var tvOSVideoTapAction: VideoTapAction {
get {
if let cached = _tvOSVideoTapAction { return cached }
guard let rawValue = localDefaults.string(forKey: "tvOSVideoTapAction"),
let action = VideoTapAction(rawValue: rawValue) else {
return .openInfo
}
return action
}
set {
_tvOSVideoTapAction = newValue
localDefaults.set(newValue.rawValue, forKey: "tvOSVideoTapAction")
}
}
#endif
// MARK: - Onboarding
/// Whether onboarding has been completed on this device.

View File

@@ -190,6 +190,11 @@ final class SettingsManager {
var _textAreaTapAction: VideoTapAction?
#endif
// Video tap action (tvOS only)
#if os(tvOS)
var _tvOSVideoTapAction: VideoTapAction?
#endif
// Player Controls settings (controlsButtonSize moved to preset)
// Appearance settings
@@ -500,6 +505,9 @@ final class SettingsManager {
_thumbnailTapAction = nil
_textAreaTapAction = nil
#endif
#if os(tvOS)
_tvOSVideoTapAction = nil
#endif
_listStyle = nil
#if os(iOS)
_appIcon = nil

View File

@@ -10256,6 +10256,16 @@
}
}
},
"settings.behavior.tvOSVideoTapAction" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "On Click"
}
}
}
},
"settings.behavior.videoTap.none" : {
"localizations" : {
"en" : {

View File

@@ -58,7 +58,18 @@ struct TappableVideoModifier: ViewModifier {
func body(content: Content) -> some View {
Button {
dismissKeyboard()
#if os(tvOS)
let tapAction = appEnvironment?.settingsManager.tvOSVideoTapAction ?? .openInfo
if tapAction == .openInfo {
appEnvironment?.navigationCoordinator.navigate(
to: .video(.loaded(video), queueContext: queueContext)
)
} else {
checkPasswordAndPlay()
}
#else
checkPasswordAndPlay()
#endif
} label: {
content
.contentShape(Rectangle())

View File

@@ -17,7 +17,9 @@ struct LayoutNavigationSettingsView: View {
#if os(iOS)
HapticsSection(settings: settings)
#endif
#if !os(tvOS)
#if os(tvOS)
TVVideoActionsSection(settings: settings)
#else
VideoActionsSection(settings: settings)
LinkActionSection(settings: settings)
ClipboardSection(settings: settings)
@@ -190,6 +192,32 @@ private struct VideoActionsSection: View {
}
#endif
// MARK: - TV Video Actions Section
#if os(tvOS)
private struct TVVideoActionsSection: View {
@Bindable var settings: SettingsManager
var body: some View {
Section {
LabeledContent(String(localized: "settings.behavior.tvOSVideoTapAction")) {
Picker(
String(localized: "settings.behavior.tvOSVideoTapAction"),
selection: $settings.tvOSVideoTapAction
) {
Text(VideoTapAction.openInfo.displayName).tag(VideoTapAction.openInfo)
Text(VideoTapAction.playVideo.displayName).tag(VideoTapAction.playVideo)
}
.pickerStyle(.menu)
.labelsHidden()
}
} header: {
Text(String(localized: "settings.videoActions.header"))
}
}
}
#endif
// MARK: - Mini Player Minimize Behavior Section (iOS 26+)
#if os(iOS)