AlarmBGLimitSection.swift 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // LoopFollow
  2. // AlarmBGLimitSection.swift
  3. // Created by Jonas Björkert on 2025-05-14.
  4. import SwiftUI
  5. struct AlarmBGLimitSection: View {
  6. let header: String?
  7. let footer: String?
  8. let toggleText: String
  9. let pickerTitle: String
  10. let range: ClosedRange<Double>
  11. @Binding var value: Double?
  12. init(
  13. header: String? = nil,
  14. footer: String? = nil,
  15. toggleText: String,
  16. pickerTitle: String,
  17. range: ClosedRange<Double>,
  18. value: Binding<Double?>
  19. ) {
  20. self.header = header
  21. self.footer = footer
  22. self.toggleText = toggleText
  23. self.pickerTitle = pickerTitle
  24. self.range = range
  25. _value = value
  26. }
  27. private var isOn: Binding<Bool> {
  28. Binding(
  29. get: { value != nil },
  30. set: { on in
  31. if on, value == nil { value = range.lowerBound }
  32. if !on { value = nil }
  33. }
  34. )
  35. }
  36. private var pickerValue: Binding<Double> {
  37. Binding(
  38. get: { value ?? range.lowerBound },
  39. set: { newVal in value = newVal }
  40. )
  41. }
  42. var body: some View {
  43. Section(
  44. header: header.map(Text.init),
  45. footer: footer.map(Text.init)
  46. ) {
  47. Toggle(toggleText, isOn: isOn)
  48. if isOn.wrappedValue {
  49. AlarmBGPicker(
  50. title: pickerTitle,
  51. range: range,
  52. value: pickerValue
  53. )
  54. }
  55. }
  56. }
  57. }