GeneralSettingsView.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // LoopFollow
  2. // GeneralSettingsView.swift
  3. // Created by Jonas Björkert on 2025-05-26.
  4. import SwiftUI
  5. struct GeneralSettingsView: View {
  6. @ObservedObject var colorBGText = Storage.shared.colorBGText
  7. @ObservedObject var appBadge = Storage.shared.appBadge
  8. @ObservedObject var forceDarkMode = Storage.shared.forceDarkMode
  9. @ObservedObject var showStats = Storage.shared.showStats
  10. @ObservedObject var useIFCC = Storage.shared.useIFCC
  11. @ObservedObject var showSmallGraph = Storage.shared.showSmallGraph
  12. @ObservedObject var screenlockSwitchState = Storage.shared.screenlockSwitchState
  13. @ObservedObject var showDisplayName = Storage.shared.showDisplayName
  14. @ObservedObject var snoozerEmoji = Storage.shared.snoozerEmoji
  15. @ObservedObject var forcePortraitMode = Storage.shared.forcePortraitMode
  16. @ObservedObject var persistentNotification = Storage.shared.persistentNotification
  17. // Speak-BG settings
  18. @ObservedObject var speakBG = Storage.shared.speakBG
  19. @ObservedObject var speakBGAlways = Storage.shared.speakBGAlways
  20. @ObservedObject var speakLanguage = Storage.shared.speakLanguage
  21. @ObservedObject var speakLowBG = Storage.shared.speakLowBG
  22. @ObservedObject var speakProactiveLowBG = Storage.shared.speakProactiveLowBG
  23. @ObservedObject var speakLowBGLimit = Storage.shared.speakLowBGLimit
  24. @ObservedObject var speakFastDropDelta = Storage.shared.speakFastDropDelta
  25. @ObservedObject var speakHighBG = Storage.shared.speakHighBG
  26. @ObservedObject var speakHighBGLimit = Storage.shared.speakHighBGLimit
  27. var body: some View {
  28. NavigationView {
  29. Form {
  30. Section("App Settings") {
  31. Toggle("Display App Badge", isOn: $appBadge.value)
  32. Toggle("Persistent Notification", isOn: $persistentNotification.value)
  33. }
  34. Section("Display") {
  35. Toggle("Force Dark Mode (restart app)", isOn: $forceDarkMode.value)
  36. Toggle("Display Stats", isOn: $showStats.value)
  37. Toggle("Use IFCC A1C", isOn: $useIFCC.value)
  38. Toggle("Display Small Graph", isOn: $showSmallGraph.value)
  39. Toggle("Color BG Text", isOn: $colorBGText.value)
  40. Toggle("Keep Screen Active", isOn: $screenlockSwitchState.value)
  41. Toggle("Show Display Name", isOn: $showDisplayName.value)
  42. Toggle("Snoozer emoji", isOn: $snoozerEmoji.value)
  43. Toggle("Force portrait mode", isOn: $forcePortraitMode.value)
  44. .onChange(of: forcePortraitMode.value) { _ in
  45. if #available(iOS 16.0, *) {
  46. let window = UIApplication.shared.connectedScenes
  47. .compactMap { $0 as? UIWindowScene }
  48. .flatMap { $0.windows }
  49. .first
  50. window?.rootViewController?.setNeedsUpdateOfSupportedInterfaceOrientations()
  51. }
  52. }
  53. }
  54. Section("Speak BG") {
  55. Toggle("Speak BG", isOn: $speakBG.value.animation())
  56. if speakBG.value {
  57. Picker("Language", selection: $speakLanguage.value) {
  58. Text("English").tag("en")
  59. Text("Italian").tag("it")
  60. Text("Slovak").tag("sk")
  61. Text("Swedish").tag("sv")
  62. }
  63. Toggle("Always", isOn: $speakBGAlways.value.animation())
  64. if !speakBGAlways.value {
  65. Toggle("Low", isOn: $speakLowBG.value.animation())
  66. .onChange(of: speakLowBG.value) { newValue in
  67. if newValue {
  68. speakProactiveLowBG.value = false
  69. }
  70. }
  71. Toggle("Proactive Low", isOn: $speakProactiveLowBG.value.animation())
  72. .onChange(of: speakProactiveLowBG.value) { newValue in
  73. if newValue {
  74. speakLowBG.value = false
  75. }
  76. }
  77. if speakLowBG.value || speakProactiveLowBG.value {
  78. BGPicker(
  79. title: "Low BG Limit",
  80. range: 40 ... 108,
  81. value: $speakLowBGLimit.value
  82. )
  83. }
  84. if speakProactiveLowBG.value {
  85. BGPicker(
  86. title: "Fast Drop Delta",
  87. range: 3 ... 20,
  88. value: $speakFastDropDelta.value
  89. )
  90. }
  91. Toggle("High", isOn: $speakHighBG.value.animation())
  92. if speakHighBG.value {
  93. BGPicker(
  94. title: "High BG Limit",
  95. range: 140 ... 300,
  96. value: $speakHighBGLimit.value
  97. )
  98. }
  99. }
  100. }
  101. }
  102. }
  103. }
  104. .preferredColorScheme(Storage.shared.forceDarkMode.value ? .dark : nil)
  105. .navigationBarTitle("General Settings", displayMode: .inline)
  106. }
  107. }