SupportedRangeTableViewController.swift 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // SupportedRangeTableViewController.swift
  3. // MockKitUI
  4. //
  5. // Created by Nathaniel Hamming on 2020-11-16.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. import HealthKit
  11. import LoopKit
  12. import LoopKitUI
  13. import MockKit
  14. protocol SupportedRangeTableViewControllerDelegate: AnyObject {
  15. func supportedRangeDidUpdate(_ controller: SupportedRangeTableViewController)
  16. }
  17. final class SupportedRangeTableViewController: UITableViewController {
  18. weak var delegate: SupportedRangeTableViewControllerDelegate?
  19. var minValue: Double
  20. var maxValue: Double
  21. var stepSize: Double
  22. var indexPath: IndexPath?
  23. private let numberFormatter: NumberFormatter = {
  24. let formatter = NumberFormatter()
  25. formatter.numberStyle = .decimal
  26. formatter.minimumFractionDigits = 0
  27. formatter.maximumFractionDigits = 3
  28. return formatter
  29. }()
  30. init(minValue: Double,
  31. maxValue: Double,
  32. stepSize: Double)
  33. {
  34. self.minValue = minValue
  35. self.maxValue = maxValue
  36. self.stepSize = stepSize
  37. super.init(style: .grouped)
  38. }
  39. required init?(coder aDecoder: NSCoder) {
  40. fatalError("init(coder:) has not been implemented")
  41. }
  42. override func viewDidLoad() {
  43. super.viewDidLoad()
  44. tableView.register(SettingsTableViewCell.self, forCellReuseIdentifier: SettingsTableViewCell.className)
  45. }
  46. // MARK: - Data Source
  47. private enum Row: Int, CaseIterable {
  48. case minValue = 0
  49. case maxValue
  50. case stepSize
  51. }
  52. override func numberOfSections(in tableView: UITableView) -> Int {
  53. return 1
  54. }
  55. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  56. return Row.allCases.count
  57. }
  58. override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
  59. return "Changing the supported values of the pump may cause the app to crash. Ensure you are changing them such that the set therapy values are still valid (e.g., basal rate, max bolus, etc.)"
  60. }
  61. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  62. let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
  63. switch Row(rawValue: indexPath.row)! {
  64. case .minValue:
  65. cell.textLabel?.text = "Minimum Value"
  66. cell.detailTextLabel?.text = numberFormatter.string(from: minValue)
  67. case .maxValue:
  68. cell.textLabel?.text = "Maximum Value"
  69. cell.detailTextLabel?.text = numberFormatter.string(from: maxValue)
  70. case .stepSize:
  71. cell.textLabel?.text = "Step Size"
  72. cell.detailTextLabel?.text = numberFormatter.string(from: stepSize)
  73. }
  74. cell.accessoryType = .disclosureIndicator
  75. return cell
  76. }
  77. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  78. let sender = tableView.cellForRow(at: indexPath)
  79. let value: Double
  80. switch Row(rawValue: indexPath.row)! {
  81. case .minValue:
  82. value = minValue
  83. case .maxValue:
  84. value = maxValue
  85. case .stepSize:
  86. value = stepSize
  87. }
  88. let vc = TextFieldTableViewController()
  89. vc.value = numberFormatter.string(from: value)
  90. vc.keyboardType = .decimalPad
  91. vc.indexPath = indexPath
  92. vc.delegate = self
  93. show(vc, sender: sender)
  94. tableView.deselectRow(at: indexPath, animated: true)
  95. }
  96. }
  97. extension SupportedRangeTableViewController: TextFieldTableViewControllerDelegate {
  98. func textFieldTableViewControllerDidReturn(_ controller: TextFieldTableViewController) {
  99. update(from: controller)
  100. }
  101. func textFieldTableViewControllerDidEndEditing(_ controller: TextFieldTableViewController) {
  102. update(from: controller)
  103. }
  104. private func update(from controller: TextFieldTableViewController) {
  105. guard let indexPath = controller.indexPath,
  106. let value = controller.value.flatMap(Double.init) else { assertionFailure(); return }
  107. switch Row(rawValue: indexPath.row)! {
  108. case .minValue:
  109. minValue = max(value, 0.0)
  110. case .maxValue:
  111. maxValue = max(value, 0.0)
  112. case .stepSize:
  113. stepSize = max(value, 0.0)
  114. }
  115. delegate?.supportedRangeDidUpdate(self)
  116. tableView.reloadRows(at: [indexPath], with: .automatic)
  117. }
  118. }