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,97 @@
//
// PanscanGestureSettingsView.swift
// Yattee
//
// Settings view for configuring pinch-to-panscan gesture.
//
#if os(iOS)
import SwiftUI
/// Settings view for configuring pinch-to-panscan gesture on the player.
struct PanscanGestureSettingsView: View {
@Bindable var viewModel: PlayerControlsSettingsViewModel
// Local state for immediate UI updates
@State private var isEnabled: Bool = true
@State private var snapToEnds: Bool = true
var body: some View {
List {
enableSection
if isEnabled {
snapModeSection
}
}
.navigationTitle(String(localized: "gestures.panscan.title", defaultValue: "Panscan Gesture"))
.navigationBarTitleDisplayMode(.inline)
.onAppear {
syncFromViewModel()
}
.onChange(of: viewModel.activePreset?.id) { _, _ in
syncFromViewModel()
}
}
// MARK: - Sections
private var enableSection: some View {
Section {
Toggle(
String(localized: "gestures.panscan.enable", defaultValue: "Enable Panscan Gesture"),
isOn: $isEnabled
)
.onChange(of: isEnabled) { _, newValue in
viewModel.updatePanscanGestureSettingsSync { $0.isEnabled = newValue }
}
.disabled(!viewModel.canEditActivePreset)
} footer: {
Text(String(localized: "gestures.panscan.enableFooter", defaultValue: "Pinch to zoom between fit and fill modes while in fullscreen."))
}
}
private var snapModeSection: some View {
Section {
Toggle(
String(localized: "gestures.panscan.snapToEnds", defaultValue: "Snap to Fit/Fill"),
isOn: $snapToEnds
)
.onChange(of: snapToEnds) { _, newValue in
viewModel.updatePanscanGestureSettingsSync { $0.snapToEnds = newValue }
}
.disabled(!viewModel.canEditActivePreset)
} footer: {
Text(snapModeFooterText)
}
}
// MARK: - Helpers
private var snapModeFooterText: String {
if snapToEnds {
String(localized: "gestures.panscan.snapToEnds.on.footer", defaultValue: "When released, the zoom will snap to either fit (show full video) or fill (fill the screen).")
} else {
String(localized: "gestures.panscan.snapToEnds.off.footer", defaultValue: "The zoom level stays exactly where you release, allowing any value between fit and fill.")
}
}
private func syncFromViewModel() {
let settings = viewModel.panscanGestureSettings
isEnabled = settings.isEnabled
snapToEnds = settings.snapToEnds
}
}
// MARK: - Preview
#Preview {
NavigationStack {
PanscanGestureSettingsView(
viewModel: PlayerControlsSettingsViewModel(
layoutService: PlayerControlsLayoutService(),
settingsManager: SettingsManager()
)
)
}
}
#endif