GeneralSettingsView.swift 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. // Speak-BG settings
  16. @ObservedObject var speakBG = Storage.shared.speakBG
  17. @ObservedObject var speakBGAlways = Storage.shared.speakBGAlways
  18. @ObservedObject var speakLanguage = Storage.shared.speakLanguage
  19. @ObservedObject var speakLowBG = Storage.shared.speakLowBG
  20. @ObservedObject var speakProactiveLowBG = Storage.shared.speakProactiveLowBG
  21. @ObservedObject var speakLowBGLimit = Storage.shared.speakLowBGLimit
  22. @ObservedObject var speakFastDropDelta = Storage.shared.speakFastDropDelta
  23. @ObservedObject var speakHighBG = Storage.shared.speakHighBG
  24. @ObservedObject var speakHighBGLimit = Storage.shared.speakHighBGLimit
  25. var body: some View {
  26. NavigationView {
  27. Form {
  28. Section("App Settings") {
  29. Toggle("Display App Badge", isOn: $appBadge.value)
  30. }
  31. Section("Display") {
  32. Toggle("Force Dark Mode (restart app)", isOn: $forceDarkMode.value)
  33. Toggle("Display Stats", isOn: $showStats.value)
  34. Toggle("Use IFCC A1C", isOn: $useIFCC.value)
  35. Toggle("Display Small Graph", isOn: $showSmallGraph.value)
  36. Toggle("Color BG Text", isOn: $colorBGText.value)
  37. Toggle("Keep Screen Active", isOn: $screenlockSwitchState.value)
  38. Toggle("Show Display Name", isOn: $showDisplayName.value)
  39. Toggle("Snoozer emoji", isOn: $snoozerEmoji.value)
  40. }
  41. Section("Speak BG") {
  42. Toggle("Speak BG", isOn: $speakBG.value.animation())
  43. if speakBG.value {
  44. Picker("Language", selection: $speakLanguage.value) {
  45. Text("English").tag("en")
  46. Text("Italian").tag("it")
  47. Text("Slovak").tag("sk")
  48. Text("Swedish").tag("sv")
  49. }
  50. Toggle("Always", isOn: $speakBGAlways.value.animation())
  51. if !speakBGAlways.value {
  52. Toggle("Low", isOn: $speakLowBG.value.animation())
  53. .onChange(of: speakLowBG.value) { newValue in
  54. if newValue {
  55. speakProactiveLowBG.value = false
  56. }
  57. }
  58. Toggle("Proactive Low", isOn: $speakProactiveLowBG.value.animation())
  59. .onChange(of: speakProactiveLowBG.value) { newValue in
  60. if newValue {
  61. speakLowBG.value = false
  62. }
  63. }
  64. if speakLowBG.value || speakProactiveLowBG.value {
  65. BGPicker(
  66. title: "Low BG Limit",
  67. range: 40 ... 108,
  68. value: $speakLowBGLimit.value
  69. )
  70. }
  71. if speakProactiveLowBG.value {
  72. BGPicker(
  73. title: "Fast Drop Delta",
  74. range: 3 ... 20,
  75. value: $speakFastDropDelta.value
  76. )
  77. }
  78. Toggle("High", isOn: $speakHighBG.value.animation())
  79. if speakHighBG.value {
  80. BGPicker(
  81. title: "High BG Limit",
  82. range: 140 ... 300,
  83. value: $speakHighBGLimit.value
  84. )
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. .preferredColorScheme(Storage.shared.forceDarkMode.value ? .dark : nil)
  92. .navigationBarTitle("General Settings", displayMode: .inline)
  93. }
  94. }