diff --git a/OnCue/View/MainView.swift b/OnCue/View/MainView.swift index 6fc3c88..d9c5a56 100644 --- a/OnCue/View/MainView.swift +++ b/OnCue/View/MainView.swift @@ -38,12 +38,11 @@ struct MainView: View { } .toolbar { -// ToolbarItem(placement: .topBarLeading) { -// Button(action: {showSettingsView.toggle()}) { -// Image(systemName: "gear") -// } -// -// } + ToolbarItem(placement: .topBarLeading) { + Button(action: {showSettingsView.toggle()}) { + Image(systemName: "gear") + } + } // ToolbarItem(placement: .topBarTrailing) { // Menu { // Picker(selection: $filterColor) { diff --git a/OnCue/View/SettingsView.swift b/OnCue/View/SettingsView.swift index 55258ab..964dc5c 100644 --- a/OnCue/View/SettingsView.swift +++ b/OnCue/View/SettingsView.swift @@ -11,14 +11,25 @@ struct SettingsView: View { @Environment(\.dismiss) var dismiss // @State private var teleprompterSeparator = "---" - @AppStorage(Preferences.teleprompterSeparator) var teleprompterSeparator: String = "---" + + @AppStorage(Preferences.watchConnectivity) var watchConnectivity = false + + @AppStorage(Preferences.cueDefaultSize) var cueDefaultSize = 25.0 + + @AppStorage(Preferences.teleSeparator) var teleprompterSeparator: String = "---" + @AppStorage(Preferences.teleDefaultSize) var teleDefaultSize = 45.0 + @AppStorage(Preferences.teleAutoScroll) var teleAutoScroll = false + + + var body: some View { NavigationView { List { - Section { - TextField(text: $teleprompterSeparator) { Text("Teleprompter Cuecard Separator") } - } header: { Text("Teleprompter View") } + cueCardSettings + teleprompterSettings + appleWatchSettings + aboutApp } .navigationTitle("Settings") .navigationBarTitleDisplayMode(.inline) @@ -29,6 +40,35 @@ struct SettingsView: View { } } } + + var cueCardSettings: some View { + Section { + Stepper("Default Text Size: \(cueDefaultSize.formatted())", value: $cueDefaultSize, in: 1...100) + } header: { Text("Cue Cards") } + } + + var teleprompterSettings: some View { + Section { + Stepper("Default Text Size: \(teleDefaultSize.formatted())", value: $teleDefaultSize, in: 1...100) + Toggle("AutoScroll", isOn: $teleAutoScroll) + } header: { Text("Teleprompter") } + } + + var appleWatchSettings: some View { + Section { + Toggle("Enable Watch Connectivity", isOn: $watchConnectivity) + if watchConnectivity { + Button("Test Watch Connection") {} + } + + } header: { Text("Watch") } + } + + var aboutApp: some View { + Section { + LabeledContent("Version", value: "1.0b1") + } header: { Text("About") } footer: { Text("Made with love, by bread <3 🇳🇿") } + } } #Preview { diff --git a/OnCue/View/TeleprompterView.swift b/OnCue/View/TeleprompterView.swift index 74be5ab..540b555 100644 --- a/OnCue/View/TeleprompterView.swift +++ b/OnCue/View/TeleprompterView.swift @@ -13,18 +13,19 @@ struct TeleprompterView: View { @State private var textSize = 45.0 @State private var horizPadding = 15.0 + @State private var scrollSpeed = 0.5 var body: some View { - ScrollView { - Text(project.script) - .font(.system(size: textSize)) - .padding(.horizontal, horizPadding) - } -// AutoScrollView { +// ScrollView { // Text(project.script) // .font(.system(size: textSize)) // .padding(.horizontal, horizPadding) // } + AutoScrollView(scrollSpeed: scrollSpeed) { + Text(project.script) + .font(.system(size: textSize)) + .padding(.horizontal, horizPadding) + } .toolbar { ToolbarItem(placement: .topBarTrailing) { Menu { overflowMenu } label: { @@ -49,6 +50,9 @@ struct TeleprompterView: View { Menu { Stepper("\(horizPadding.formatted())", value: $horizPadding, in: 0...150, step: 5) } label: { Label("Margin", systemImage: "rectangle.portrait.arrowtriangle.2.inward") } + Menu { Stepper("\(scrollSpeed.formatted())", value: $scrollSpeed, in: 0.0...4.0, step: 0.1) } label: { + Label("Scroll Speed", systemImage: "arrow.up.and.down.text.horizontal") + } } } } diff --git a/Shared/AutoScrollView.swift b/Shared/AutoScrollView.swift index 8ba701b..afdbfa0 100644 --- a/Shared/AutoScrollView.swift +++ b/Shared/AutoScrollView.swift @@ -11,29 +11,29 @@ import SwiftData //struct AutoScrollView: View { // let content: Content // var scrollSpeed: Double = 15.0 -// +// // @State private var offset: Double = 0.0 -// +// // init(scrollSpeed: Double = 0, @ViewBuilder _ content: () -> Content) { // self.content = content() // self.scrollSpeed = scrollSpeed // } -// +// // var body: some View { // ScrollView { // content // .offset(y: offset) // } // } -// +// // func startScrolling() { -// +// // } -// +// // func stopScrolling() { -// +// // } -// +// // mutating func setScrollSpeed(_ speed: Double) { // self.scrollSpeed = speed // } @@ -44,48 +44,47 @@ struct AutoScrollView: View { @State private var timer: Timer? = nil let content: Content - var scrollSpeed: CGFloat = 0.5 // Adjust this value to control the scroll speed + var scrollSpeed: CGFloat // Adjust this value to control the scroll speed - init(scrollSpeed: Double = 0.7, @ViewBuilder _ content: () -> Content) { + init(scrollSpeed: Double = 1.0, @ViewBuilder _ content: () -> Content) { self.content = content() self.scrollSpeed = scrollSpeed } - + var body: some View { - ScrollView { - VStack { + ScrollViewReader { proxy in + ScrollView { content - .padding() + .id(0) // Assign an ID to the content .background(GeometryReader { geo in Color.clear.onAppear { - // Calculate the height of the content let contentHeight = geo.size.height - startTimer(contentHeight: contentHeight) + startTimer(proxy: proxy, contentHeight: contentHeight) } }) - .offset(y: -scrollOffset) } } .onDisappear { stopTimer() } } - - private func startTimer(contentHeight: CGFloat) { + + private func startTimer(proxy: ScrollViewProxy, contentHeight: CGFloat) { timer?.invalidate() // Invalidate any existing timer timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { _ in - // Update the scroll offset withAnimation { scrollOffset += scrollSpeed + proxy.scrollTo(0, anchor: .bottom) + proxy.scrollTo(scrollOffset, anchor: .bottom) } - + // Reset scroll offset when it reaches the end if scrollOffset >= contentHeight { - scrollOffset = 0 + stopTimer() } } } - + private func stopTimer() { timer?.invalidate() timer = nil @@ -99,8 +98,8 @@ struct AutoScrollView: View { container.mainContext.insert(PreviewData.project) return AutoScrollView { - Text(PreviewData.project.script) - .font(.system(size: 45)) - .padding(.horizontal) - } + Text(PreviewData.project.script) + .font(.system(size: 45)) + .padding(.horizontal) + } } diff --git a/Shared/Preferences.swift b/Shared/Preferences.swift index a033436..fe489a6 100644 --- a/Shared/Preferences.swift +++ b/Shared/Preferences.swift @@ -8,5 +8,11 @@ import Foundation public struct Preferences { - static let teleprompterSeparator = "teleprompterSeparator" + static let teleSeparator = "teleSeparator" + static let teleDefaultSize = "teleDefaultSize" + static let teleAutoScroll = "teleAutoScroll" + + static let watchConnectivity = "watchConnectivity" + + static let cueDefaultSize = "cueDefaultSize" }