GraphSettingsViewController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. //
  2. // GraphSettingsViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jose Paredes on 7/16/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. import Eureka
  10. import EventKit
  11. import EventKitUI
  12. class GraphSettingsViewController: FormViewController {
  13. var appStateController: AppStateController?
  14. override func viewDidLoad() {
  15. super.viewDidLoad()
  16. if UserDefaultsRepository.forceDarkMode.value {
  17. overrideUserInterfaceStyle = .dark
  18. }
  19. buildGraphSettings()
  20. showHideNSDetails()
  21. }
  22. func showHideNSDetails() {
  23. var isHidden = false
  24. var isEnabled = true
  25. if UserDefaultsRepository.url.value == "" {
  26. isHidden = true
  27. isEnabled = false
  28. }
  29. if let row1 = form.rowBy(tag: "predictionToLoad") as? StepperRow {
  30. row1.hidden = .function(["hide"], {form in
  31. return isHidden
  32. })
  33. row1.evaluateHidden()
  34. }
  35. if let row2 = form.rowBy(tag: "smallGraphTreatments") as? SwitchRow {
  36. row2.hidden = .function(["hide"], {form in
  37. return isHidden
  38. })
  39. row2.evaluateHidden()
  40. }
  41. if let row3 = form.rowBy(tag: "minBasalScale") as? StepperRow {
  42. row3.hidden = .function(["hide"], {form in
  43. return isHidden
  44. })
  45. row3.evaluateHidden()
  46. }
  47. if let row4 = form.rowBy(tag: "showValues") as? SwitchRow {
  48. row4.hidden = .function(["hide"], {form in
  49. return isHidden
  50. })
  51. row4.evaluateHidden()
  52. }
  53. if let row5 = form.rowBy(tag: "showAbsorption") as? SwitchRow {
  54. row5.hidden = .function(["hide"], {form in
  55. return isHidden
  56. })
  57. row5.evaluateHidden()
  58. }
  59. }
  60. private func buildGraphSettings() {
  61. form
  62. +++ Section("Graph Settings")
  63. <<< SwitchRow("switchRowDots"){ row in
  64. row.title = "Display Dots"
  65. row.value = UserDefaultsRepository.showDots.value
  66. }.onChange { [weak self] row in
  67. guard let value = row.value else { return }
  68. UserDefaultsRepository.showDots.value = value
  69. // Force main screen update
  70. // guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  71. // mainScreen.updateBGGraphSettings()
  72. // tell main screen that grap needs updating
  73. if let appState = self!.appStateController {
  74. appState.chartSettingsChanged = true
  75. appState.chartSettingsChanges |= ChartSettingsChangeEnum.showDotsChanged.rawValue
  76. }
  77. }
  78. <<< SwitchRow("switchRowLines"){ row in
  79. row.title = "Display Lines"
  80. row.value = UserDefaultsRepository.showLines.value
  81. }.onChange { [weak self] row in
  82. guard let value = row.value else { return }
  83. UserDefaultsRepository.showLines.value = value
  84. // Force main screen update
  85. //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  86. //mainScreen.updateBGGraphSettings()
  87. if let appState = self!.appStateController {
  88. appState.chartSettingsChanged = true
  89. appState.chartSettingsChanges |= ChartSettingsChangeEnum.showLinesChanged.rawValue
  90. }
  91. }
  92. <<< SwitchRow("showValues"){ row in
  93. row.title = "Show Carb/Bolus Values"
  94. row.value = UserDefaultsRepository.showValues.value
  95. }.onChange { [weak self] row in
  96. guard let value = row.value else { return }
  97. UserDefaultsRepository.showValues.value = value
  98. }
  99. <<< SwitchRow("showAbsorption"){ row in
  100. row.title = "Show Carb Absorption"
  101. row.value = UserDefaultsRepository.showAbsorption.value
  102. }.onChange { [weak self] row in
  103. guard let value = row.value else { return }
  104. UserDefaultsRepository.showAbsorption.value = value
  105. }
  106. <<< SwitchRow("showDIAMarkers"){ row in
  107. row.title = "Show DIA Lines"
  108. row.value = UserDefaultsRepository.showDIALines.value
  109. }.onChange { [weak self] row in
  110. guard let value = row.value else { return }
  111. UserDefaultsRepository.showDIALines.value = value
  112. // tell main screen that graph needs updating
  113. if let appState = self!.appStateController {
  114. appState.chartSettingsChanged = true
  115. appState.chartSettingsChanges |= ChartSettingsChangeEnum.showDIALinesChanged.rawValue
  116. }
  117. }
  118. <<< SwitchRow("show30MinLine") { row in
  119. row.title = "Show -30 min line"
  120. row.value = UserDefaultsRepository.show30MinLine.value
  121. }.onChange { [weak self] row in
  122. guard let value = row.value else { return }
  123. UserDefaultsRepository.show30MinLine.value = value
  124. // Tell the main screen that graph needs updating
  125. if let appState = self!.appStateController {
  126. appState.chartSettingsChanged = true
  127. appState.chartSettingsChanges |= ChartSettingsChangeEnum.show30MinLineChanged.rawValue
  128. }
  129. }
  130. <<< SwitchRow("show90MinLine") { row in
  131. row.title = "Show -90 min line"
  132. row.value = UserDefaultsRepository.show90MinLine.value
  133. }.onChange { [weak self] row in
  134. guard let value = row.value else { return }
  135. UserDefaultsRepository.show90MinLine.value = value
  136. // Tell the main screen that graph needs updating
  137. if let appState = self!.appStateController {
  138. appState.chartSettingsChanged = true
  139. appState.chartSettingsChanges |= ChartSettingsChangeEnum.show90MinLineChanged.rawValue
  140. }
  141. }
  142. <<< SwitchRow("smallGraphTreatments"){ row in
  143. row.title = "Treatments on Small Graph"
  144. row.value = UserDefaultsRepository.smallGraphTreatments.value
  145. }.onChange { [weak self] row in
  146. guard let value = row.value else { return }
  147. UserDefaultsRepository.smallGraphTreatments.value = value
  148. }
  149. <<< StepperRow("smallGraphHeight") { row in
  150. row.title = "Small Graph Height"
  151. row.cell.stepper.stepValue = 5
  152. row.cell.stepper.minimumValue = 40
  153. row.cell.stepper.maximumValue = 80
  154. row.value = Double(UserDefaultsRepository.smallGraphHeight.value)
  155. row.displayValueFor = { value in
  156. guard let value = value else { return nil }
  157. return "\(Int(value))"
  158. }
  159. }.onChange { [weak self] row in
  160. guard let value = row.value else { return }
  161. UserDefaultsRepository.smallGraphHeight.value = Int(value)
  162. if let appState = self!.appStateController {
  163. appState.chartSettingsChanged = true
  164. appState.chartSettingsChanges |= ChartSettingsChangeEnum.smallGraphHeight.rawValue
  165. }
  166. }
  167. <<< StepperRow("predictionToLoad") { row in
  168. row.title = "Hours of Prediction"
  169. row.cell.stepper.stepValue = 0.25
  170. row.cell.stepper.minimumValue = 0.0
  171. row.cell.stepper.maximumValue = 6.0
  172. row.value = Double(UserDefaultsRepository.predictionToLoad.value)
  173. }.onChange { [weak self] row in
  174. guard let value = row.value else { return }
  175. UserDefaultsRepository.predictionToLoad.value = value
  176. }
  177. <<< StepperRow("minBGScale") { row in
  178. row.title = "Min BG Scale"
  179. row.cell.stepper.stepValue = 1
  180. row.cell.stepper.minimumValue = Double(UserDefaultsRepository.highLine.value)
  181. row.cell.stepper.maximumValue = 400
  182. row.value = Double(UserDefaultsRepository.minBGScale.value)
  183. row.displayValueFor = { value in
  184. guard let value = value else { return nil }
  185. return Localizer.toDisplayUnits(String(value))
  186. }
  187. }.onChange { [weak self] row in
  188. guard let value = row.value else { return }
  189. UserDefaultsRepository.minBGScale.value = Float(value)
  190. }
  191. <<< StepperRow("minBasalScale") { row in
  192. row.title = "Min Basal Scale"
  193. row.cell.stepper.stepValue = 0.5
  194. row.cell.stepper.minimumValue = 0.5
  195. row.cell.stepper.maximumValue = 20
  196. row.value = Double(UserDefaultsRepository.minBasalScale.value)
  197. }.onChange { [weak self] row in
  198. guard let value = row.value else { return }
  199. UserDefaultsRepository.minBasalScale.value = value
  200. }
  201. <<< StepperRow("lowLine") { row in
  202. row.title = "Low BG Display Value"
  203. row.cell.stepper.stepValue = 1
  204. row.cell.stepper.minimumValue = 40
  205. row.cell.stepper.maximumValue = 120
  206. row.value = Double(UserDefaultsRepository.lowLine.value)
  207. row.displayValueFor = { value in
  208. guard let value = value else { return nil }
  209. return Localizer.toDisplayUnits(String(value))
  210. }
  211. }.onChange { [weak self] row in
  212. guard let value = row.value else { return }
  213. UserDefaultsRepository.lowLine.value = Float(value)
  214. // Force main screen update
  215. //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  216. //mainScreen.updateBGGraphSettings()
  217. // tell main screen to update
  218. if let appState = self!.appStateController {
  219. appState.chartSettingsChanged = true
  220. appState.chartSettingsChanges |= ChartSettingsChangeEnum.lowLineChanged.rawValue
  221. }
  222. }
  223. <<< StepperRow("highLine") { row in
  224. row.title = "High BG Display Value"
  225. row.cell.stepper.stepValue = 1
  226. row.cell.stepper.minimumValue = 120
  227. row.cell.stepper.maximumValue = 400
  228. row.value = Double(UserDefaultsRepository.highLine.value)
  229. row.displayValueFor = { value in
  230. guard let value = value else { return nil }
  231. return Localizer.toDisplayUnits(String(value))
  232. }
  233. }.onChange { [weak self] row in
  234. guard let value = row.value else { return }
  235. UserDefaultsRepository.highLine.value = Float(value)
  236. // Force main screen update
  237. //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  238. //mainScreen.updateBGGraphSettings()
  239. // let app state know of the change
  240. if let appState = self!.appStateController {
  241. appState.chartSettingsChanged = true
  242. appState.chartSettingsChanges |= ChartSettingsChangeEnum.highLineChanged.rawValue
  243. }
  244. }
  245. <<< StepperRow("downloadDays") { row in
  246. // NS supports up to 4 days
  247. row.title = "Show Days Back"
  248. row.cell.stepper.stepValue = 1
  249. row.cell.stepper.minimumValue = 1
  250. row.cell.stepper.maximumValue = 4
  251. row.value = Double(UserDefaultsRepository.downloadDays.value)
  252. row.displayValueFor = { value in
  253. guard let value = value else { return nil }
  254. return "\(Int(value))"
  255. }
  256. }.onChange { [weak self] row in
  257. guard let value = row.value else { return }
  258. UserDefaultsRepository.downloadDays.value = Int(value)
  259. }
  260. <<< SwitchRow("showMidnightMarkers"){ row in
  261. row.title = "Show Midnight Lines"
  262. row.value = UserDefaultsRepository.showMidnightLines.value
  263. }.onChange { [weak self] row in
  264. guard let value = row.value else { return }
  265. UserDefaultsRepository.showMidnightLines.value = value
  266. // tell main screen that graph needs updating
  267. if let appState = self!.appStateController {
  268. appState.chartSettingsChanged = true
  269. appState.chartSettingsChanges |= ChartSettingsChangeEnum.showMidnightLinesChanged.rawValue
  270. }
  271. }
  272. +++ ButtonRow() {
  273. $0.title = "DONE"
  274. }.onCellSelection { (row, arg) in
  275. self.dismiss(animated:true, completion: nil)
  276. }
  277. }
  278. }