Yattee v2 rewrite

This commit is contained in:
Arkadiusz Fal
2026-02-08 18:31:16 +01:00
parent 20d0cfc0c7
commit 05f921d605
1043 changed files with 163875 additions and 68430 deletions

View File

@@ -0,0 +1,239 @@
//
// LayoutNavigationSettingsView.swift
// Yattee
//
// Settings view for layout and navigation customization.
//
import SwiftUI
struct LayoutNavigationSettingsView: View {
@Environment(\.appEnvironment) private var appEnvironment
var body: some View {
Form {
if let settings = appEnvironment?.settingsManager {
CustomizationSection()
#if os(iOS)
HapticsSection(settings: settings)
#endif
#if !os(tvOS)
VideoActionsSection(settings: settings)
#endif
LinkActionSection(settings: settings)
ClipboardSection(settings: settings)
#if os(iOS)
if #available(iOS 26, *) {
MiniPlayerMinimizeBehaviorSection(settings: settings)
}
#endif
HandoffSection(settings: settings)
}
}
.navigationTitle(String(localized: "settings.layoutNavigation.title"))
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)
#endif
}
}
// MARK: - Haptics Section
#if os(iOS)
private struct HapticsSection: View {
@Bindable var settings: SettingsManager
var body: some View {
if SettingsManager.deviceSupportsHaptics {
Section {
Toggle(
String(localized: "settings.haptics.title"),
isOn: $settings.hapticFeedbackEnabled
)
if settings.hapticFeedbackEnabled {
Picker(
String(localized: "settings.haptics.intensity"),
selection: $settings.hapticFeedbackIntensity
) {
ForEach(HapticFeedbackIntensity.allCases.filter { $0 != .off }, id: \.self) { intensity in
Text(intensity.displayName).tag(intensity)
}
}
}
}
}
}
}
#endif
// MARK: - Customization Section
private struct CustomizationSection: View {
var body: some View {
Section {
NavigationLink {
HomeSettingsView()
} label: {
Label(String(localized: "settings.appearance.home.customize"), systemImage: SidebarItem.home.systemImage)
}
#if os(iOS)
NavigationLink {
TabBarSettingsView()
} label: {
Label(String(localized: "settings.tabBar.title"), systemImage: "square.grid.3x3")
}
// Sidebar settings only on iPad (not iPhone)
if UIDevice.current.userInterfaceIdiom == .pad {
NavigationLink {
SidebarSettingsView()
} label: {
Label(String(localized: "settings.sidebar.title"), systemImage: "sidebar.leading")
}
}
#endif
#if os(macOS) || os(tvOS)
NavigationLink {
SidebarSettingsView()
} label: {
Label(String(localized: "settings.sidebar.title"), systemImage: "sidebar.leading")
}
#endif
}
}
}
// MARK: - Link Action Section
private struct LinkActionSection: View {
@Bindable var settings: SettingsManager
var body: some View {
Section {
Picker(
String(localized: "settings.behavior.linkAction"),
selection: $settings.defaultLinkAction
) {
ForEach(DefaultLinkAction.allCases, id: \.self) { action in
Text(action.displayName).tag(action)
}
}
} header: {
Text(String(localized: "settings.behavior.linkAction.header"))
} footer: {
Text(String(localized: "settings.behavior.linkAction.footer"))
}
}
}
// MARK: - Clipboard Section
private struct ClipboardSection: View {
@Bindable var settings: SettingsManager
var body: some View {
Section {
Toggle(
String(localized: "settings.behavior.clipboardMonitoring"),
isOn: $settings.clipboardURLDetectionEnabled
)
} header: {
Text(String(localized: "settings.dataPrivacy.clipboard.header"))
} footer: {
Text(String(localized: "settings.behavior.clipboardMonitoring.footer"))
}
}
}
// MARK: - Video Actions Section
#if !os(tvOS)
private struct VideoActionsSection: View {
@Bindable var settings: SettingsManager
var body: some View {
Section {
Picker(
String(localized: "settings.behavior.thumbnailTapAction"),
selection: $settings.thumbnailTapAction
) {
ForEach(VideoTapAction.allCases, id: \.self) { action in
Text(action.displayName).tag(action)
}
}
Picker(
String(localized: "settings.behavior.textAreaTapAction"),
selection: $settings.textAreaTapAction
) {
ForEach(VideoTapAction.allCases, id: \.self) { action in
Text(action.displayName).tag(action)
}
}
NavigationLink {
SwipeActionsSettingsView()
} label: {
Label(String(localized: "settings.appearance.swipeActions"), systemImage: "hand.draw")
}
} header: {
Text(String(localized: "settings.videoActions.header"))
}
}
}
#endif
// MARK: - Mini Player Minimize Behavior Section (iOS 26+)
#if os(iOS)
@available(iOS 26, *)
private struct MiniPlayerMinimizeBehaviorSection: View {
@Bindable var settings: SettingsManager
var body: some View {
Section {
Picker(
String(localized: "settings.behavior.miniPlayer.minimizeBehavior"),
selection: $settings.miniPlayerMinimizeBehavior
) {
ForEach(MiniPlayerMinimizeBehavior.allCases, id: \.self) { behavior in
Text(behavior.displayName).tag(behavior)
}
}
} header: {
Text(String(localized: "settings.behavior.miniPlayer.header"))
} footer: {
Text(String(localized: "settings.behavior.miniPlayer.minimizeBehavior.footer"))
}
}
}
#endif
// MARK: - Handoff Section
private struct HandoffSection: View {
@Bindable var settings: SettingsManager
var body: some View {
Section {
Toggle(
String(localized: "settings.behavior.handoff"),
isOn: $settings.handoffEnabled
)
} header: {
Text(String(localized: "settings.behavior.handoff.header"))
} footer: {
Text(String(localized: "settings.behavior.handoff.footer"))
}
}
}
#Preview {
NavigationStack {
LayoutNavigationSettingsView()
}
.appEnvironment(.preview)
}