forked from LoopKit/LoopKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSupportedRangeTableViewController.swift
More file actions
151 lines (118 loc) · 4.56 KB
/
SupportedRangeTableViewController.swift
File metadata and controls
151 lines (118 loc) · 4.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// 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)
}
}