PreferencesEditorViewModel.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. import Foundation
  2. import SwiftUI
  3. extension PreferencesEditor {
  4. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject,
  5. PreferencesSettable where Provider: PreferencesEditorProvider
  6. {
  7. @Injected() var settingsManager: SettingsManager!
  8. private(set) var preferences = Preferences()
  9. @Published var unitsIndex = 1
  10. @Published var allowAnnouncements = false
  11. @Published var decimalFields: [Field<Decimal>] = []
  12. @Published var boolFields: [Field<Bool>] = []
  13. @Published var insulinCirveField = Field<InsulinCurve>(
  14. displayName: "Insulin curve",
  15. keypath: \.curve,
  16. value: .rapidActing
  17. )
  18. override func subscribe() {
  19. preferences = provider.preferences
  20. unitsIndex = settingsManager.settings.units == .mgdL ? 0 : 1
  21. allowAnnouncements = settingsManager.settings.allowAnnouncements
  22. insulinCirveField.value = preferences.curve
  23. insulinCirveField.settable = self
  24. $unitsIndex
  25. .sink { [weak self] index in
  26. self?.settingsManager.settings.units = index == 0 ? .mgdL : .mmolL
  27. }
  28. .store(in: &lifetime)
  29. $allowAnnouncements
  30. .sink { [weak self] allow in
  31. self?.settingsManager.settings.allowAnnouncements = allow
  32. }
  33. .store(in: &lifetime)
  34. boolFields = [
  35. Field(
  36. displayName: "Rewind Resets Autosens",
  37. keypath: \.rewindResetsAutosens,
  38. value: preferences.rewindResetsAutosens,
  39. settable: self
  40. ),
  41. Field(
  42. displayName: "High Temptarget Raises Sensitivity",
  43. keypath: \.highTemptargetRaisesSensitivity,
  44. value: preferences.highTemptargetRaisesSensitivity,
  45. settable: self
  46. ),
  47. Field(
  48. displayName: "Low Temptarget Lowers Sensitivity",
  49. keypath: \.lowTemptargetLowersSensitivity,
  50. value: preferences.lowTemptargetLowersSensitivity,
  51. settable: self
  52. ),
  53. Field(
  54. displayName: "Sensitivity Raises Target",
  55. keypath: \.sensitivityRaisesTarget,
  56. value: preferences.sensitivityRaisesTarget,
  57. settable: self
  58. ),
  59. Field(
  60. displayName: "Resistance Lowers Target",
  61. keypath: \.resistanceLowersTarget,
  62. value: preferences.resistanceLowersTarget,
  63. settable: self
  64. ),
  65. Field(
  66. displayName: "Exercise Mode",
  67. keypath: \.exerciseMode,
  68. value: preferences.exerciseMode,
  69. settable: self
  70. ),
  71. Field(
  72. displayName: "Wide BG Target Range",
  73. keypath: \.wideBGTargetRange,
  74. value: preferences.wideBGTargetRange,
  75. settable: self
  76. ),
  77. Field(
  78. displayName: "Skip Neutral Temps",
  79. keypath: \.skipNeutralTemps,
  80. value: preferences.skipNeutralTemps,
  81. settable: self
  82. ),
  83. Field(
  84. displayName: "Unsuspend If No Temp",
  85. keypath: \.unsuspendIfNoTemp,
  86. value: preferences.unsuspendIfNoTemp,
  87. settable: self
  88. ),
  89. Field(
  90. displayName: "Enable UAM",
  91. keypath: \.enableUAM,
  92. value: preferences.enableUAM,
  93. settable: self
  94. ),
  95. Field(
  96. displayName: "A52 Risk Enable",
  97. keypath: \.a52RiskEnable,
  98. value: preferences.a52RiskEnable,
  99. settable: self
  100. ),
  101. Field(
  102. displayName: "Enable SMB With COB",
  103. keypath: \.enableSMBWithCOB,
  104. value: preferences.enableSMBWithCOB,
  105. settable: self
  106. ),
  107. Field(
  108. displayName: "Enable SMB With Temptarget",
  109. keypath: \.enableSMBWithTemptarget,
  110. value: preferences.enableSMBWithTemptarget,
  111. settable: self
  112. ),
  113. Field(
  114. displayName: "Enable SMB Always",
  115. keypath: \.enableSMBAlways,
  116. value: preferences.enableSMBAlways,
  117. settable: self
  118. ),
  119. Field(
  120. displayName: "Enable SMB After Carbs",
  121. keypath: \.enableSMBAfterCarbs,
  122. value: preferences.enableSMBAfterCarbs,
  123. settable: self
  124. ),
  125. Field(
  126. displayName: "Allow SMB With High Temptarget",
  127. keypath: \.allowSMBWithHighTemptarget,
  128. value: preferences.allowSMBWithHighTemptarget,
  129. settable: self
  130. ),
  131. Field(
  132. displayName: "Use Custom Peak Time",
  133. keypath: \.useCustomPeakTime,
  134. value: preferences.useCustomPeakTime,
  135. settable: self
  136. ),
  137. Field(
  138. displayName: "Suspend Zeros IOB",
  139. keypath: \.suspendZerosIOB,
  140. value: preferences.suspendZerosIOB,
  141. settable: self
  142. )
  143. ]
  144. decimalFields = [
  145. Field(
  146. displayName: "Max IOB",
  147. keypath: \.maxIOB,
  148. value: preferences.maxIOB,
  149. settable: self
  150. ),
  151. Field(
  152. displayName: "Max Daily Safety Multiplier",
  153. keypath: \.maxDailySafetyMultiplier,
  154. value: preferences.maxDailySafetyMultiplier,
  155. settable: self
  156. ),
  157. Field(
  158. displayName: "Current Basal Safety Multiplier",
  159. keypath: \.currentBasalSafetyMultiplier,
  160. value: preferences.currentBasalSafetyMultiplier,
  161. settable: self
  162. ),
  163. Field(
  164. displayName: "Autosens Max",
  165. keypath: \.autosensMax,
  166. value: preferences.autosensMax,
  167. settable: self
  168. ),
  169. Field(
  170. displayName: "Autosens Min",
  171. keypath: \.autosensMin,
  172. value: preferences.autosensMin,
  173. settable: self
  174. ),
  175. Field(
  176. displayName: "Half Basal Exercise Target",
  177. keypath: \.halfBasalExerciseTarget,
  178. value: preferences.halfBasalExerciseTarget,
  179. settable: self
  180. ),
  181. Field(
  182. displayName: "Max COB",
  183. keypath: \.maxCOB,
  184. value: preferences.maxCOB,
  185. settable: self
  186. ),
  187. Field(
  188. displayName: "Bolus Snooze DIA Divisor",
  189. keypath: \.bolusSnoozeDIADivisor,
  190. value: preferences.bolusSnoozeDIADivisor,
  191. settable: self
  192. ),
  193. Field(
  194. displayName: "Min 5m Carbimpact",
  195. keypath: \.min5mCarbimpact,
  196. value: preferences.min5mCarbimpact,
  197. settable: self
  198. ),
  199. Field(
  200. displayName: "Autotune ISF Adjustment Fraction",
  201. keypath: \.autotuneISFAdjustmentFraction,
  202. value: preferences.autotuneISFAdjustmentFraction,
  203. settable: self
  204. ),
  205. Field(
  206. displayName: "Remaining Carbs Fraction",
  207. keypath: \.remainingCarbsFraction,
  208. value: preferences.remainingCarbsFraction,
  209. settable: self
  210. ),
  211. Field(
  212. displayName: "Remaining Carbs Cap",
  213. keypath: \.remainingCarbsCap,
  214. value: preferences.remainingCarbsCap,
  215. settable: self
  216. ),
  217. Field(
  218. displayName: "Max SMB Basal Minutes",
  219. keypath: \.maxSMBBasalMinutes,
  220. value: preferences.maxSMBBasalMinutes,
  221. settable: self
  222. ),
  223. Field(
  224. displayName: "Max UAM SMB Basal Minutes",
  225. keypath: \.maxUAMSMBBasalMinutes,
  226. value: preferences.maxUAMSMBBasalMinutes,
  227. settable: self
  228. ),
  229. Field(
  230. displayName: "SMB Interval",
  231. keypath: \.smbInterval,
  232. value: preferences.smbInterval,
  233. settable: self
  234. ),
  235. Field(
  236. displayName: "Bolus Increment",
  237. keypath: \.bolusIncrement,
  238. value: preferences.bolusIncrement,
  239. settable: self
  240. ),
  241. Field(
  242. displayName: "Insulin Peak Time",
  243. keypath: \.insulinPeakTime,
  244. value: preferences.insulinPeakTime,
  245. settable: self
  246. ),
  247. Field(
  248. displayName: "Carbs Req Threshold",
  249. keypath: \.carbsReqThreshold,
  250. value: preferences.carbsReqThreshold,
  251. settable: self
  252. ),
  253. Field(
  254. displayName: "Noisy CGM Target Multiplier",
  255. keypath: \.noisyCGMTargetMultiplier,
  256. value: preferences.noisyCGMTargetMultiplier,
  257. settable: self
  258. )
  259. ]
  260. }
  261. func onSet<T>(_ keypath: WritableKeyPath<Preferences, T>, value: T) {
  262. preferences[keyPath: keypath] = value
  263. save()
  264. }
  265. func save() {
  266. provider.savePreferences(preferences)
  267. }
  268. }
  269. }