| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- //
- // SupportedRangeTableViewController.swift
- // MockKitUI
- //
- // Created by Nathaniel Hamming on 2020-11-16.
- // Copyright © 2020 LoopKit Authors. All rights reserved.
- //
- import Foundation
- import UIKit
- import HealthKit
- import LoopKit
- import LoopKitUI
- import MockKit
- protocol SupportedRangeTableViewControllerDelegate: AnyObject {
- func supportedRangeDidUpdate(_ controller: SupportedRangeTableViewController)
- }
- final class SupportedRangeTableViewController: UITableViewController {
- weak var delegate: SupportedRangeTableViewControllerDelegate?
- var minValue: Double
-
- var maxValue: Double
-
- var stepSize: Double
-
- var indexPath: IndexPath?
-
- private let numberFormatter: NumberFormatter = {
- let formatter = NumberFormatter()
- formatter.numberStyle = .decimal
- formatter.minimumFractionDigits = 0
- formatter.maximumFractionDigits = 3
- return formatter
- }()
-
- init(minValue: Double,
- maxValue: Double,
- stepSize: Double)
- {
- self.minValue = minValue
- self.maxValue = maxValue
- self.stepSize = stepSize
- super.init(style: .grouped)
- }
- required init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- tableView.register(SettingsTableViewCell.self, forCellReuseIdentifier: SettingsTableViewCell.className)
- }
- // MARK: - Data Source
- private enum Row: Int, CaseIterable {
- case minValue = 0
- case maxValue
- case stepSize
- }
- override func numberOfSections(in tableView: UITableView) -> Int {
- return 1
- }
- override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- return Row.allCases.count
- }
-
- override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
- 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.)"
- }
- override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
- switch Row(rawValue: indexPath.row)! {
- case .minValue:
- cell.textLabel?.text = "Minimum Value"
- cell.detailTextLabel?.text = numberFormatter.string(from: minValue)
- case .maxValue:
- cell.textLabel?.text = "Maximum Value"
- cell.detailTextLabel?.text = numberFormatter.string(from: maxValue)
- case .stepSize:
- cell.textLabel?.text = "Step Size"
- cell.detailTextLabel?.text = numberFormatter.string(from: stepSize)
- }
- cell.accessoryType = .disclosureIndicator
- return cell
- }
- override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- let sender = tableView.cellForRow(at: indexPath)
-
- let value: Double
- switch Row(rawValue: indexPath.row)! {
- case .minValue:
- value = minValue
- case .maxValue:
- value = maxValue
- case .stepSize:
- value = stepSize
- }
- let vc = TextFieldTableViewController()
- vc.value = numberFormatter.string(from: value)
- vc.keyboardType = .decimalPad
- vc.indexPath = indexPath
- vc.delegate = self
- show(vc, sender: sender)
- tableView.deselectRow(at: indexPath, animated: true)
- }
- }
- extension SupportedRangeTableViewController: TextFieldTableViewControllerDelegate {
- func textFieldTableViewControllerDidReturn(_ controller: TextFieldTableViewController) {
- update(from: controller)
- }
- func textFieldTableViewControllerDidEndEditing(_ controller: TextFieldTableViewController) {
- update(from: controller)
- }
- private func update(from controller: TextFieldTableViewController) {
- guard let indexPath = controller.indexPath,
- let value = controller.value.flatMap(Double.init) else { assertionFailure(); return }
- switch Row(rawValue: indexPath.row)! {
- case .minValue:
- minValue = max(value, 0.0)
- case .maxValue:
- maxValue = max(value, 0.0)
- case .stepSize:
- stepSize = max(value, 0.0)
- }
- delegate?.supportedRangeDidUpdate(self)
- tableView.reloadRows(at: [indexPath], with: .automatic)
- }
- }
|