mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 17:59:45 +00:00
Yattee v2 rewrite
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user