GeneralSettingsView.swift 5.9 KB

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