AlarmBGLimitSection.swift 1.6 KB

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